以下是这种情况:RecyclerView项目视图具有复杂的布局。
在某些时候,我这样修改RecyclerView项目的布局:
的实施例。 itemView = 3;
for (int i=0; i < mRecyclerView.getChildCount(); i++) {
ViewGroup itemView = ((ViewGroup) mRecyclerView.getChildAt(i));
itemView.getChildAt(3).getLayoutParams().width = newWidth;
itemView.getChildAt(3).requestLayout();
}
这一切都按预期工作,但当我滚动RecyclerView时,有2-3个回收的项目视图将以旧的宽度显示。现在,我试图找到如何从RecycledViewPool中删除这些视图,甚至是更好的解决方案:修改它们的宽度,但我找不到获取这些视图的方法。
我试过了mRecyclerView.getRecycledViewPool().clear()
,但旧的观点又重新出现了。
答案 0 :(得分:8)
要防止RecyclerView缓存已分离但未回收的视图,请使用:
mRecyclerView.setItemViewCacheSize(0)
另一种稍微激进的方法是为您希望缓存的项目调用notifyDataSetChanged()
或notifyItemChanged()
- 这会强制它们被回收,您将能够在{{1}中更新它们}}
答案 1 :(得分:2)
我没有找到从RecycledViewPool获取视图的方法,但我发现还有一些视图与RecyclerView分离但尚未回收。因此,如果要修改所有itemViews中的视图宽度,这是真正有效的解决方案。
的实施例。 itemView = 3中修改后的View的索引;
首先修改所有可见视图的宽度:
for (int i=0; i < mRecyclerView.getChildCount(); i++) {
ViewGroup itemView = ((ViewGroup) mRecyclerView.getChildAt(i));
itemView.getChildAt(3).getLayoutParams().width = newWidth;
itemView.getChildAt(3).requestLayout();
}
然后修改从RecyclerView分离的itemView的宽度。这包括回收的itemViews和分离的视图(但尚未回收)。
@Override
public void onViewAttachedToWindow(ViewHolder holder) {
super.onViewAttachedToWindow(holder);
((ViewGroup) holder.itemView).getChildAt(3).getLayoutParams().width = newWidth;
}
答案 2 :(得分:0)
adapter.notifyItemRangeRemoved(0,adapter.getItemCount());
在循环之前做这个。
答案 3 :(得分:0)
我也有同样的问题。我最初在RecyclerView中使用了一些项目。在达到最后一个索引时,我添加了一些数据。添加的数据与先前视图的视图重叠。回收时,必须删除以前的视图。但它不会删除该视图。因此我使用了以下代码,
5.9.99
在recyclerview中,我们有像OnViewRecycled这样的覆盖方法。通过清除视图持有者视图,我们可以刷新视图。
答案 4 :(得分:0)
只需在您的适配器中添加以下代码:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.YourViewHolder> {
...
private RecyclerView parent;
@NonNull
@Override
public YourAdapter.YourViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
this.parent = ((RecyclerView) parent);
...
}
@Override public void onViewRecycled(@NonNull YourViewHolder holder) {
parent.getRecycledViewPool().clear();
setLayoutParamsToView(holder.itemView);
}
...
}