为什么onBindViewHolder中的getItem永远为空?

时间:2018-10-26 08:44:14

标签: android android-recyclerview android-jetpack android-paging

因此,我正在尝试遵循分页库。在大多数示例中,它们具有类似以下内容:

@Override
public void onBindViewHolder(@NonNull PokemonViewHolder pokemonViewHolder, int i) {
    Pokemon pokemon = getItem(i); 
    if (pokemon != null) { // <-- why this check here?
        pokemonViewHolder.bind(pokemon);
    }
}

为什么必须检查适配器中的项目是否为空?我不了解PagedListAdapter流的内部。有人可以解释吗?

我的猜测是,在适配器上有一个观察者,一旦数据源更新,该适配器将在某个时刻从UI线程“改变”适配器的内容,从而该项目的位置已经过时了?

2 个答案:

答案 0 :(得分:1)

在官方文档中对此进行了解释:

@Override
public void onBindViewHolder(UserViewHolder holder, int position) {
    User user = getItem(position);
    if (user != null) {
        holder.bindTo(user);
    } else {
        // Null defines a placeholder item - PagedListAdapter will automatically invalidate
        // this row when the actual object is loaded from the database
        holder.clear();
    }
}
  1. https://developer.android.com/reference/android/arch/paging/PagedListAdapter

答案 1 :(得分:1)

  

PagedList始终具有数据集的完整大小。的   PagedList在默认情况下将为未加载的数据返回null   还

     

这意味着在适配器中,我们确实需要记住检查   在我们的bind方法中为null。

http://blog.abnormallydriven.com/2017/09/30/introducing-the-paging-library/