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

时间:2016-05-21 12:42:19

标签: android android-recyclerview android-view android-viewholder

我在项目中实施了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。我想将此按钮的可见性更改为“可见&#39;当有人点击其上方的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按钮的可见性,仅限

5 个答案:

答案 0 :(得分:11)

将点击逻辑移离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);
        }
    });
}

RecyclerView会重复使用ViewHolder,这就是您在其他行中看到该按钮的原因。

答案 1 :(得分:0)

试试这个。 删除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);
        }
    });
}

另一种方式; 仍然没有Visibility = Gone in 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);
}

答案 2 :(得分:0)

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

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

并保存值isClicked。

和onBindView持有者这样做:

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

OnClickListener 在arraylist中保存值以及设置visiblity。

答案 3 :(得分:-1)

您需要管理visibility方法button中特定行的特定@Override的{​​{1}},而不是初始化时间。

答案 4 :(得分:-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);
    }

}