我有一个带有 GridLayoutManager 的 RecyclerView。 每个项目都有一个按钮和一个不可见的内容。 当用户按下按钮时,内容会切换其可见性。
当内容不可见并且用户第一次按下按钮时,该项目会展开,同一行的其他项目也会展开
用户再次按下按钮后出现问题:行不收缩
每行都会发生同样的情况
我使用的代码非常简单...... 一个非常基本的适配器
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="8dp"
android:layout_weight="1"
android:background="#00ff00"
android:orientation="vertical"
android:padding="8dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Press me"
android:visibility="visible" />
<View
android:id="@+id/hidden_view"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#0000ff"
android:visibility="gone" />
</LinearLayout>
class TestAdapter : RecyclerView.Adapter<ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val vh = ViewHolder(
ItemTestBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
vh.itemBinding.button.setOnClickListener {
vh.itemBinding.hiddenView.isVisible = !vh.itemBinding.hiddenView.isVisible
}
return vh
}
override fun getItemCount(): Int {
return 4
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.itemBinding.hiddenView.isVisible = false
return
}
}
open class ViewHolder internal constructor(val itemBinding: ItemTestBinding) :
RecyclerView.ViewHolder(itemBinding.root)
在一个非常基本的布局中
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff0000"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="2"
tools:itemCount="4"
tools:listitem="@layout/item_test" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#ffff00"
app:layout_constraintTop_toBottomOf="@id/recycler"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.recycler.adapter = TestAdapter()
}
}
我希望行缩小到较低的项目
请注意,当使用 SpanCount = 1 的 LinearLayout 或 GridLayoutManager 时,行为是正确的:
问题似乎与此有关:
https://stackoverflow.com/questions/66573880/items-height-in-gridlayoutmanager-after-dynamic-action但该解决方案在这里不起作用
这是一个复制问题的最小项目:
https://mega.nz/file/R7IgmSwD#mwy28aMvMTagfkzSNjArIHANI5cUskG8vN7ZrVp-u94
正如评论中所说,你应该根据特定条件设置imageView
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if(condition) {
// Set the hiddenview
}
}