RecyclerView:如何从RecyclerView.RecycledViewPool中清除回收的视图

时间:2015-05-19 18:02:02

标签: android android-recyclerview

以下是这种情况:RecyclerView项目视图具有复杂的布局。
在某些时候,我这样修改RecyclerView项目的布局:
实施例。 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时,有2-3个回收的项目视图将以旧的宽度显示。现在,我试图找到如何从RecycledViewPool中删除这些视图,甚至是更好的解决方案:修改它们的宽度,但我找不到获取这些视图的方法。

我试过了mRecyclerView.getRecycledViewPool().clear(),但旧的观点又重新出现了。

5 个答案:

答案 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);
}

...

}