gpt4 book ai didi

java - Android RecyclerView 不回收项目

转载 作者:行者123 更新时间:2023-12-04 01:17:15 25 4
gpt4 key购买 nike

我有一个 recyclerView有多个 recyclerView在动态通货膨胀的情况下,响应 I
我从服务器得到的是一个包含对象的列表,每个对象都包含一个列表和属性recyclerView类型( VerticalHorizontal )线性布局。
一切正常,除了当方向为垂直时,适配器等待一次加载所有 View (停止回收)。
我进行了很多搜索以找到解决方案,但一无所获。
主要 RecyclerView里面 HomeFragment

<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"
tools:context="com.gt.gcook.ui.home.HomeFragment">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
android:nestedScrollingEnabled="false"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/home_single_item" />
</androidx.constraintlayout.widget.ConstraintLayout>
home_single_item 布局(包含 2 个 TextViewRecyclerView )
<?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="wrap_content">

<TextView
android:id="@+id/seeAllTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginEnd="24dp"
android:text="See all"
android:textColor="@color/color_yellow"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/titleTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="32dp"
android:text="Catigories"
android:textColor="#707070"
android:textSize="22sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:nestedScrollingEnabled="false"
app:reverseLayout="false"
android:clipToPadding="false"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/titleTV" />

</androidx.constraintlayout.widget.ConstraintLayout>
onBindViewHolder主页 RecyclerView .
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
when (position) {
0 -> {
holder.itemView.titleTV.text = "Categories"
val mLayoutManager = LinearLayoutManager(holder.itemView.context)
mLayoutManager.orientation = RecyclerView.HORIZONTAL
holder.itemView.recyclerView.layoutManager = mLayoutManager
holder.itemView.recyclerView.adapter = HomeCategoryAdapter()


}
1 -> { //here is the problem when Orintation is vertical.
holder.itemView.titleTV.text = "Most rated recipes"
val mLayoutManager = GridLayoutManager(holder.itemView.context, 2)
mLayoutManager.orientation = RecyclerView.VERTICAL
holder.itemView.recyclerView.layoutManager = mLayoutManager
holder.itemView.recyclerView.adapter = MostRatedRecipeAdapter(clickListener)


}
else -> {
holder.itemView.titleTV.text = "Favourite"
val mLayoutManager = LinearLayoutManager(holder.itemView.context)
mLayoutManager.orientation = RecyclerView.HORIZONTAL
holder.itemView.recyclerView.layoutManager = mLayoutManager
holder.itemView.recyclerView.adapter = HomeCategoryAdapter()
}
}
}

最佳答案

由于您的 RV的高度设置为 wrap_content没有办法为这种情况启用回收。当它处于水平状态时,回收正在发挥作用,因为它是 widthmatch_parent屏幕宽度是固定的。回收只有在定义了高度时才有效!
但是,正如我所说,还有优化的空间:
现在,您正在为 创建适配器内 RV父房车内 onBindViewHolder()方法,从而强制内部 RV充气 ViewHolders每次家长 RV决定重用它以前的 ViewHolders通过重新绑定(bind)新值。
您可以为 创建适配器内 RV里面 onCreateVoewHolder()家长 RV并将新列表提交至 notifyDatasetChanged() 内的适配器(随后调用 OnBindViewHolder()) .
上述方法肯定会提高性能,至少在随后的滚动中:回收将适用于 家长 RV卷轴,意思是 RV将保留其 ViewHolders并在一定程度上重复使用它们。
不幸的是,我没有时间为您的场景准确发布代码 fragment ,但您可以查看我的另一个答案:
Show values of same key in one TextView in Recyclerview

关于java - Android RecyclerView 不回收项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63131286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com