Recyclerview становится тяжелым - PullRequest
0 голосов
/ 07 февраля 2019

У меня бесконечная прокрутка 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)
    }
}

PS: Я закомментировал вселогика внутри моих ItemViews, так что в методе onBind() ничего не происходит, я просто показываю пустую компоновку, но все же после нескольких загрузок переработчик начинает тормозить.

1 Ответ

0 голосов
/ 08 февраля 2019

Отвечая на мой собственный вопрос, проблема заключалась в размещении RecyclerView внутри NestedScrollView.Я нуждался в этом, потому что был вид выше RecyclerView, который нужно было прокрутить.Я удалил его и поставил как первый элемент в моем RecyclerView.Происходило то, что предметы из RecyclerView не подвергались переработке, поскольку их высота только увеличивалась.

Вердикт: никогда не помещайте RecyclerView внутрь NestedScrollView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...