2015-05-19 2 views
4

Вот ситуация: представления элементов RecyclerView имеют сложный макет.
В какой-то момент я изменяю компоновку элементов RecyclerView таким образом:
Ex. Индекс модифицированного вида внутри itemView = 3;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;
Во-первых изменить ширину всех видимых Просмотры:

for (int i=0; i < mRecyclerView.getChildCount(); i++) { 

    ViewGroup itemView = ((ViewGroup) mRecyclerView.getChildAt(i)); 

    itemView.getChildAt(3).getLayoutParams().width = newWidth; 
    itemView.getChildAt(3).requestLayout(); 
} 

Затем изменить ширину itemViews, которые были отделены от RecyclerView. Это включает переработанные элементы itemViews и отдельные виды (но не переработанные).

@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()); 

Просто сделайте это, прежде чем цикл.

Смежные вопросы