在 onBindViewHolder 中调用 notifyDataSetChanged
Calling notifyDataSetChanged inside onBindViewHolder
我正在尝试在触发 picasso 回调后在 onBindViewHolder 中创建一个 notifyDataSetChanged,但我总是遇到此错误
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout
我需要这样做的原因是因为我使用的是 StaggeredGridLayoutManager,因此在毕加索加载不同尺寸的图像后需要重新排序 recyclerview
我的实际代码是:
@Override
public void onBindViewHolder(filmsAdapter.ViewHolder holder, int position) {
FilmInfo filmInfo = filmsList.get(position);
Picasso.get()
.load(filmInfo.GetPreviewImageUrl())
.placeholder(R.drawable.ic_launcher)
.into(holder.getFilmItemIcon(), new Callback() {
@Override
public void onSuccess() {
notifyDataSetChanged();
}
@Override
public void onError(Exception e) {
}
});
holder.getItemContainer().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, MainActivity.class);
intent.putExtra("filmInfo", filmInfo);
view.getContext().startActivity(intent);
}
});
}
关于这个问题,您可以使用 ReclyclerView.isComputingLayout() 来检查 RecyclerView 何时仍在计算布局。
但是,由于 Picasso 异步加载图像,它会产生死循环。当 Picasso.onSuccess 触发 notifyDataSetChanged 时,将再次调用 onBindViewHolder,依此类推。
唯一的解决方案是,如果您可以跟踪必须加载多少图像,或者如果您知道必须处理多少条目,则使用信号量,但如果列表中的项目数未定义,那么将这并不容易,因为每次用户滚动 RecyclerView 时都会调用 onBindViewHolder。
所以,总体问题是Picasso.onSuccess会调用notifyDataSetChanged,notifyDataSetChanged会再次调用onBindViewHolder,这会再次触发Picasso。
我正在尝试在触发 picasso 回调后在 onBindViewHolder 中创建一个 notifyDataSetChanged,但我总是遇到此错误
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout
我需要这样做的原因是因为我使用的是 StaggeredGridLayoutManager,因此在毕加索加载不同尺寸的图像后需要重新排序 recyclerview
我的实际代码是:
@Override
public void onBindViewHolder(filmsAdapter.ViewHolder holder, int position) {
FilmInfo filmInfo = filmsList.get(position);
Picasso.get()
.load(filmInfo.GetPreviewImageUrl())
.placeholder(R.drawable.ic_launcher)
.into(holder.getFilmItemIcon(), new Callback() {
@Override
public void onSuccess() {
notifyDataSetChanged();
}
@Override
public void onError(Exception e) {
}
});
holder.getItemContainer().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, MainActivity.class);
intent.putExtra("filmInfo", filmInfo);
view.getContext().startActivity(intent);
}
});
}
关于这个问题,您可以使用 ReclyclerView.isComputingLayout() 来检查 RecyclerView 何时仍在计算布局。
但是,由于 Picasso 异步加载图像,它会产生死循环。当 Picasso.onSuccess 触发 notifyDataSetChanged 时,将再次调用 onBindViewHolder,依此类推。
唯一的解决方案是,如果您可以跟踪必须加载多少图像,或者如果您知道必须处理多少条目,则使用信号量,但如果列表中的项目数未定义,那么将这并不容易,因为每次用户滚动 RecyclerView 时都会调用 onBindViewHolder。
所以,总体问题是Picasso.onSuccess会调用notifyDataSetChanged,notifyDataSetChanged会再次调用onBindViewHolder,这会再次触发Picasso。