プロジェクトにrecyclerView
を実装しました。
Button
recyclerView
にrow
があります。 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
です。誰かがその上のmessage
textView
をクリックしたときに、このボタンの表示を「表示」に変更したいと思います。 onClickLiestener()
に単純なmessage (textView)
を実装し、button
をクリックしたときのmessage
の表示を変更しました。それがうまくいかないことはわかっていましたが、結果を見たかったのです。結果は奇妙です。行1のtextViewをクリックすると、行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);
}
});
}
}
_
誰かが私のrecyclerViewのボタンの可視性を変更する方法を教えてもらえますか特定の行のみ?
クリックロジックを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によって再利用されるため、他の行にボタンが表示されます。
これを試して。 XMLからVisiblity = goneを削除します。 MyViewHOlderコンストラクターを;に変更します。
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);
}
はい、ビューをリサイクルしているので、このようなことが起こっています。そのためには、グローバル変数を作成する必要があります
ArrayList<Boolean> isClicked = new ArrayList<>();
値isClickedを保存します。
そしてonBindViewホルダーは次のようなものを置きます:
if(isClicked.get(position)){
view.setvisiblity(View.VISIBLE);
}else{
view.setvisiblity(View.GONE);
}
and on OnClickListener値を配列リストに保存し、可視性を設定します。