Как обновить RecyclerView + PagedListAdapter и прокрутить вверх? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 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.scrollToPosition(0), но без игры в кости.Независимо от того, что, список обновляется, но не прокручивается к вершине.Как мне это сделать?

1 Ответ

0 голосов
/ 06 мая 2019

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

    private fun refreshListAndScrollToTop() {
        recyclerView.viewTreeObserver.addOnGlobalLayoutListener {
            adapter.currentList?.dataSource?.invalidate()
            recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
        recyclerView.scrollToPosition(0)
    }

Редактировать: не важно, это работает только в 75% случаев

...