web-dev-qa-db-ja.com

Android:recyclerViewでのビューの可視性の変更

プロジェクトにrecyclerViewを実装しました。

ButtonrecyclerViewrowがあります。 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の表示を変更しました。それがうまくいかないことはわかっていましたが、結果を見たかったのです。結果は奇妙です。行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のボタンの可視性を変更する方法を教えてもらえますか特定の行のみ

5
Srujan Barai

クリックロジックを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によって再利用されるため、他の行にボタンが表示されます。

13
Gustavo

これを試して。 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);
}
0
Malith Lakshan

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

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

値isClickedを保存​​します。

そしてonBindViewホルダーは次のようなものを置きます:

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

and on OnClickListener値を配列リストに保存し、可視性を設定します。

0
Keyur