Действительно ли мне нужен DiffUtil.ItemCallback для обновления моего RecyclerView, если его адаптер использует ссылку на MutableListView, управляемый отдельным классом? - PullRequest
0 голосов
/ 03 февраля 2020

Допустим, у меня есть адаптер для RecyclerView, который выглядит следующим образом:

class ContentAdapter(
    private val data: List<ContentModel>,
    private val itemSelectedListener: OnItemSelected<ContentModel>,
    private val activityUIFocusListener: ActivityUIFocusListener? ): RecyclerView.Adapter<ContentViewHolder>() {

    /**
     * For paging signalling purposes
     */
    var pagingOffsetFromItemCount = 1
    var pagingListener : (() -> Unit)? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContentViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.layout_main_content, parent, false)
        return ContentViewHolder(view, itemSelectedListener, activityUIFocusListener)
    }

    override fun onBindViewHolder(holder: ContentViewHolder, position: Int) {
        holder.setUpModelToView(data[position])
        if(position == itemCount - pagingOffsetFromItemCount) {
            pagingListener?.invoke()
        }
    }

    override fun getItemCount(): Int = data.size
}

Переменная data в конструкторе для этого адаптера ссылается на MutableList<ContentModel>, управляемый другим классом, BaseMediaListPagingPresenter:

interface PagingAdapterInterface {
    fun initAdapter(contentModels : List<ContentModel>)
    fun notifyItemsInserted(startIndex : Int, numInserted : Int)
}

open class BaseMediaListPagingPresenter(private val adapterInterface : PagingAdapterInterface) {
    private var dataContent : MutableList<ContentModel> = mutableListOf()
    private var mediaEntityUnderlyingList : MutableList<MediaEntity> = mutableListOf()

    var hasMore = true

    fun populateWithPagedData(entityList : List<MediaEntity>) {
        mediaEntityUnderlyingList.addAll(entityList)

        val oldListNum = dataContent.size
        dataContent.addAll(
            entityList.map {
                return@map it.asContentModel()
            }
        )

        adapterInterface.notifyItemsInserted(oldListNum, entityList.size)
        hasMore = entityList.isNotEmpty()
    }

    init {
        adapterInterface.initAdapter(dataContent)
    }

    fun findCorrespondingMediaEntityOrNull(contentModel : ContentModel) : MediaEntity? {
        val index = dataContent.indexOf(contentModel)
        return if(index > -1) mediaEntityUnderlyingList[index] else null
    }
}

В частности, dataContent в приведенном выше. Между тем фрагмент, реализующий PagingAdapterInterface, имеет следующую реализацию notifyItemsInserted:

override fun notifyItemsInserted(startIndex: Int, numInserted: Int) {
    if(startIndex == 0) {
        adapter.notifyDataSetChanged()
    } else {
        adapter.notifyItemRangeInserted(startIndex, numInserted)
    }
}

adapter, являющуюся экземпляром ContentAdapter.

Поскольку DiffUtil.ItemCallback, по-видимому, предназначен для при этой настройке вместо обмена данными вместо добавления мне действительно нужен DiffUtil.ItemCallback?

(и нужен ли мне вместо этого PagedList?)

...