繁体   English   中英

Android recyclerview 搜索过滤器不起作用

[英]Android recyclerview search filter not working

更新数据但不更改。 原因是什么? 我尝试了很多方法,但都没有奏效。 无论我写什么,结果都不会改变。 名单还是一样的。 我在哪里做错了? 我确定适配器已更新。 因为我查过了。 问题一定是别的。

搜索过滤器

主要活动

 @Override
public boolean onCreateOptionsMenu(final Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.app_bar_search).getActionView();
    searchView.setQueryHint("Search Customer");
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            mAdapter.getFilter().filter(newText);
            return true;
        }
    });

    return true;
}

适配器

 PlaylistAdapter(Context c,List<M3UItem> list) {
        mContext = c;
        mInflater = LayoutInflater.from(mContext);
        this.mItem = list;
        this.list = list;
}

 @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    list = mItem;
                } else {
                    List<M3UItem> filteredList = new ArrayList<>();
                    for (M3UItem row : filteredList) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getItemName().toLowerCase().contains(charString.toLowerCase()) ) {
                            filteredList.add(row);

                        }
                    }

                    list = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = list;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                list = (ArrayList<M3UItem>) filterResults.values;

              notifyDataSetChanged();
                // refresh the list with filtered data

            }
        };
    }

编辑:

onBindViewHolder

@Override
    public void onBindViewHolder(final ItemHolder holder, final int position) {
        final M3UItem item = mItem.get(position);
        if (item != null) {
            holder.update(item);
        }
    }

İtemHolder 更新

void update(M3UItem item) {


        try {
            name.setText(item.getItemName());
            int color = generator.getRandomColor();
            if (item.getItemIcon().isEmpty()) {
                textDrawable = TextDrawable.builder()
                        .buildRoundRect(String.valueOf(item.getItemName().charAt(0)), color, 100);
                cImg.setImageDrawable(textDrawable);
            } else {
                if (Utils.getInstance().isNetworkAvailable(mContext)) {
                    Glide.with(mContext).load(item.getItemIcon()).into(cImg);
                } else {
                    textDrawable = TextDrawable.builder()
                            .buildRoundRect(String.valueOf(item.getItemName().charAt(0)), color, 100);
                    cImg.setImageDrawable(textDrawable);
                }
            }

        } catch (Exception ignored) {
        }

    }

MainActivity 加载项:

 @Override
    protected Boolean doInBackground(String... strings) {
        try { //new FileInputStream (new File(name)

            is = new FileInputStream(new File(strings[0])); // if u r trying to open file from asstes InputStream is = getassets.open(); InputStream
            final M3UPlaylist playlist = parser.parseFile(is);


            runOnUiThread(new Runnable() {

                @Override
                public void run() {

                    // Stuff that updates the UI
                    mAdapter.update(playlist.getPlaylistItems());
                    mAdapter.notifyDataSetChanged();
                }
            });


            return true;
        } catch (Exception e) {
            Log.d("Google2", "_loadFile: " + e.toString());
            return false;
        }
    }

问题在于您的 onBindViewHolder 和 getItemCount 尝试在您的适配器 class 中进行此更改

@Override
    public void onBindViewHolder(final ItemHolder holder, final int position) {
        final M3UItem item = list.get(position);
        if (item != null) {
            holder.update(item);
        }
    }

@Override
    public int getItemCount() {
        return list.size();
    }

您还需要更改过滤器代码并像这样修改它

List<M3UItem> filteredList = new ArrayList<>();
                    for (M3UItem row : mItem) {

                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getItemName().toLowerCase().contains(charString.toLowerCase()) ) {
                            filteredList.add(row);

                        }
                    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM