在带有卡片的 Recycler View 中使用编辑搜索功能时出现问题
Trouble Using Edit Search Function in Recycler View with Cards
我正在尝试通过允许用户搜索来搜索带有卡片的回收站视图。当用户搜索时,卡片应该"reorganize"按照用户输入的字符显示。我曾尝试这样做,但在执行此操作时遇到问题。任何帮助表示赞赏。
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
}
}
这里有一个您可能想要 consider/try 的简洁方法:
让您的适配器实现可过滤接口。
提供您自己的 Filter 对象,您可以在其中实现过滤逻辑(异步)。
您还不如使用 SearchView 而不是在 EditText 上使用 onTextChange。
因此:onTextChange(newText) => 调用 adapter.getFilter().filter(newText) => 过滤发生在后台(过滤方法 performFiltering 被调用)=> 当过滤列表准备好时(过滤方法 publishResults 是称为),您将其推送到您的适配器并通知 DataSetChanged。
希望这对您有所帮助。
这是一个关于如何实现它的干净示例:
Example
我可能发现了你的问题。在这里您获取数据 val modelList = readFromAsset()
但您永远不会将数据分配给 arrayListModel
您的问题。
将数据分配给arrayListModel
val modelList = readFromAsset()
arrayListModel=modelList
我正在尝试通过允许用户搜索来搜索带有卡片的回收站视图。当用户搜索时,卡片应该"reorganize"按照用户输入的字符显示。我曾尝试这样做,但在执行此操作时遇到问题。任何帮助表示赞赏。
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
}
}
这里有一个您可能想要 consider/try 的简洁方法: 让您的适配器实现可过滤接口。 提供您自己的 Filter 对象,您可以在其中实现过滤逻辑(异步)。 您还不如使用 SearchView 而不是在 EditText 上使用 onTextChange。
因此:onTextChange(newText) => 调用 adapter.getFilter().filter(newText) => 过滤发生在后台(过滤方法 performFiltering 被调用)=> 当过滤列表准备好时(过滤方法 publishResults 是称为),您将其推送到您的适配器并通知 DataSetChanged。
希望这对您有所帮助。 这是一个关于如何实现它的干净示例: Example
我可能发现了你的问题。在这里您获取数据 val modelList = readFromAsset()
但您永远不会将数据分配给 arrayListModel
您的问题。
将数据分配给arrayListModel
val modelList = readFromAsset()
arrayListModel=modelList