Android 在卡片回收器视图中使用编辑搜索功能时出现问题

Android 在卡片回收器视图中使用编辑搜索功能时出现问题,android,kotlin,android-recyclerview,android-search,Android,Kotlin,Android Recyclerview,Android Search,我试图通过允许用户搜索的方式,通过一个带有卡片的回收器视图进行搜索。当用户搜索时,卡片应根据用户输入的字符“重新组织”以显示。我曾尝试过这样做,但在这样做时遇到了问题。感谢您的帮助 MainActivity.kt class MainActivity : AppCompatActivity(), BottomSheetRecyclerViewAdapter.ListTappedListener { private var customAdapter: CustomAdapter? = n

我试图通过允许用户搜索的方式,通过一个带有卡片的回收器视图进行搜索。当用户搜索时,卡片应根据用户输入的字符“重新组织”以显示。我曾尝试过这样做,但在这样做时遇到了问题。感谢您的帮助

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
    }
}
class MainActivity:AppCompatActivity(),BottomSheetRecycleServiceAdapter.ListTappedListener{
私有变量customAdapter:customAdapter?=null
私有变量arrayListModel=ArrayList()
私有lateinit变量bottomSheetBehavior:CustomBottomSheetBehavior
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val modelList=readFromAsset()
val adapterList=CustomAdapter(型号列表,此)
customAdapter=customAdapter(arrayListModel,this@MainActivity)
bottomSheetBehavior=bottomSheetBehavior.from(bottomSheetLayout)作为CustomBottomSheetBehavior
recyclerView.adapter=适配器列表
recyclerView.layoutManager=LinearLayoutManager(此,recyclerView.VERTICAL,false)
et_search.addTextChangedListener(对象:TextWatcher{
覆盖后文本更改(s:可编辑?){
}
重写更改前文本(s:CharSequence?、开始:Int、计数:Int、结束:Int)之前的乐趣{
}
重写已更改的文本(s:CharSequence?,start:Int,before:Int,count:Int){
如果(!s.isNullOrEmpty()){
val searchList=ArrayList()
对于(arrayListModel.Index中的i){
如果(arrayListModel[i].name.toLowerCase().contains){
searchList.add(arrayListModel[i])
}
}
试一试{
customAdapter?.notifyDataSetChanged()
recyclerView.adapter=CustomAdapter(搜索列表,this@MainActivity)
}捕获(e:例外){
e、 printStackTrace()
}
}否则{
customAdapter?.notifyDataSetChanged()
recyclerView.adapter=自定义适配器
}
}
})
}
覆盖列表(文本:字符串){
}
private fun readFromAsset():列表{
val modeList=mutableListOf()
val bufferReader=application.assets.open(“android_version.json”).bufferedReader()
val json_string=bufferReader.use{
it.readText()
}
val jsonArray=jsonArray(json_字符串);
对于(i in 0..jsonArray.length()-1){
val-jsonObject:jsonObject=jsonArray.getJSONObject(i)
val model=model(jsonObject.getString(“名称”),jsonObject.getString(“版本”))
modeList.add(模型)
}
回归模型学家
}
}

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

所以:onTextChange(newText)=>调用adapter.getFilter().filter(newText)=>在后台进行筛选(调用filter方法performFiltering)=>当筛选列表就绪时(调用filter方法publishResults),将其推送到适配器并通知datasetchange

希望这有帮助。 下面是一个关于如何实现这一点的清晰示例:
我可能发现了你的问题。在这里,您将获得数据
val modelist=readfromsetse()
,但您从未将数据分配给解决问题的
arrayListModel

将数据分配给
arrayListModel

  val modelList = readFromAsset()
  arrayListModel=modelList 

代码看起来不错。您何时何地遇到问题?感谢我搜索时的回复,没有显示任何内容。例如,我的卡包含“存储”之类的内容,因此当我键入“s”时,带有“s”的卡(如“存储”等)应该会显示,但不会显示任何卡。替换此
arrayListModel[I].name.contains(s,true)
,并添加此行
if
条件`Log.e(“name”,arrayListModel[I].name)。检查日志找到的结果数。在与名称进行比较时,将CharSequence转换为字符串。艾,s。toString@frankenstein我试着把它放进去,但还是没有牌。日志中没有显示任何内容。也没有。很好-这解决了我返回空格时出现的问题,现在没有显示任何内容,当我返回空格时,所有卡片都会显示,但当我放入某个内容时不会显示。当我输入一些东西时,没有卡片显示出来。我想知道是否有一些东西在搜索时没有与卡片正确连接,这就是为什么当我搜索时,没有显示任何东西。我觉得在这部分,有些东西是;t working try recyclerView.adapter=CustomAdapter(搜索列表,this@MainActivity)你仍然没有得到搜索结果?对不起,我让它工作了!谢谢你的帮助。问题是arrayListModel[i]。version.contains(s,true)。我需要“.version”。我忘了我以前改变过