У меня есть пользовательский адаптер и фильтр, который я сейчас внедряю для фильтрации представления переработчика на основе простого поиска по подстроке в записях моего представления переработчика. Вот моя функция адаптера NotifyChanged()
, которая обновляет RecylerView, и моя пользовательская функция filter()
. Все отлично работает, за исключением автоматической прокрутки после этого.
private fun notifyChanged() {
val result = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
override fun getOldListSize(): Int {
return objects.size
}
override fun getNewListSize(): Int {
return temp.size
}
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return this@DiffRecyclerViewAdapter.areItemsTheSame(objects[oldItemPosition], temp[newItemPosition])
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return this@DiffRecyclerViewAdapter.areContentsTheSame(objects[oldItemPosition], temp[newItemPosition])
}
})
objects.clear()
objects.addAll(temp)
result.dispatchUpdatesTo(this)
}
fun filter(text : String){
val ob = original_objects as ArrayList<Category>
val filtered_categories = ArrayList<T>() as ArrayList<Category>
for (category in ob){
//val temp_category = category
val list_of_subcategories = ArrayList<T>() as ArrayList<Category>
for (subcategory in category.categories){
val name_of_category = subcategory.name.toLowerCase()
if (name_of_category.contains(text)){
list_of_subcategories?.add(subcategory)
}
}
if (list_of_subcategories.size > 0){
val newCategory = Category(category.id,category.name,category.description,category.videos,list_of_subcategories)
filtered_categories.add(newCategory)
}
}
temp = filtered_categories as MutableList<T>
notifyChanged()
}
В моем SearchActivity.kt у меня есть следующий слушатель:
searchEditText.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) {
adapter.filter(s.toString())
recyclerView.scrollToPosition(0)
}
})
Я просматривал исходный код DiffUtil
и notifyDataSetChanged()
, чтобы увидеть, как работает прокрутка после фильтрации. Но не повезло. Вся проблема в том, что после поиска текста RecyclerView фильтруется нормально. Но перейдем к несовместимым местам. Я хочу, чтобы он каждый раз прокручивался вверх, но этого не происходит. ДАЖЕ С scrollToPosition(0)
он, как правило, прокручивается вверх, но не всегда.
Я думал, что прокрутка к вершине в этом случае обычно автоматическая. Мне любопытно, как лучше всего обновлять и прокручивать.