如何在异步回调后检查RecyclerView Adapter中的项目是否仍然可见

时间:2019-06-28 11:53:13

标签: android android-recyclerview

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

否则,如果您确实是在视图而非数据集上工作,则可以执行以下操作: 在您的适配器中:

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