仅单击单张卡片时在 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
.
的早期状态
如果您需要更多说明,请告诉我:)
我正在尝试制作一个周期性的 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
.
如果您需要更多说明,请告诉我:)