2016-10-13 2 views
1

У меня есть recyclerview с линейным менеджером макетов и содержит разные элементы. В одном из элементов есть кнопка, которая скрывает или отображает вложенное расположение этих элементов.Android RecyclerView - прокрутка изменений элементов

Поэтому я добавил что-то вроде 10 строк определенного типа, и когда я нажимаю на определенный элемент, отображается его вложенный макет, но я вижу, что другой элемент отображает его собственный вложенный макет. Вторая попытка состояла в том, чтобы щелкнуть по какой-то кнопке и прокрутить, вложенный макет был показан на разных позициях.

Как вы можете видеть из кода, я попытался вызвать метод - notifyDataSetChanged(), но это не поможет. Я знаю, что расширяется вид ресайклер, но в моем случае я хочу, чтобы решить эту проблему без изменений весь код ..

Расположение:

<RelativeLayout 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
> 
    <TextView 
     android:id = "@+id/tv" 
     android:layout_height="wrap_content" 
     android:layout_width = "wrap_content" 
     android:text = "click on the button" 
    /> 
    <Button 
     android:id = "@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click Me" 
     android:layout_toRightOf="@+id/tv" 
    /> 

    <RelativeLayout 
     android:id = "@+id/nested" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/tv" 
     android:visibility="gone" 
    > 

     <TextView 
      android:id = "@+id/tv1" 
      android:layout_height="wrap_content" 
      android:layout_width = "wrap_content" 
      android:text = "click on the button" 
     /> 
    </RelativeLayout> 
</RelativeLayout> 

Код адаптера (onBind)

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) 
    { 
     int type = getItemViewType(position); 
     ViewType viewType = ViewType.values()[type]; 
     try 
     { 
      switch (viewType) 
      { 
       case VIEW1: 
        // code for view 1 
       break; 
       case VIEW2: 

        final ViewHolder viewHolder = (ViewHolder) holder; 

        viewHolder.tv.setText("TV1"); 
        viewHolder.btn.setOnClickListener(new View.OnClickListener() 
        { 
         @Override 
         public void onClick(View v) 
         { 

          viewHolder.nestedLayout.setVisibility(!isVisible ? View.VISIBLE : View.GONE); 
          viewHolder.isVisible = !viewHolder.isVisible; 

          // notifyDataSetChanged(); 
         } 
        }); 


       break; 

      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      Log.d("ChatListAdapter","chat list adapter ioexception" + e.getMessage()); 
     } 
    } 
+0

Это RecyclerView на вашей деятельности или на фрагменте? –

+0

@SamuelRobert, о деятельности – Elior

+2

Ваша модель данных должна сохранять статус видимости видов, которые вы хотите манипулировать. В противном случае вы потеряете его при прокрутке. –

ответ

1

Как отметил Самуэль Роберт, вы должны отслеживать расширенную видимость деталей в вашей модели класса:

Say вы используете элемент класса модели, есть поле внутри него, чтобы отслеживать видимость вложенной компоновки.

Попробуйте это:

Item item = itemList.get(position); 
final ViewHolder viewHolder = (ViewHolder) holder; 
viewHolder.tv.setText("TV1"); 
viewHolder.nestedLayout.setVisibility(!item.isVisible ? View.VISIBLE : View.GONE); 
viewHolder.btn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
     int position = getAdapterPosition(); 
     if(position != RecyclerView.NO_POSITION) { 
      Item item = itemList.get(position) 
      item.isVisible = !item.isVisible; 
      notifyItemChanged(position); 
     } 
     } 
    }); 
0

Вы должны установить состояние видимости для каждого вида (каждый вызов onBindViewHolder). Я предполагаю, что для вас происходит то, что вы устанавливаете видимость для представления, которое позже перерабатывается и имеет набор видимости.

+0

для каждого вложенного макета, значение видимости по умолчанию «ушло». Итак, если пользователь нажмет на кнопку 2-го элемента, значение видимости этого конкретного вложенного макета будет «видимым», а все остальные останутся «ушли». – Elior

+0

Возможно, у меня не возникла проблема. Если у вас есть несколько представлений, показывающих, что у вас есть проблема с владельцем, имеющим установленные значения или у вас одинаковый viewId, я думаю, что последнее невозможно. Я предлагаю вам попробовать распечатать значения каждого представления в качестве отладки. – MaTePe

1

Есть поле идентификатора в DataModel и переопределить getItemId(), как показано ниже,

@Override 
    public long getItemId(int position) { 
     return yourList.get(position).getId(); 
    } 
Смежные вопросы