Android:在 recyclerView 中更改 View 的可见性

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

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

我的recyclerView 中有一个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>

按钮的可见性消失了。当有人点击其上方的 message textView 时,我想将此按钮的可见性更改为“可见”。我在 message (textView) 上实现了一个简单的 onClickLiestener() 并在点击 messagebutton 的可见性。我知道这行不通,但我想看看结果。结果很奇怪。如果我单击第 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 的按钮的可见性,仅特定行

最佳答案

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

关于Android:在 recyclerView 中更改 View 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37363068/

相关文章:

Android 应用显示的版本低于 list

android - 具有自定义形状项目的 RecyclerView

android - RecycleView 回收无法正常工作

java - 更新 ListView 中 View 的内容

android - 是否可以使用微调器实现公开的下拉菜单

android - TextView 和 EditText 在 LinearLayout 中被截断

android - 在 Google Places API 中过滤建筑类型

java - 比较带有特殊字符(é、è、...)的单词时忽略变音符号

android - Android 6.0.1 "Fatal Exception: android.view.WindowManager$BadTokenException"问题

android - 在 RecyclerView.Adapter 中绑定(bind) View 时出现 NullPointerException