仅单击单张卡片时在 RecyclerView 中打开多张卡片

Multiple cards opening in RecyclerView when clicked on only Single card

我正在尝试制作一个周期性的 table 应用程序。 RecyclerView 用于以列表方式显示项目。 单击某个项目时,包含元素详细信息的隐藏布局将从 View.GONE 更改为 View.VISIBLE

问题是,当我单击第一个项目然后滚动时,每第 11 个项目被打开(11、21、31..),当关闭时,每第 11 个项目被关闭。

隐藏和取消隐藏细节布局的代码:

    holder.element_single_card.setOnClickListener {

        if(holder.hidden_elements.visibility == View.GONE) {
            holder.hidden_elements.visibility = View.VISIBLE
        }
        else{
            holder.hidden_elements.visibility = View.GONE
        }
    }

包含用于显示元素详细信息的所有文本视图的父布局代码

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/element_hidden_information"
            android:visibility="gone"
            android:layout_below="@id/element_shown_information"
            >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_symbol"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_period"
                android:layout_below="@id/element_symbol"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_mass"
                android:layout_below="@id/element_period"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_density"
                android:layout_below="@id/element_mass"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_boiling_point"
                android:layout_below="@id/element_density"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_melting_point"
                android:layout_below="@id/element_boiling_point"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_electron_affinity"
                android:layout_below="@id/element_melting_point"
                android:layout_centerHorizontal="true"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/element_summary"
                android:layout_below="@id/element_electron_affinity"
                android:layout_centerHorizontal="true"
                />

        </RelativeLayout>

如何阻止每第 11 个项目打开,我的代码有什么问题?

这是因为当您向下滚动时,第 11 个元素正在重复使用与第一个元素相同的视图(由于内存限制,这是所需的 android 功能)您需要将布局重置为 View.GONE 如果您尝试显示的元素未处于打开状态。

为此,您不能像在 OnClickListener 中那样依赖视图的当前状态,而是应该在您用于显示数据的列表项本身中保持选中或单击的状态。

有关视图回收的更多文档可以在 official Android 文档中找到。

理想情况下,您的模型中应该有一个 Boolean 类型的 isExpanded 变量以及 getter/setter 方法。 该变量将负责存储每个item对应的展开状态。

来自 onClick 调用 -

 myModel.setIsExpanded(true);

并在onBindViewHolder()

中写入下面的代码
if(myModel.getIsExpanded())
{
    holder.hidden_elements.visibility = View.VISIBLE
}
else
{
    holder.hidden_elements.visibility = View.GONE
}

由于 RecyclerView 重用它的 viewHolder 对象,您不能依赖 View.

的早期状态

如果您需要更多说明,请告诉我:)