0

В моем проекте я реализовал recyclerView.Android: Изменение видимости вида в recyclerView

У меня есть Button в моих . Код для моей каждой строки recyclerView как это:

savedmessage_custom_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="4dp" 
android:background="#ffffff" 
android:orientation="vertical"> 
<TextView 
    android:id="@+id/message" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    android:text="Dummy text" /> 
<Button 
    android:id="@+id/button" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="Button" 
    android:visibility="gone"/> 
</LinearLayout> 

видимость кнопки является gone. Я хочу изменить видимость этой кнопки на «видимый», когда кто-то нажимает на messagetextView над ним. Я внедрил простой onClickLiestener() на message (textView) и изменил видимость button на щелчок message. Я знал, что это не сработает, но я хотел увидеть результаты. Результаты странные. Если я нажимаю на textView строки 1, кнопка строки 7,17,19 и т. Д. также становится видимой. Я могу догадаться, что это может быть связано с кэшированием viewHolder.

MyViewHolder что-то вроде этого:

class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView message; 
    public MyViewHolder(final View itemView) { 
     super(itemView); 
     message = (TextView) itemView.findViewById(R.id.message); 
     message.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       itemView.findViewById(R.id.button).setVisibility(View.VISIBLE); 
      } 
     }); 
    } 
} 

Может кто-то наставит меня, как я могу изменить видимость кнопки, из perticular в строке только, моего recyclerView?

+0

Просьба указать код вашего адаптера. Вам нужно будет добавить свойство моделировать видимое состояние кнопки. –

ответ

7

Move защелкивающийся логика от ViewHolder:

class MyViewHolder extends RecyclerView.ViewHolder { 
    TextView message; 
    Button button; 
    public MyViewHolder(View itemView) { 
     super(itemView); 
     message = (TextView) itemView.findViewById(R.id.message); 
     button = (Button) itemView.findViewById(R.id.button); 
    } 
} 

и поместить его внутри метода onBindViewHolder вашего адаптера:

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    holder.button.setVisibility(View.GONE);   
    holder.message.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      holder.button.setVisibility(View.VISIBLE); 
     } 
    }); 
} 

ViewHolder повторно используется RecyclerView, поэтому вы видите кнопку, видимую в других строках.

+0

А это так просто, как могло бы быть. Благодарю. Это сработало. –

+1

Что делать, если я хочу удерживать щелчок даже после прокрутки? –

0

Вы должны управлять visibility в частности button, из определенной строки в @Override методы onBindViewHolder, а не на время инициализации.

-2

сделать так

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
TextView message; 
Button btnShow; 
public MyViewHolder(final View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 
    message = (TextView) itemView.findViewById(R.id.message); 
    btnShow = (Button) itemView.findViewById(R.id.button); 
} 

@Override 
    public void onClick(View v) { 
    btnShow.setVisibility(View.VISIBLE); 
    } 

} 
1

Попробуйте это. Удалить Visiblity = ушел из XML. Изменить MyViewHOlder Constructor на;

public MyViewHolder(final View itemView) { 
    super(itemView); 
    message = (TextView) itemView.findViewById(R.id.message); 
    button =(Button)itemView.findViewById(R.id.button); 
    button.setVisibility(View.Gone); 
    message.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      button.setVisibility(View.VISIBLE); 
     } 
    }); 
} 

Другой способ; Еще нет Видимость = Ушли в XML

public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.message.setOnClickListener(new View.OnCLickListener{ 
     @Override 
     public void onClick(View v){ 
      holder.button.setVisibiltiy(View.VISIBLE); 
     } 
    }); 
    holder.button.setVisibity(View.GONE); 
} 
+0

Те же результаты. Нет успеха. –

+0

Вы пытались объявить слушателей onClick из onBindView(), а не на держателе вида. Так я всегда это делаю. –

+0

Эй, это хорошая идея. Дай мне попробовать. К сожалению, кто-то занижен. Но я ценю ваши усилия. –

1

Да, это переработка вида, так что это происходит. Для этого необходимо создать глобальную переменную

ArrayList<Boolean> isClicked = new ArrayList<>(); 

и сохранить значение isClicked.

и onBindView держатель поставить что-то вроде этого:

if(isClicked.get(position)){ 
    view.setvisiblity(View.VISIBLE); 
}else{ 
    view.setvisiblity(View.GONE); 
} 

и OnClickListener сохранение значения в ArrayList, а также множества visiblity.

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

  • Нет связанных вопросов^_^