【问题标题】:How to check if item in RecyclerView Adapter is still visible after async callback如何检查异步回调后 RecyclerView 适配器中的项目是否仍然可见
【发布时间】:2019-06-28 20:17:54
【问题描述】:

我想更新一项调用异步调用到onBindViewHolder 内的服务器 API 的项目。我将位置 + 位置的项目发送到回调中。响应调用在 20 秒内到达回调函数。进入回调函数的是返回的响应和位置。然后我打电话给notifyItemChanged(pos, response)。在有效载荷onBindViewHolder 中,我更新了该位置上的项目及其视图。问题是,如果异步请求需要 20 秒并且用户将快速滚动通过 RecyclerView,它将更新错误的项目 View,因为该位置的视图可能未绑定或可能绑定到列表中的其他项目。

有什么方法可以跟踪哪个位置的哪个项目未绑定取消请求?我必须在创建适配器后更新这一信息,因为如果我之前这样做,用户将在近 2 分钟内看不到任何 recyclerView 项目,直到我的列表准备好。 (只有这一个电话需要很长时间)。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我不会将该职位作为上下文传递。我会传递一个标识符。可以是一个内部整数,如 id 或其他东西。然后您可以轻松确定当前在屏幕上可见的 id 并查看该列表是否包含回调的 id。

    【讨论】:

      【解决方案2】:

      我不确定您的问题,但您可以直接在适配器中处理您的项目。 然后你做:

      Adapter adapter = new BaseAdapter(newDataset);
      recyclerView.setAdapter(adapter);
      recyclerView.notifyDataSetChanged();
      

      否则,如果你真的在视图而不是数据集上工作,你可以这样做: 在您的适配器中:

      • 创建一个视图数组
      • 创建自定义函数View getViewAtPos(int pos)
      • 检查您的视图是否在当前滚动视图中可见 (here)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 2013-11-14
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多