Android: 改变视图在 recyclerView 中的可见性

Android: Changing visibility of a view in recyclerView

我在我的项目中实现了一个recyclerView

我的 recyclerView row 中有一个 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。当有人点击它上方的 message textView 时,我想将此按钮的可见性更改为 'visible'。我在 message (textView) 上实现了一个简单的 onClickLiestener(),并在单击 message 时更改了 button 的可见性。我知道这行不通,但我想看看结果。结果很奇怪。如果我单击第 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?

您需要在 @Override 方法 onBindViewHolder 中而不是在初始化时管理特定行的特定 buttonvisibility

喜欢这样

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

}

试试这个。 从 XML 中删除 Visibility=gone。 将 ViewHOlder 构造函数更改为;

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

将点击逻辑从 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 重复使用,这就是您在其他行中看到按钮可见的原因。

是的,它正在回收视图,所以这件事正在发生。 为此你必须创建全局变量

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

并保存值 isClicked。

和 onBindView 持有者放了这样的东西:

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

OnClickListener 将值保存在数组列表中并设置可见性。