0

私のプロジェクトにrecyclerViewを実装しました。Android:recyclerViewのビューの可視性を変更する

recyclerViewrowには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をクリックすると、このボタンの可視性を「可視」に変更したいと思います。 message (textView)に簡単なonClickLiestener()を実装し、messageのクリックで表示の可否をbuttonに変更しました。それがうまくいかないことは分かっていましたが、結果を見たいと思っていました。結果は奇妙です。行1のtextViewをクリックすると、行7,17,19などのボタンのボタンが表示されます。私はこれがviewHolderのキャッシュのcozかもしれないと思います。

MyViewHolderはこのようなものである:誰かが私は私のrecyclerViewの、perticular行のだけ、ボタンの表示を変更することができますどのように私を導くことができる

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); 
      } 
     }); 
    } 
} 

+0

アダプタコードを記載してください。ボタンの可視状態をモデル化するためのプロパティを追加する必要があります。 –

答えて

7

移動]をクリックロジック離れViewHolderからXMLにゴーン何可視性ない=:

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

あなたは@Override方法でonBindViewHolderではなく、初期化時に特定の行で、特定のbuttonvisibilityを管理する必要があります。

-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コンストラクターを次のように変更します。

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); 
     } 
    }); 
} 

もう1つの方法。 それでも

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

あなたはView HolderではなくonBindView()からonClickリスナーを宣言しようとしましたか?それは私がいつもそれをする方法です。 –

+0

ちょっといいアイデアですね。私が試してみましょう。 Oopsの誰かが下落しました。しかし、私はあなたの努力に感謝します。 –

1

はいこのようなことが起こるように、ビューをリサイクルしています。そのために あなたはグローバル変数

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

を作成し、isClicked値を保存する必要があります。

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

および配列リスト内の値と同様に、設定された可視性のセーブOnClickListener上:

とonBindViewホルダーはこのような何かを置きます。

関連する問題