vov*_*ost 7 android android-recyclerview
情况如下:RecyclerView项目视图具有复杂的布局.
在某些时候,我用这种方式修改RecyclerView项目的布局:
Ex.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();
}
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作,但当我滚动RecyclerView时,有2-3个回收的项目视图将以旧的宽度显示.现在我试图找到如何从RecycledViewPool中删除这些视图,甚至是更好的解决方案:修改它们的宽度,但我找不到获取这些视图的方法.
我尝试了,mRecyclerView.getRecycledViewPool().clear()但旧观点重新出现.
要防止RecyclerView缓存分离但未回收的视图,请使用:
mRecyclerView.setItemViewCacheSize(0)
Run Code Online (Sandbox Code Playgroud)
另一种稍微激进的方式是调用notifyDataSetChanged()或notifyItemChanged()预期缓存的项目 - 这将迫使它们被回收,你将能够更新它们onBindViewHolder()
我没有找到从 RecycledViewPool 获取视图的方法,但我发现也有从 RecyclerView 分离但尚未回收的视图。因此,如果您想修改所有 itemView 内的视图宽度,这是真正有效的解决方案。
前任。itemView 内修改后的 View 的索引 = 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();
}
Run Code Online (Sandbox Code Playgroud)
然后修改与RecyclerView分离的itemView的宽度。这包括回收的 itemView 和分离的视图(但尚未回收)。
@Override
public void onViewAttachedToWindow(ViewHolder holder) {
super.onViewAttachedToWindow(holder);
((ViewGroup) holder.itemView).getChildAt(3).getLayoutParams().width = newWidth;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9134 次 |
| 最近记录: |