Android Recyclerview变重-跳过帧

Android Recyclerview变重-跳过帧,android,android-recyclerview,android-nestedscrollview,Android,Android Recyclerview,Android Nestedscrollview,我可以无限滚动RecyclerView,当滚动到最后一个项目时,可以从API加载更多的项目,但是在多次滚动之后,我的RecyclerView开始延迟添加新项目和获取新项目 Skipped 197 frames! The application may be doing too much work on its main thread. 在日志中。我找不到是什么导致了滞后 以下是我的方法 val onLoadMore = object : IOnLoadMore { over

我可以无限滚动
RecyclerView
,当滚动到最后一个项目时,可以从API加载更多的项目,但是在多次滚动之后,我的
RecyclerView
开始延迟添加新项目和获取新项目

Skipped 197 frames!  The application may be doing too much work on its main thread.
在日志中。我找不到是什么导致了滞后

以下是我的方法

 val onLoadMore = object : IOnLoadMore {
        override fun onLoadMore() {
            if (!adapter.loadingMore) {
                adapter.addLoadingItem()
                requestSimple()
            }
        }
    }

fun requestSimple() {
    disposable = MyApplication.apiService.offerSearchWithPromo(
            defaultSharedPreferences.getString(Config.PREF_LANG, Config.RU), request!!)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                adapter.removeLoadingItem()
                adapter.items.addAll(it.offers.data)
                if (it.promotions.data.size > 0) adapter.items.add(it.promotions.data)
                adapter.notifyItemRangeInserted(adapter.items.size - it.offers.data.size - 1, it.offers.data.size)
                adapter.meta = it.offers.meta
                tv_found.text = resources.getString(R.string.found) + " " + adapter.meta?.pagination?.total.toString()
                if (it.offers.data.size == 15) adapter.setOnLoadMoreListener(onLoadMore)
                else adapter.removeListener()
                request!!.page++
            }, {
                showError(it.message.toString())
            })
}
这是我的适配器

      class AdrResRvDynamic(var context: Context, nestedScrollView: NestedScrollView? = null, var items: MutableList<Any?>) : RVAdrMutableNullable<Any?, RecyclerView.ViewHolder>(items) {

        var isLoading: Boolean = false
        var meta: ObjMeta? = null
        private var mIOnLoadMore: IOnLoadMore? = null
        private val VIEW_TYPE_AUTO_SIMPLE = 0
        private val VIEW_TYPE_AUTO_VIP = 1
        private val VIEW_TYPE_AUTO_SUGGESTED = 2
        private var VIEW_TYPE_LOADING = 99
        var loadingMore: Boolean = false

        var curr = ""

    init {
        curr = context.defaultSharedPreferences.getString(Config.PREF_CURRENCY, Config.UZS)

        setHasStableIds(true)
        nestedScrollView?.setOnScrollChangeListener { v: NestedScrollView, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->
            if (v.getChildAt(v.childCount - 1) != null) {
                isLoading = if (scrollY >= v.getChildAt(v.childCount - 1).measuredHeight - v.measuredHeight && scrollY > oldScrollY) {
                    if (mIOnLoadMore != null) mIOnLoadMore!!.onLoadMore()
                    true
                } else false
            }
        }
    }

    fun setOnLoadMoreListener(mIOnLoadMore: IOnLoadMore) {
        this.mIOnLoadMore = mIOnLoadMore
    }

    fun removeListener() {
        this.mIOnLoadMore = null
    }

    override fun getItemViewType(position: Int): Int {
        return when {
            items[position] == null -> VIEW_TYPE_LOADING
            items[position]!!::class.simpleName == "ObjAuto" -> VIEW_TYPE_AUTO_SIMPLE
            items[position]!!::class.simpleName == "ObjAutoVip" -> VIEW_TYPE_AUTO_VIP
            items[position] is List<*> -> VIEW_TYPE_AUTO_SUGGESTED
            else -> VIEW_TYPE_LOADING
        }
    }

    @Suppress("UNCHECKED_CAST")
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val obj = items[position]
        when (holder) {
            is ItemViewAutoCard -> holder.bind(obj!! as ObjAuto)
            is ItemViewAutoCardSUGGESTED -> holder.bind(obj!! as List<ObjAuto>)
            is ItemViewAutoCardVIP -> holder.bind(obj!! as ObjAutoVip)
            is ItemViewLoadingMore -> {
//                holder.itemView.find<ProgressBar>(R.id.progressBar1).isIndeterminate = true
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when (viewType) {
            VIEW_TYPE_AUTO_SIMPLE -> ItemViewAutoCard(context, LayoutInflater.from(parent.context).inflate(R.layout.li_auto_card, parent, false))
            VIEW_TYPE_AUTO_VIP -> ItemViewAutoCardVIP(context, LayoutInflater.from(parent.context).inflate(R.layout.li_auto_card_vip, parent, false))
            VIEW_TYPE_AUTO_SUGGESTED -> ItemViewAutoCardSUGGESTED(context, LayoutInflater.from(parent.context).inflate(R.layout.li_auto_card_suggested, parent, false))
            else -> ItemViewLoadingMore(LayoutInflater.from(parent.context).inflate(R.layout.progress_bar_load_more, parent, false))
        }
    }

    override fun getItemCount(): Int {
        return items.size
    }

    fun removeLoadingItem() {
        loadingMore = false

        if (items.size == 0) return
        items.removeAt(items.size - 1)
        notifyItemRemoved(items.size)
    }

    fun addLoadingItem() {
        loadingMore = true
        items.add(null)
        notifyItemInserted(items.size - 1)
    }

    override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
        super.onViewRecycled(holder)
    }
}
类AdrResRvDynamic(变量上下文:上下文,nestedScrollView:nestedScrollView?=null,变量项:MutableList):RVAdrMutableNullable(项){
var isLoading:Boolean=false
变量meta:ObjMeta?=null
私有变量mIOnLoadMore:IOnLoadMore?=null
私有val视图\类型\自动\简单=0
私有val视图\类型\自动\ VIP=1
私有val视图\类型\自动\建议=2
私有变量视图\类型\加载=99
var loadingMore:Boolean=false
var curr=“”
初始化{
curr=context.defaultSharedReferences.getString(Config.PREF_CURRENCY,Config.UZS)
SetHassTableId(真)
nestedScrollView?.setOnScrollChangeListener{v:nestedScrollView,scrollX:Int,scrollY:Int,oldScrollX:Int,oldScrollY:Int->
if(v.getChildAt(v.childCount-1)!=null){
isLoading=if(scrollY>=v.getChildAt(v.childCount-1).measuredHeight-v.measuredHeight&&scrollY>oldScrollY){
如果(mIOnLoadMore!=null)mIOnLoadMore!!.onLoadMore()
真的
}否则错误
}
}
}
有趣的setOnLoadMoreListener(mIOnLoadMore:IOnLoadMore){
this.mIOnLoadMore=mIOnLoadMore
}
乐趣再现者(){
this.mIOnLoadMore=null
}
覆盖getItemViewType(位置:Int):Int{
何时返回{
项目[位置]==null->查看类型\u加载
items[position]!!::class.simpleName==“ObjAuto”->视图\类型\自动\简单
items[position]!!::class.simpleName==“ObjAutoVip”->查看\类型\自动\ VIP
项目[位置]为列表->查看\类型\自动\建议
else->查看\u类型\u加载
}
}
@抑制(“未选中的_CAST”)
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
val obj=项目[位置]
何时(持有人){
is ItemViewAutoCard->holder.bind(obj!!作为ObjAuto)
是ItemViewAutoCard建议->holder.bind(obj!!作为列表)
is ItemViewAutoCardVIP->holder.bind(obj!!作为ObjAutoVip)
ItemViewLoadingMore->{
//holder.itemView.find(R.id.progressBar1).isIndeterminate=true
}
}
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
返回时间(viewType){
查看\类型\自动\简单->ItemViewAutoCard(上下文,LayoutFlater.from(parent.context)。充气(R.layout.li\自动\卡,parent,false))
查看\类型\自动\ VIP->ItemViewAutoCardVIP(上下文,LayoutFlater.from(parent.context)。充气(R.layout.li \自动\卡\ VIP,parent,false))
查看\类型\自动\建议->ItemViewAutoCardSuggered(上下文,LayoutFlater.from(parent.context)。充气(R.layout.li \自动\建议的卡片,parent,false))
else->ItemViewLoadingMore(LayoutInflater.from(parent.context)。充气(R.layout.progress\u bar\u load\u more,parent,false))
}
}
重写getItemCount():Int{
返回项目。大小
}
有趣的音乐{
加载更多=错误
如果(items.size==0)返回
items.removeAt(items.size-1)
notifyItemRemoved(items.size)
}
乐趣添加加载项(){
加载更多=真
items.add(空)
notifyItemInserted(items.size-1)
}
覆盖视图回收(持有者:RecyclerView.ViewHolder){
super.onViewRecycled(支架)
}
}

PS:我已经注释掉了ItemView中的所有逻辑,因此在
onBind()
方法中没有发生任何事情,我只是显示了空布局,但在多次加载之后,回收器仍然变得滞后

回答我自己的问题时,问题是将
RecyclerView
放在
NestedScrollView
中。我需要它,因为上面有一个视图需要滚动。我已将其删除,并将其作为我的
RecyclerView
中的第一项。发生的事情是,
RecyclerView
中的项目没有被回收,因为它的高度只是在扩大


结论:永远不要将
RecyclerView
放在
NestedScrollView

中,同样的问题也发生在我身上。如果我删除nestedscrollview,则recyclerview可以顺利工作,但如果我将相同的recyclerview放在nestedscrollview中并进行分页,则recyclerview开始延迟,应用程序也会因此崩溃,显示内存不足错误,但我需要将我的recyclerview放在nestedscrollview中。您能告诉我如何在不删除nestedscrollview的情况下修复它吗?然后您可以尝试将您的recyclerview高度设置为固定,并自行处理您的滚动调度。例如,您可以检测到nestedScroll视图底部的滚动,当到达时,停止从nestedScroll收听滚动并从recyclerview收听滚动,但这有点困难。我认为更好的方法是将您的recyclerview保持在不可滚动的视图中,并将所需的视图添加为不同的视图持有者…作为页眉或页脚。。。