RecyclerView滚动问题与复杂性项目

问题描述 投票:0回答:1

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

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

我的适配器是多视图类型。使用数据绑定,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>,
            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"
            />

和许多代码,但与上面相似。非常感谢!

android performance android-layout android-recyclerview recycler-adapter
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.