为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用SearchView筛选回收视图

如何使用SearchView筛选回收视图

PIPIONE 2019-06-15 18:25:05
如何使用SearchView筛选回收视图我正在尝试实现SearchView从支援图书馆。我希望用户使用SearchView若要过滤List一部电影RecyclerView.到目前为止,我已经学习了一些教程,并添加了SearchView到ActionBar,但我不知道从这里往哪里走。我已经看到了一些例子,但它们都没有显示结果,当你开始打字。这是我的MainActivity:public class MainActivity extends ActionBarActivity {     RecyclerView mRecyclerView;     RecyclerView.LayoutManager mLayoutManager;     RecyclerView.Adapter mAdapter;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_recycler_view);         mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);         mRecyclerView.setHasFixedSize(true);         mLayoutManager = new LinearLayoutManager(this);         mRecyclerView.setLayoutManager(mLayoutManager);         mAdapter = new CardAdapter() {             @Override             public Filter getFilter() {                 return null;             }         };         mRecyclerView.setAdapter(mAdapter);     }     @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);         SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);         SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();         searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));         return true;     }     @Override     public boolean onOptionsItemSelected(MenuItem item) {         // Handle action bar item clicks here. The action bar will         // automatically handle clicks on the Home/Up button, so long         // as you specify a parent activity in AndroidManifest.xml.         int id = item.getItemId();         //noinspection SimplifiableIfStatement         if (id == R.id.action_settings) {             return true;         }         return super.onOptionsItemSelected(item);     }}
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

你所需要做的就是添加filter方法RecyclerView.Adapter:

public void filter(String text) {
    items.clear();
    if(text.isEmpty()){
        items.addAll(itemsCopy);
    } else{
        text = text.toLowerCase();
        for(PhoneBookItem item: itemsCopy){
            if(item.name.toLowerCase().contains(text) || item.phone.toLowerCase().contains(text)){
                items.add(item);
            }
        }
    }
    notifyDataSetChanged();}

itemsCopy在适配器的构造函数中初始化,如下所示itemsCopy.addAll(items).

如果你这样做了,就打电话filter从…OnQueryTextListener:

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

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

这是按姓名和电话号码过滤我的电话簿的一个例子。


查看完整回答
反对 回复 2019-06-15
?
暮色呼如

TA贡献1853条经验 获得超9个赞

在@shrudiKamoji下面以一种更干净的方式,我们可以使用一个可过滤的,它的意思是:

public abstract class GenericRecycleAdapter<E> extends RecyclerView.Adapter implements Filterable{
    protected List<E> list;
    protected List<E> originalList;
    protected Context context;

    public GenericRecycleAdapter(Context context,
    List<E> list)
    {
        this.originalList = list;
        this.list = list;
        this.context = context;
    }

    ...

    @Override
    public Filter getFilter() {
        return new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                list = (List<E>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                List<E> filteredResults = null;
                if (constraint.length() == 0) {
                    filteredResults = originalList;
                } else {
                    filteredResults = getFilteredResults(constraint.toString().toLowerCase());
                }

                FilterResults results = new FilterResults();
                results.values = filteredResults;

                return results;
            }
        };
    }

    protected List<E> getFilteredResults(String constraint) {
        List<E> results = new ArrayList<>();

        for (E item : originalList) {
            if (item.getName().toLowerCase().contains(constraint)) {
                results.add(item);
            }
        }
        return results;
    }}

这里的E是泛型类型,您可以使用类扩展它:

public class customerAdapter extends GenericRecycleAdapter<CustomerModel>

或者将E改为您想要的类型(<CustomerModel>例如)

然后从searchView(可以放在menu.xml上的小部件):

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

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


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 447 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信