【问题标题】:Trouble Using Edit Search Function in Recycler View with Cards在带有卡片的回收站视图中使用编辑搜索功能时遇到问题
【发布时间】:2020-01-29 10:48:38
【问题描述】:

我正在尝试通过允许用户搜索来搜索带有卡片的回收站视图。当用户搜索时,卡片应该根据用户输入的字符“重新组织”显示。我曾尝试这样做,但在这样做时遇到了问题。任何帮助表示赞赏。

MainActivity.kt

class MainActivity : AppCompatActivity(), BottomSheetRecyclerViewAdapter.ListTappedListener {
    private var customAdapter: CustomAdapter? = null
    private var arrayListModel = ArrayList<Model>()
    private lateinit var bottomSheetBehavior: CustomBottomSheetBehavior<ConstraintLayout>
    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val modelList = readFromAsset()
        val adapterList = CustomAdapter(modelList, this)
        customAdapter = CustomAdapter(arrayListModel, this@MainActivity)

        bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout) as CustomBottomSheetBehavior

        recyclerView.adapter = adapterList
        recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)

        et_search.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {

            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                if (!s.isNullOrEmpty()) {
                    val searchList = ArrayList<Model>()
                    for (i in arrayListModel.indices) {
                        if (arrayListModel[i].name.toLowerCase().contains(s)) {
                            searchList.add(arrayListModel[i])
                        }
                    }
                    try {
                        customAdapter?.notifyDataSetChanged()
                        recyclerView.adapter = CustomAdapter(searchList, this@MainActivity)
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                } else {
                    customAdapter?.notifyDataSetChanged()
                    recyclerView.adapter = customAdapter
                }
            }
        })
    }

    override fun onClickList(text: String) {
    }

    private fun readFromAsset(): List<Model> {

        val modeList = mutableListOf<Model>()
        val bufferReader = application.assets.open("android_version.json").bufferedReader()
        val json_string = bufferReader.use {
            it.readText()
        }

        val jsonArray = JSONArray(json_string);
        for (i in 0..jsonArray.length() - 1) {
            val jsonObject: JSONObject = jsonArray.getJSONObject(i)
            val model = Model(jsonObject.getString("name"), jsonObject.getString("version"))
            modeList.add(model)
        }
        return modeList
    }
}

【问题讨论】:

  • 代码看起来不错。您何时何地遇到问题?
  • 感谢您的回复-当我搜索时,没有任何显示。例如,我的卡片包含“Store”之类的内容,因此当我输入“s”时,应该会显示带有“s”的卡片,例如“Store”,但没有显示卡片。
  • 替换此arrayListModel[i].name.contains(s,true) 并添加此行if condition `Log.e("name",arrayListModel[i].name) .check log 你找到了多少结果。
  • 在与名称比较时将 CharSequence 转换为字符串。即,s.toString
  • @frankenstein 我试着把它放进去,但仍然没有卡片出现。 log.e 中也没有显示任何内容。

标签: android kotlin android-recyclerview android-search


【解决方案1】:

我可能发现了你的问题。在这里,您获取数据val modelList = readFromAsset(),但您从未将数据分配给您的问题的arrayListModel

将数据分配给arrayListModel

  val modelList = readFromAsset()
  arrayListModel=modelList 

【讨论】:

  • 很好——这解决了当我退格但什么都没有显示时的问题——现在,当我退格整个东西时,卡片都显示了,但当我放入某些东西时却没有。当我输入一些东西时,仍然没有卡片出现。
  • 我想知道是否存在搜索无法正确连接卡片的地方,所以这就是为什么当我搜索时,什么都没有显示
  • 我觉得在这部分,有些东西不工作;尝试 recyclerView.adapter = CustomAdapter(searchList, this@MainActivity)
  • 您仍然没有在搜索中获得输出?
  • 对不起,我让它工作了!谢谢您的帮助。问题是 arrayListModel[i].version.contains(s,true)。我需要“.version”。我忘了我以前改过
【解决方案2】:

这是您可能想要考虑/尝试的一种干净的方法: 使您的适配器实现可过滤接口。 提供您自己的过滤器对象,您可以在其中实现过滤逻辑(异步)。 您不妨使用 SearchView 而不是在 EditText 上使用 onTextChange。

所以:onTextChange(newText) => 调用 adapter.getFilter().filter(newText) => 过滤发生在后台(过滤方法 performFiltering 被调用) => 当过滤列表准备好时(过滤方法 publishResults 被调用),你将其推送到您的适配器并 notifyDataSetChanged。

希望这会有所帮助。 这是一个关于如何实现它的干净示例: Example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多