android - 复杂项目的RecyclerView滚动问题
问题描述
我面临复杂项目的滞后滚动问题。我试图构建一个如下图所示的视图。 更多这样的项目
我尝试了#setHasStableIds #hasFixedSize #PreCacheLinearLayout #setItemViewCacheSize ... 很多方法,但它仍然滞后。我知道可能是我的项目太复杂了,但这是要求:(如果你有解决这个问题的想法,请帮助我!非常感谢<3
我的适配器是多视图类型。使用数据绑定,MVVM。这个 RecyclerView 也在 CoordinatorLayout 的 AppBarLayout 下面。
回收站视图:
android:id="@+id/rvHome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorGrayLight"
android:clipToPadding="false"
app:items="@{viewModel.listData}"
android:nestedScrollingEnabled="true"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
绑定适配器:
@BindingAdapter("items")
fun<T> setItems(view: RecyclerView, model: ObservableArrayList<T>?) {
model?.let {
if(view.adapter is BaseRecyclerViewAdapter<*>){
(view.adapter as BaseRecyclerViewAdapter<T>).listItem = it;
}
}
}
底座适配器:
abstract class BaseRecyclerViewAdapter<T>() :
RecyclerView.Adapter<BindingViewHolder>() {
var listItem: ObservableArrayList<T>? = null
set(value) {
value?.let {
onSettingListItem(it);
}
field = value
value?.let {
it.addOnListChangedCallback(onListChangedCallback)
}
notifyDataSetChanged()
}
var presenter: Presenter? = null
var decorator: Decorator? = null
fun add(t:T){
listItem?.let {
it.add(t)
notifyDataSetChanged()
}
}
fun addAll(items:Collection<T>){
Log.d("TAG","data $items")
Log.d("TAG","data $listItem")
listItem?.let {
it.addAll(items)
notifyDataSetChanged()
}
}
open fun onSettingListItem(list: ObservableArrayList<T>) {
}
val onListChangedCallback = object : ObservableList.OnListChangedCallback<ObservableList<T>>() {
override fun onChanged(sender: ObservableList<T>) {
notifyDataSetChanged()
}
override fun onItemRangeChanged(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeChanged(positionStart, itemCount)
}
override fun onItemRangeInserted(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeInserted(positionStart, itemCount)
}
override fun onItemRangeMoved(
sender: ObservableList<T>,
fromPosition: Int,
toPosition: Int,
itemCount: Int
) {
notifyItemMoved(fromPosition, toPosition)
}
override fun onItemRangeRemoved(
sender: ObservableList<T>,
positionStart: Int,
itemCount: Int
) {
notifyItemRangeRemoved(positionStart, itemCount)
}
}
override fun onBindViewHolder(holder: BindingViewHolder, position: Int) {
listItem?.let {
val item = it[position]
// set item variable
holder.binding.setVariable(BR.viewModel, item)
}
holder.binding.setVariable(BR.presenter, presenter)
// holder.binding.setVariable(BR.currentPos, position)
holder.binding.executePendingBindings()
if (decorator != null) {
decorator!!.decorate(holder, position, getItemViewType(position))
}
}
override fun getItemCount(): Int {
listItem?.let {
return it.size
}
return 0;
}
interface Presenter {
fun onItemClick(view: View, item: Any, position: Int)
}
interface Decorator {
fun decorate(holder: BindingViewHolder, position: Int, viewType: Int)
}
}
儿童物品 (2):
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_trending_trip"
style="@style/RecyclerHorizontalStyle"
android:nestedScrollingEnabled="false"
app:items="@{viewModel.data}"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>
还有很多代码,但与上面类似。太感谢了!
解决方案
嗨@Duy 请使用此方法.. rv.getRecycledViewPool().setMaxRecycledViews(0, 0); 它可能会有所帮助..有关方法说明,请参阅此链接..