【问题标题】:Search Item in RecyclerviewMergeAdapter with different adapter in one recyclerview在 RecyclerviewMergeAdapter 中使用不同适配器在一个 recyclerview 中搜索项目
【发布时间】:2019-02-13 03:59:26
【问题描述】:

我在这里有一些使用插件 RecyclerViewMergeAdapater 的代码 https://github.com/martijnvdwoude/recycler-view-merge-adapter... 然后我想在其中创建搜索功能,但它不能同时工作,只有一个适配器工作,否则适配器不工作......

这是我的代码

@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 适配器的结果正常... 有人用过吗?

【问题讨论】:

  • 什么是 containsAdapter
  • 我有这方面的经验,因为在 RecyclerViewMergeAdapter 的文档中,有一个函数包含适配器...实际上那是行不通的...有效的方法是inviteAdapter.getFilter().filter(newText );以及在另一个适配器中搜索

标签: java android-studio search android-recyclerview


【解决方案1】:

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

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

    private val internalAdapterRegistry = mutableMapOf()

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

    数据类 Product(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 存储在单独的变量中。我没有在这里实现它。只是想告诉你如何玩这个。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多