简体   繁体   English

如何在搜索视图中更新列表

[英]How to update the list in a Search View

I have an issue , when i search an item in a search view then i am able to search the item(Object) but when i clear the text (say cancel the search,when no text is there) the list is showing the same object which i searched before , not showing all the object after the cancel. 我有一个问题,当我在搜索视图中搜索项目时,便可以搜索该项目(对象),但是当我清除文本时(例如,取消搜索,如果没有文本),列表显示的是同一对象我之前搜索过的内容,取消后未显示所有对象。

I tried : 我试过了 :

Adapter Class: 适配器类别:

public void animateTo(List<OrderPogo> models) {
        applyAndAnimateRemovals(models);
        applyAndAnimateAdditions(models);
        applyAndAnimateMovedItems(models);

    }

    private void applyAndAnimateRemovals(List<OrderPogo> newModels) {

        for (int i = items.size() - 1; i >= 0; i--) {
            final OrderPogo model = items.get(i);
            if (!newModels.contains(model)) {
                removeItem(i);
            }
        }
    }

    private void applyAndAnimateAdditions(List<OrderPogo> newModels) {

        for (int i = 0, count = newModels.size(); i < count; i++) {
            final OrderPogo model = newModels.get(i);
            if (!items.contains(model)) {
                addItem(i, model);
            }
        }
    }

    private void applyAndAnimateMovedItems(List<OrderPogo> newModels) {

        for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) {
            final OrderPogo model = newModels.get(toPosition);
            final int fromPosition = items.indexOf(model);
            if (fromPosition >= 0 && fromPosition != toPosition) {
                moveItem(fromPosition, toPosition);
            }
        }
    }

    public OrderPogo removeItem(int position) {
        final OrderPogo model = items.remove(position);
        notifyItemRemoved(position);
        return model;
    }

    public void addItem(int position, OrderPogo model) {
        items.add(position, model);
        notifyItemInserted(position);
    }

    public void moveItem(int fromPosition, int toPosition) {
        final OrderPogo model = items.remove(fromPosition);
        items.add(toPosition, model);
        notifyItemMoved(fromPosition, toPosition);
    }

    public class CustomFilter extends Filter {
        ArrayList<OrderPogo> arrayList;
        MaterialRecylerAdapter adapter;
        ArrayList<OrderPogo> filterArrayList;

        public CustomFilter(ArrayList<OrderPogo> arrayList, MaterialRecylerAdapter adapter) {
            this.arrayList = arrayList;
            this.adapter = adapter;
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            if(filterArrayList!=null && filterArrayList.size()>0){
                Log.e("filterArrayList",""+filterArrayList.size());
             //   filterArrayList.addAll(arrayList);
            }


            FilterResults filterResults=new FilterResults();
            if(constraint!=null && constraint.length()>0){
                constraint=constraint.toString().toUpperCase();
                for(int i=0;i<arrayList.size();i++){
                    if(arrayList.get(i).getId().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }else if(arrayList.get(i).getLoadingLocation().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }else if(arrayList.get(i).getUnloadingLocation().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }else if(arrayList.get(i).getTruckNumberLrNmbr().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }else if(arrayList.get(i).getDistance().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }else if(arrayList.get(i).getDate().toUpperCase().contains(constraint)){
                        filterArrayList.add(arrayList.get(i));
                    }

                }
                filterResults.values = filterArrayList;
                filterResults.count = filterArrayList.size();


            }else{
                filterResults.values = items;
                filterResults.count = items.size();
              //  filterArrayList.addAll(arrayList);
//                filterResults.count= arrayList.size();
//                filterResults.values=arrayList;
            }

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //Here i want the arraylist from the recylerview without making the arraylist static

            items= (List<OrderPogo>) results.values;
             notifyDataSetChanged();
        }
    }

Fragment Class Containing SearchView: 包含SearchView的片段类:

@Override
            public boolean onQueryTextChange(String newText) {

                if(TextUtils.isEmpty(newText)){
                    try{
                        materialRecylerAdapter.getFilter().filter("");
                        Log.i("Nomad", "onQueryTextChange Empty String");
//                        placesListView.clearTextFilter();
//                        materialRecylerAdapter = new MaterialRecylerAdapter(getActivity(), (ArrayList<OrderPogo>) myOrderArrayList,nextFragmentFlag,"default");
//                        materialRecylerAdapter.notifyDataSetChanged();
                      //  materialRecylerAdapter.getFilter().filter(newText);
                    }catch(Exception e){

                    }

                }else{
                   // materialRecylerAdapter.getFilter().filter(newText.toString());
                    final List<OrderPogo> filteredModelList = filter(myOrderArrayList, newText);
                    materialRecylerAdapter.animateTo(filteredModelList);
                    recyclerView.scrollToPosition(0);
                }

                return true;
            }
        });

Filter Method in Fragment: 片段中的过滤方法:

private List<OrderPogo> filter(List<OrderPogo> models, String query) {
        query = query.toLowerCase();

        final List<OrderPogo> filteredModelList = new ArrayList<>();
        for (OrderPogo model : models) {
            final String text = model.getId().toLowerCase();
            final String text1 = model.getLoadingLocation().toLowerCase();
            final String text2 = model.getUnloadingLocation().toLowerCase();
            final String text3= model.getDistance().toLowerCase();
            if (text.contains(query)) {
                filteredModelList.add(model);
            }else if(text1.contains(query)){
                filteredModelList.add(model);
            }else if(text2.contains(query)){
                filteredModelList.add(model);
            }else if(text3.contains(query)){
                filteredModelList.add(model);
            }
        }
        return filteredModelList;
    }

You just have to add a check for the empty field in the search bar. 您只需要在搜索栏中添加对空白字段的检查即可。 When the query is empty then add all the elements back in the list and notify for the data set change. 如果查询为空,则将所有元素重新添加到列表中,并通知数据集更改。

        @Override
        public boolean onQueryTextChange(String newText) {
            initList(); //reset data at the start
            if (newText.equals(""))
                initList(); //reset data when there is no query
            ...

The initList method will initialize all the list items and the adapter is linked to it. initList方法将初始化所有列表项,并将适配器链接到该列表项。 Do the notifyDataSetChanged at the end of the onQueryTextChange method to notify the adapter about the changed data set after each and every change in the search query. onQueryTextChange方法的末尾执行notifyDataSetChanged ,以在搜索查询中的每一次更改之后向适配器通知已更改的数据集。

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

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