当前位置: 代码迷 >> java >> 在 RecyclerviewMergeAdapter 中搜索项目,在一个 recyclerview 中使用不同的适配器
  详细解决方案

在 RecyclerviewMergeAdapter 中搜索项目,在一个 recyclerview 中使用不同的适配器

热度:99   发布时间:2023-07-27 09:46:43.0

我在这里有一些使用插件 RecyclerViewMergeAdapater 的代码......然后我想在其中使用搜索功能,但它不能同时工作,只有一个适配器工作,否则适配器不工作...

这是我的代码

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_new_chat, menu);
    MenuItem menuItem = menu.findItem(R.id.menu_item_search);
    SearchView searchView = (SearchView) menuItem.getActionView();

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            if (!newText.trim().isEmpty()) {
                RealmResults<User> users = RealmHelper.getInstance().searchForUser(newText, false);
                mergeAdapter.containsAdapter(new UsersAdapter(users, true, NewChatActivity.this));
                rvNewChat.setAdapter(mergeAdapter);
            } else {
                mergeAdapter.containsAdapter(new UsersAdapter(userList, true, NewChatActivity.this));
                rvNewChat.setAdapter(mergeAdapter);
            }

            inviteAdapter.getFilter().filter(newText);

            return false;
        }

    });

我希望搜索 2 适配器的结果正常工作...有人使用过它吗?

如果您想将搜索结果应用于您的 MergeAdapter,我将遍历您添加到 MergeAdapter 的适配器列表并过滤出符合您条件的项目。 过滤掉这些项目后,您可以将它们提交回适配器。

  1. 在下面的示例中,我将它们存储在名为internalAdapterRegistry的映射中。

    private val internalAdapterRegistry = mutableMapOf<String, YourAdapter>()

  2. 假设我们正在产品列表(您的自定义数据类)中寻找匹配项:

    数据类产品(var product_name: String, var product_quantity: Int)

     override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater.inflate(R.menu.your_menu, menu)

        val searchItem = menu.findItem(R.id.action_search)
        val searchView = searchItem?.actionView as SearchView

        searchView.findViewById<AutoCompleteTextView>(R.id.search_src_text).threshold = 3
        searchView.imeOptions = EditorInfo.IME_ACTION_DONE

        searchView.setOnQueryTextListener(object :
            SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                return false
            }
            override fun onQueryTextChange(newText: String): Boolean {
                fun filter(text: String) {
                    val textSearch = text.toLowerCase()
                    if (textSearch.isNotEmpty()){
                        for (adapter in internalAdapterRegistry) {
                            val listOfYourItems = adapter.value.currentList
                            adapter.value.submitList(listOfYourItems.filter { product -> product.product_name.contains(textSearch, ignoreCase = true) })
                        }
                    }
                }
                filter(newText)
                return false
            }
        })

  1. 如果要在从搜索栏中删除字符时使其工作,则需要将currentList存储在单独的变量中。 我没有在这里实现它。 只是想让你知道如何玩这个。
  相关解决方案