RecyclerView не выполняет автоматическую прокрутку наверх после обновления адаптера - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть пользовательский адаптер и фильтр, который я сейчас внедряю для фильтрации представления переработчика на основе простого поиска по подстроке в записях моего представления переработчика. Вот моя функция адаптера 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) он, как правило, прокручивается вверх, но не всегда.

Я думал, что прокрутка к вершине в этом случае обычно автоматическая. Мне любопытно, как лучше всего обновлять и прокручивать.

1 Ответ

0 голосов
/ 12 сентября 2018

Требуется некоторое время, чтобы обновить данные на утилите. Имеется в виду, когда вы пытаетесь прокрутить, что не работает в большинстве случаев. Желательно использовать postDelayed с 200 или 300 миллисекундами перед прокруткой

Пример:

new Handler.postDelayed(new Runnable(){
                @Override
                public void run(){
            recyclerView.scrollToPosition(0)
                 }
            }, 300);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...