【问题标题】:What is the best practice to update the adapter when loading more items?加载更多项目时更新适配器的最佳做法是什么?
【发布时间】:2018-06-11 00:10:59
【问题描述】:

我有一个显示提要的片段,每次用户滚动时,适配器都会通过在 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();
                }
           });
       }`

【问题讨论】:

    标签: android pagination android-recyclerview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为现在通知适配器数据集更改的最简单和推荐的方法是使用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)
      

      【讨论】:

        猜你喜欢
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 2015-12-03
        • 2017-09-20
        • 1970-01-01
        • 2017-05-22
        相关资源
        最近更新 更多