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

8

我在我的项目中实现了一个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”。我想在某人点击其上方的“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中特定行的按钮的可见性吗?


请发布您的适配器代码。您需要添加一个属性来模拟按钮的可见状态。 - kris larson
5个回答

14

将点击逻辑移出 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重用,这就是为什么您会在其他行看到按钮可见的原因。


啊,这真是太简单了。谢谢。它起作用了。 - Srujan Barai
2
如果我想在滚动后仍然保持点击的视图怎么办? - SARATH V
重复问题:我需要知道如何在滚动后保持视图。 - Ignacio_aa

1

是的,它正在回收视图,所以这些事情正在发生。为此,您需要创建全局变量。

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

并保存值 isClicked。

在 onBindView 持有者中放置类似以下内容的内容:

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

并且在OnClickListener中将值保存到ArrayList中,并设置可见性。


0

您需要在@Override方法的onBindViewHolder中管理特定行的特定按钮可见性,而不是在初始化时。


0
尝试这个。 从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 中仍无 Visibility=Gone

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

相同的结果。没有成功。 - Srujan Barai
你尝试过在onBindView()中声明onClick监听器而不是在View Holder上吗?这就是我一直做的方式。 - Malith Lakshan
嘿,这是个好主意。让我试试。哎呀,有人踩了。但我很欣赏你的努力。 - Srujan Barai
太好听到这个消息了。恭喜你!祝你的项目顺利! - Malith Lakshan

-3

像这样做

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接