Recyclerview包含从数据库获取的三个textview (name, email, phone)的cardlayout。我想从recyclerview中隐藏cardlayout如果它包含name等于某个字符串。我所尝试的是从数据库中获取数据后,我使用if语句来比较名称与字符串,如果它等于它们使cardlayout不可见。但是,如果条件满足
,许多cardlayout会变得不可见。if (dealer.getName().equals("abcde"))
cardlayout.setVisibility(View.GONE);
在我看来,您的RecyclerView项目与Gone
的visibility
有多个项目。
我相信你在onBindViewHolder()
和RecyclerView.Adapter
中做了这个逻辑
你为什么会遇到这种情况?
onBindViewHolder()
在项目初始化时被调用,当你滚动到另一个位置时,你不再看到该项目,并滚动回该项目位置。
在RecyclerView中。适配器文档,谷歌说关于onBindViewHolder()
:
由RecyclerView调用,用于在指定位置显示数据。这个方法应该更新RecyclerView.ViewHolder.itemView的内容,以反映给定位置的项目。
和
你应该只在这个方法中获取相关数据项时使用position参数,而不应该保留它的副本。
由于这个原因,当你在它之前或之后重新滚动项目时,并且你没有为你的项目设置else case,那么在onBindViewHolder
中它之前或之后的项目的值将使你的内容回到你设置cardlayout隐藏逻辑的项目上。
如何解决这个问题?
对于onBindViewHolder()
中显示或修改视图项的隐藏逻辑,请确保如果您有if
,则有else
。
YourRecyclerViewAdapter.kt
override fun onBindViewHolder(holder: YourViewHolder, position: Int) {
...
if (dealer.name == "abcde") {
cardLayout.visibility = View.GONE
} else { // You should have else case to return the correct content for other positions
cardLayout.visibility = View.VISIBLE
}
...
}