2015-05-19 27 views
4

以下是情況:RecyclerView項目視圖具有複雜的佈局。
在某些時候,我修改RecyclerView項目的佈局,如下所示:
Ex。 itemView = 3中修改的View的索引;RecyclerView:如何清除RecyclerView.RecycledViewPool中的再循環視圖

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(),但舊的意見保持重新出現。

回答

2

我沒有找到一種方法從RecycledViewPool獲取視圖,但是我發現還有一些視圖從RecyclerView中分離出來,但沒有被回收。所以如果你想修改所有itemView中視圖的寬度,這個解決方案真的有效。
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(); 
} 

然後修改從RecyclerView被分離的itemViews的寬度。這包括回收itemView和分離視圖(但尚未回收)。

@Override 
public void onViewAttachedToWindow(ViewHolder holder) { 
    super.onViewAttachedToWindow(holder); 

    ((ViewGroup) holder.itemView).getChildAt(3).getLayoutParams().width = newWidth; 
} 
5

爲了防止RecyclerView緩存拆下來,但沒有回收利用的觀點使用:

mRecyclerView.setItemViewCacheSize(0) 

另一個稍微激進的方式是打電話給你希望緩存的項目notifyDataSetChanged()notifyItemChanged() - 這將迫使他們以獲得回收利用,並且您將能夠更新它們onBindViewHolder()

+0

notifyItemChanged()很好用!謝謝! –

0
adapter.notifyItemRangeRemoved(0,adapter.getItemCount()); 

只需在循環前執行此操作即可。