使用 Room 和 RecyclerView 在 SearchView 中添加过滤器

Posted

技术标签:

【中文标题】使用 Room 和 RecyclerView 在 SearchView 中添加过滤器【英文标题】:Add Filter in SearchView with Room and RecyleView 【发布时间】:2019-04-11 00:12:48 【问题描述】:

(谷歌翻译)

简介: 我已经搜索过这个解决方案,但没有找到。如果有此问题的重复,请告诉我。谢谢。

问题: 我使用 Room 数据库和 RecycleView 创建了一个存储应用程序。然后我寻找将搜索添加到我的数据的方法。一切都很顺利,但有一个问题。 如果减少搜索词,则搜索仅限于可见数据。 (看截图)

    Normal Search is done (Normal) Empty word Search again and The result GIF Image

希望你能理解。 请帮我。我看过很多教程,但没有任何效果。

谢谢

我的代码: 在我的适配器

中过滤
public Filter getFilter() 
        return new Filter() 
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) 
                String charString = charSequence.toString();
                List<Barang> filteredList = new ArrayList<>();
                if (charString.isEmpty()) 
                    filteredList.addAll(namaBarang);
                 else 
                    for (Barang row : namaBarang) 

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

                

                FilterResults filterResults = new FilterResults();
                filterResults.values = filteredList;
                return filterResults;
            

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) 
                namaBarang = (ArrayList<Barang>) filterResults.values;
                notifyDataSetChanged();
            
        ;
    

MainActivity

   @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        final MenuItem searchItem = menu.findItem(R.id.action_search);
        final SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setOnQueryTextListener(this);
        return true;
    

        @Override
        public boolean onQueryTextSubmit(String query) 
            adapter.getFilter().filter(query);
            return false;
        

        @Override
        public boolean onQueryTextChange(String newText) 
         //   t = newText.;

            adapter.getFilter().filter(newText);
            return false;
        

我的适配器中也有这个:

void setBarangs(List<Barang> barangs)
    namaBarang = barangs;
    notifyDataSetChanged();

【问题讨论】:

【参考方案1】:

我的问题已经解决了:

@Override
public Filter getFilter() 
    return new Filter() 
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) 
            String charString = charSequence.toString();
            List<Barang> listHasilFilter = new ArrayList<>();
            List<Barang> listYgAkandiFilter = new ArrayList<>();
            listYgAkandiFilter.addAll(namaBarangC);
            if (charString.isEmpty()) 
                listHasilFilter = listYgAkandiFilter;

            //    namaBarang = listYgAkandiFilter;
                Log.d(TAG, "" + namaBarang.size());
             else 
                for (Barang row : namaBarangC) 

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

            

            FilterResults hasilFilter = new FilterResults();
            hasilFilter.values = listHasilFilter;
            return hasilFilter;
        

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults hasilFilter) 
            namaBarang = (ArrayList<Barang>) hasilFilter.values;
            notifyDataSetChanged();
        
    ;

谢谢

【讨论】:

以上是关于使用 Room 和 RecyclerView 在 SearchView 中添加过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Android使用Room操作SQLite数据库让其变得无比高效和简洁(进一步完善用RecyclerView显示数据库中的数据)

如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview

Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

Android Room LiveData观察器未更新

如何使用 Android Room 从数据库中获取一行? [复制]

Android jetpack的Paging和Room结合使用