具有复杂性项目的RecyclerView滚动问题

我面临复杂项目拖延滚动的问题。 我试图建立如下图所示的视图。 Many more item like this

我试图#setHasStableIds #hasFixedSize #PreCacheLinearLayout #setItemViewCacheSize ... 很多方法,但仍然落后。我知道可能是我的商品太复杂了,但这是要求:( 如果您有解决此问题的想法,请帮助我!非常感谢

我的适配器是多视图类型。使用数据绑定,MVVM。此RecyclerView也在CoordinatorLayout的AppBarLayout下方。

RecyclerView:

            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>,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>,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"
            />

还有很多代码,但与上面类似。非常感谢!

kuuipoio 回答:具有复杂性项目的RecyclerView滚动问题

您好@Duy Pls使用此方法。rv.getRecycledViewPool()。setMaxRecycledViews(0,0);可能会有所帮助。.有关方法说明,请参见this链接。.

本文链接:https://www.f2er.com/3081558.html

大家都在问