Допустим, у меня есть адаптер для 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?)