Modifying PagedList in Android Paging Architecture library

前端 未结 2 598
深忆病人
深忆病人 2021-02-01 22:34

I\'m currently looking into incorporating the Paging Architecture library (version 2.1.0-beta01 at the time of writing) into my app. One components is a list which

2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-02-01 23:25

    If you want to modify your list without going all the way down to the data layer, you will need to override submitList in your adapter, and then set a callback on your PagedList object. Whenever the PagedList changes, you can then copy those changes to your local dataset. This is not recommended but it's a pretty minimal hack to get working.

    Here's an example:

    class MyListAdapter : PagedListAdapter(MyDiffCallback()) {
    
        /**
         * This data set is a bit of a hack -- we are copying everything the PagedList loads into our
         * own list.  That way we can modify it.  The docs say you should go all the way down to the
         * data source, modify it there, and then bubble back up, but I don't think that will actually
         * work for us when the changes are coming from the UI itself.
         */
        private val dataSet = arrayListOf()
    
        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            //Forces the next page to load when we reach the bottom of the list
            getItem(position)
    
            dataSet.getOrNull(position)?.let {
                holder.populateFrom(it)
            }
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            val view = parent.inflate(R.layout.my_view_holder)
            return MyViewHolder(view)
        }
    
        class MyDiffCallback : DiffUtil.ItemCallback() {
    
            override fun areItemsTheSame(oldItem: MyDataItem, newItem: MyDataItem) =
                    oldItem.id == newItem.id
    
            override fun areContentsTheSame(oldItem: MyDataItem, newItem: MyDataItem) =
                    oldItem == newItem
        }
    
        override fun submitList(pagedList: PagedList?) {
            pagedList?.addWeakCallback(listOf(), object : PagedList.Callback() {
                override fun onChanged(position: Int, count: Int) {
                    dataSet.clear()
                    dataSet.addAll(pagedList)
                }
    
                override fun onInserted(position: Int, count: Int) {
                    dataSet.clear()
                    dataSet.addAll(pagedList)
                }
    
                override fun onRemoved(position: Int, count: Int) {
                    dataSet.clear()
                    dataSet.addAll(pagedList)
                }
            })
            super.submitList(pagedList)
        }
    }
    

提交回复
热议问题