Как обновить RecyclerView + PagedListAdapter и прокрутить вверх?

У меня есть RecyclerView, который использует PagedListAdapter. Я хочу обновить список (т.е. получить данные из моего DataSource) и автоматически прокрутить вверх.

Вот мой RecyclerView:

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    val adapter by lazy {
        DiscoveryListAdapter(activity)
    }
        recyclerView.let {
            it.adapter = adapter
            it.layoutManager = LinearLayoutManager(activity)
        }

Вот мой адаптер:

class DiscoveryListAdapter() : PagedListAdapter<Discovery, DiscoveryListItemViewHolder>(DiscoveryDiffCallback()) {

    @SuppressLint("CheckResult")
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoveryListItemViewHolder {
        //Extension function
        val view = parent.inflate(R.layout.discovery_detail_list_item)
        return DiscoveryListItemViewHolder(view)
    }

    override fun onBindViewHolder(viewHolder: DiscoveryListItemViewHolder, position: Int) {
        getItem(position)?.let {
            viewHolder.populateFrom(it)
        }
    }

    class DiscoveryDiffCallback : DiffUtil.ItemCallback<Discovery>() {
        override fun areItemsTheSame(one: Discovery, two: Discovery) =
                one == two

        override fun areContentsTheSame(one: Discovery, two: Discovery) =
                one == two
    }
}

Я создаю PagedList таким образом, подписываясь на возвращаемый объект LiveData и вызывая submitList на адаптере:

    fun buildLivePagedList(): LiveData<PagedList<Discovery>> {
        val config = PagedList.Config.Builder()
                .setPageSize(PAGE_SIZE)
                .setEnablePlaceholders(false)
                .setPrefetchDistance(PAGE_SIZE * 2)
                .build()
        val factory = DiscoveryListDataSourceFactory()
        return LivePagedListBuilder(factory, config).build()
    }

Я использую эту строку для обновления списка:

adapter.currentList?.dataSource?.invalidate()

Кажется, это правильно обновляется, но оставляет список прокручиваемым наполовину вниз. Оттуда я не знаю, как заставить recyclerview вернуться в начало списка. Я пробовал recyclerView.scrollToPosition(0), но не в кости. Несмотря ни на что, список обновляется, но не прокручивается вверх. Как мне это сделать?


person PhillyTheThrilly    schedule 02.05.2019    source источник
comment
Оказывается, это ошибка в библиотеке подкачки: issuetracker.google.com/issues/123834703.   -  person PhillyTheThrilly    schedule 29.12.2019
comment
По иронии судьбы у меня противоположная проблема. Я хотел бы обновить данные в списке, сохраняя положение прокрутки. Любая идея о том, как вы достигли такого поведения?   -  person Bueno    schedule 05.11.2020


Ответы (4)


Попробуйте использовать следующий код для прокрутки вверх:

pagedListAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
    override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
        if (positionStart == 0) {
            manager.scrollToPosition(0)
        }
    }
})
person Rajeev Sahu    schedule 01.11.2019

class DiscoveryDiffCallback : DiffUtil.ItemCallback<Discovery>() {
    override fun areItemsTheSame(one: Discovery, two: Discovery) = false

    override fun areContentsTheSame(one: Discovery, two: Discovery) = false
}

Сделайте так, чтобы ваш ItemCallback возвращал false. Надеюсь, поможет!

person 朱Sumauto    schedule 19.03.2020

попробуй adapter.refresh()

 val movieListAdapter : PagingDataAdapter
    swiperefresh.setOnRefreshListener {
                movieListAdapter.refresh()
                swiperefresh.isRefreshing = false
    }
person Ahmed Garhy    schedule 12.11.2020
comment
Она не будет работать. - person Vadim Shved; 18.06.2021

person    schedule
comment
Я уже пытался добавить задержку, к сожалению, она не всегда работает. - person PhillyTheThrilly; 28.12.2019
comment
Оказывается, это ошибка в библиотеке подкачки: issuetracker.google.com/issues/123834703. - person PhillyTheThrilly; 29.12.2019