更新适配器后,RecyclerView无法自动滚动到顶部

时间:2018-09-12 02:59:07

标签: android android-recyclerview kotlin

我有一个自定义适配器,当前正在实现的过滤器是基于对回收者视图条目的简单子字符串搜索来过滤回收者视图的。这是我的适配器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)
        }

    })

我正在浏览DiffUtilnotifyDataSetChanged()的源代码,以查看过滤后滚动的工作方式。但是运气不好。整个问题是,在我搜索文本后,RecyclerView会被很好地过滤。但是会滚动到不一致的位置。我希望它每次都滚动回到顶部,但这并没有发生。即使使用scrollToPosition(0),它也通常会滚动到顶部,但并不总是滚动到顶部。

在这种情况下,我认为滚动到顶部通常是自动的。我对更新和滚动的最佳做法感到好奇。

1 个答案:

答案 0 :(得分:0)

需要一些时间来更新recyclerview上的数据。这意味着在您尝试滚动时,这在大多数情况下不起作用。滚动前最好使用延迟200或300毫秒的post

例如:

new Handler.postDelayed(new Runnable(){
                @Override
                public void run(){
            recyclerView.scrollToPosition(0)
                 }
            }, 300);