【问题标题】:Android: Changing visibility of a view in recyclerViewAndroid:更改 recyclerView 中视图的可见性
【发布时间】:2016-09-18 16:27:35
【问题描述】:

我在我的项目中实现了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 时,我想将此按钮的可见性更改为“可见”。我在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 的仅特定行按钮的可见性?

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

  • 啊,这很简单。谢谢。它奏效了。
  • 如果我想在滚动后保持点击的视图怎么办?
  • 重复问题:我需要知道滚动后保持视图
【解决方案2】:

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

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

并保存值 isClicked。

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 相同的结果。没有成功。
      • 您是否尝试过从 onBindView() 而不是在 View Holder 上声明 onClick 侦听器。这就是我一直这样做的方式。
      • 嘿,这是个好主意。让我试试。糟糕,有人投了反对票。但我感谢你的努力。
      • 很高兴听到这个消息。恭喜。祝你的项目好运!
      【解决方案5】:

      这样做

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-04
        • 2019-07-23
        • 2012-11-26
        • 1970-01-01
        相关资源
        最近更新 更多