繁体   English   中英

过滤导致两个列表都删除它们的项目 - Android RecyclerView 过滤 Java

[英]Filtering causes both lists to delete their Items - Android RecyclerView Filtering Java

所以我想做的只是根据 searchString 过滤我的所有条目。 这工作正常但出于某种原因每次我过滤两个列表都会删除项目。 我只会在这里包括(我认为)重要的代码部分。

适配器.java:

@Override
    public Filter getFilter() {
        return myFilter;
    }

    private Filter myFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Stellplatz> filteredList = new ArrayList<>();
            Log.d("TEst","Size stellplaetzeall:"+ stellplaetzeall.size());

            Log.d("TEst","Size Stellplaeztze:"+ stellplaetze.size());

            if (constraint == null || constraint.length() == 0) {
                filteredList.addAll(stellplaetzeall);
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim();
                for (Stellplatz item : stellplaetzeall) {
                    if (item.getAnbieter().toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            stellplaetze.clear();
            stellplaetze.addAll((ArrayList) results.values);
            notifyDataSetChanged();
        }
    };

片段.java

@Override
     public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater){
        inflater.inflate(R.menu.menu_itemlist, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
     }

我不明白为什么会这样。 我发现的每个示例都与我的代码基本相同,但由于某种原因它发生了。 我真的很感激任何能帮助我理解这一点的答案。 我也不太擅长 android 编程,第一次这样做所以解释为什么会很有帮助!

在发布结果时,您正在清除列表,我认为这是错误的:

 @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        //stellplaetze.clear();
        stellplaetze.addAll((ArrayList) results.values);
        notifyDataSetChanged();
    }

我有一个代码示例,我认为这会有所帮助:

首先我创建 2 个列表:

private ArrayList<CountryPhone> objects;
private ArrayList<CountryPhone> filteredData;

 @Override
public int getCount() {
    return filteredData.size();
}

@Nullable
@Override
public CountryPhone getItem(int position) {
    return filteredData.get(position);
}

关于过滤结果:

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        String filterString = constraint.toString().toLowerCase();
        FilterResults filterResults = new FilterResults();
        ArrayList<CountryPhone> filterlist = new ArrayList<>();

            String name, code;
            for (int i = 0; i < objects.size(); i++) {
                CountryPhone item = objects.get(i);
                name = item.getName().toLowerCase();

                code = item.getCode();

                if (name.contains(filterString) || code.contains(filterString)){
                    filterlist.add(item);
                }
            }

            filterResults.values = filterlist;
            filterResults.count = filterlist.size();

        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        filteredData = (ArrayList<CountryPhone>) results.values;

            notifyDataSetChanged();

    }

};

暂无
暂无

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

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