【问题标题】:RecyclerView inside NestedScrollView issueNestedScrollView 内的 RecyclerView 问题
【发布时间】:2021-05-18 12:16:27
【问题描述】:

我有一个与 recyclerView 相关的问题。所以我在NestedScrollView 中使用它。我知道这对性能不利,但目前我没有其他解决方案。

我的列表有分页,并将逻辑提供给nestedScrollView。所以当它到达底部时,我加载下一个列表。当需要更新我的列表时,我正在调用我的适配器notifyDataSetChanged

看看发生了什么。我为每个分页加载 30 个项目。当我加载前 30 个项目时,我将它们提供给我的适配器,它会同时绑定所有这些项目。没关系,因为它在nestedScrollView 中。当我滚动到底部并加载接下来的 30 个项目时,我正在调用 notifyDataSetChanged 让我的适配器更新 UI。但这一次不是绑定接下来的 30 个项目,而是一次绑定所有 60 个项目。而且每次我加载越来越多的项目时,情况都会变得更糟,因为它绑定了适配器中的所有项目。有没有办法防止这种情况并只绑定新添加的项目?

抱歉,我无法上传代码部分。没什么特别的,就是nestedScrollView里面的一个简单的recyclerview

【问题讨论】:

    标签: java android android-recyclerview android-nestedscrollview


    【解决方案1】:

    分页工作正常,它应该在滚动时加载越来越多。如果你只想要最新的,那么你可以在 api 函数上做一件事,重新初始化你的数组列表,这样它只会绑定最新的 30 个。

    【讨论】:

      【解决方案2】:

      可能的解决方案是使用DiffUtil。一旦你实现了你的 DiffCallback,你就可以这样使用它(取自文档)

       List oldList = mAdapter.getData();
       DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
       mAdapter.setData(newList);
       result.dispatchUpdatesTo(mAdapter);
      

      我实际上并没有尝试过,但是这种方式应该只绑定更新的项目。

      您实际遇到的问题是,由于您的 RecyclerView 位于 ScrollView 内,因此实际上永远不会回收视图,并且一旦您调用 notifyDataSetChanged,就会触发对所有项目的绑定。

      编辑 - 使用 ListAdapter

      我最近有一个类似的问题要解决,我最终做的是使用简化 DiffUtils 使用的ListAdapter

      class ItemsAdapter() :
          ListAdapter<Item, ItemViewHolder>(ItemComparator()) {
      
          override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 
              ItemViewHolder(parent)
      
          override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
              holder.bind(getItem(position))
          }
      }
      
      class ItemComparator : DiffUtil.ItemCallback<Item>() {
          override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
              return oldItem.id == newItem.id
          }
      
          override fun areContentsTheSame(oldItem: Item, newItem: Item): Item {
              return oldItem.prop1 == newItem.prop1 &&
                      oldItem.prop2 == newItem.prop2 &&
                      oldItem.prop3 == newItem.prop3
          }
      }
      

      在您的活动/片段中,当您获得新页面时只需调用adapter.submitList(items)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 2017-05-28
        • 1970-01-01
        • 2019-03-21
        相关资源
        最近更新 更多