2016-04-11 3 views
2

У меня есть RecyclerView, в которых элементы являются LinearLayout с несколькими TextViews как дети. В зависимости от некоторых правил (это определено в onBindViewHolder), TextViews может быть скрыт (видимость GONE) или показана.RecyclerView с товарами, которые скрывают/показывают своих детей

Моя проблема в том, что если у меня есть 3 элемента (A, B и C) в RecyclerView с таким же количеством видимых TextViews и A сверху списка, B в середине и C внизу , если, например, B должен показать больше TextViews, чем раньше, в течение короткого периода времени этот элемент (B) будет перекрываться с C, так как он вырос в размере и должен разместить новый видимый TextViews, которые ранее были с видимостью GONE.

Визуальное представление задачи:

Желаемая ситуация

enter image description here

Текущий и нежелательная ситуация

enter image description here

После бит RecyclerView вмещает элемент правильно.

Как я могу избежать этого?

EDIT:

В одном из комментариев предлагается, чтобы я мог бы оживить и трансформирует взгляды себя. Это необходимо или есть другой способ сделать это? Если да, то как я могу анимировать и преобразовывать представления?

EDIT 2:

Пробовал этот ответ: Animating items, но проблемы сохраняется. Там есть видимая задержка до обновления RecyclerView.

EDIT 3:

Я использую этот класс (RecyclerViewCursorAdapter) в качестве основы для адаптера, который заполнит RecyclerView. Aditionally, я делаю это в onResume

@Override 
public void onResume() 
{ 
    super.onResume(); 

    if(getActivity().getSupportLoaderManager().getLoader(R.id.myLoaderId) == null) 
    { 
     getActivity().getSupportLoaderManager().initLoader(R.id.myLoaderId, null, this); 
    } 
    else 
    { 
     getActivity().getSupportLoaderManager().restartLoader(R.id.myLoaderId, null, this); 
    } 
} 
+0

Попробуйте сделать 'TextViews'' INVISIBLE' вместо 'GONE'. – sonictt1

+0

Можете ли вы опубликовать свой код, показывающий, что происходит? Если данные изменяются, вы должны просто вызвать recyclerView.getAdapter(). NotifyDataSetChanged(); и он должен правильно перерисовать recyclerView. – LNI

+0

@LNI Я делаю это, но, как было сказано, проблема возникает в течение короткого периода времени (я думаю, в то время как обновления 'RecyclerView'), то она отображается правильно. – OneEyeQuestion

ответ

0

Ваша проблема в том, что: в вашем XML (вид пункт), вы объявляете TextView с атрибутом по умолчанию:

android:visibility="gone" 

когда проверка состояния:

if (condition) { 
    textView.setVisibility(View.VISIBLE); 
} 

Вместо этого вы должны сделать следующее:

if (condition) { 
    textView.setVisibility(View.VISIBLE); 
} else { 
    textView.setVisibility(View.GONE); 
} 
+0

Я делаю то, что вы предлагаете. Проблема заключается в том, что когда видимость изменяется на «VISIBLE», «RecyclerView» показывает на короткий период времени элемент с новой высотой, но перекрывая элемент ниже. – OneEyeQuestion

+0

Можете ли вы показать свой код? –

+0

Мой код точно так же, как и ваш, если вы удалите привязку данных и все это – OneEyeQuestion

0

если его высота становится 0, она не будет видна :). Я предполагаю, что ваш корневой макет имеет некоторую минимальную высоту (или точную высоту), что делает ее по-прежнему занимать пространство, даже если оно GONE.

0

Если вам также необходимо добавить плавный эффект анимации, попробуйте это.

По умолчанию положить видимость == ушел.

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 
{ 
    super.onBindViewHolder(holder, position); 

    holderG.layoutReply.setVisibility(View.GONE); 
} 

И установить видимость что-то вроде:

holder.button.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 
         if (holderG.layoutReply.getVisibility() == View.VISIBLE) {     
          notifyItemChanged(holderG.getAdapterPosition()); 
         } 
         else {holderG.layoutReply.setVisibility(View.VISIBLE); 
         } 
        } 
       } 
      }); 

и в макете инфлятора установить

android:animateLayoutChanges="true" 

для родительского компоновщика.

Примечание: в случае видимости == ВИДИМОСТЬ, изменения анимации макета работают нормально и плавно, но в случае видимости == Элементы GONE перекрывают друг друга, поэтому я использую notifyItemChanged, чтобы изменить видимость вида.

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