加载更多项目时更新适配器的最佳做法是什么?

时间:2018-06-10 15:03:44

标签: android android-recyclerview pagination recycler-adapter

我有一个显示提要的片段,每次用户滚动时,都会通过在UI线程上调用notifyDataSetChanged方法来更新适配器。

这是更新适配器的有效方法吗?

这里是加载数据的方法。

 private void Load(final int page) {
   myApollo.getApolloClient().query(GetpopularQuery.builder().page(page).build()).enqueue(new ApolloCall.Callback<GetpopularQuery.Data>() {
       @Override
       public void onResponse(@Nonnull final Response<GetpopularQuery.Data> response) {
           popular.addAll(response.data().Page().media());
           getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    adapter.notifyDataSetChanged();
                }
           });
       }`

2 个答案:

答案 0 :(得分:0)

在UI线程上调用notifyDataSetChanged()很好,但是你应该在后台线程上加载数据。在UI线程上加载数据可能会导致应用程序挂起或崩溃,如果数据需要很长时间才能加载。 Android去年推出了一个名为Paging Library的架构组件,可以更轻松地将数据加载到您的Recyclerview中。我强烈建议阅读文档。

答案 1 :(得分:0)

我认为现在使用DiffUtils通知适配器有关数据集更改的最简单且最推荐的方法。它使您可以决定哪些项目已更改,哪些项目是新项目等。您需要扩展DiffUtils.Callback并实施一些方法:

class DiffCallback(): DiffUtil.Callback() {
    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {

    }

    override fun getOldListSize(): Int {

    }

    override fun getNewListSize(): Int {

    }

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {

    }

}

并设置DiffUtils以通知您的适配器:

 val diffUtil = DiffUtil.calculateDiff(DiffCallback(oldElements, newElements))
 oldElements.clear()
 oldElements.addAll(newElements)
 diffUtil.dispatchUpdatesTo(this)