Android Jetpack:如何使用PagingDataAdapter在回收器视图中进行多选?

Android Jetpack:如何使用PagingDataAdapter在回收器视图中进行多选?,android,paging,multi-select,android-jetpack,Android,Paging,Multi Select,Android Jetpack,我想在我的android应用程序中进行多选。 我以前做过这件事,但只是用了一个很好的适配器 我有一个流作为我的数据集,我使用一个带有ViewHolder的PagingDataAdapter 我的问题是,如果数据集不仅仅是一个列表,而且我不能很容易地访问它,如何进行多重选择 如果要查找代码,请重新查看以下内容: 我已经实现了一种定制的方法 我在适配器中使用了一个可观察列表,并向视图持有者公开方法来选择自己 当然,您可以为此创建一个基类。我最终也应该这么做:) 我的代码: class Photo

我想在我的android应用程序中进行多选。 我以前做过这件事,但只是用了一个很好的适配器

我有一个流作为我的数据集,我使用一个带有ViewHolder的PagingDataAdapter

我的问题是,如果数据集不仅仅是一个列表,而且我不能很容易地访问它,如何进行多重选择

如果要查找代码,请重新查看以下内容:


我已经实现了一种定制的方法

我在适配器中使用了一个可观察列表,并向视图持有者公开方法来选择自己

当然,您可以为此创建一个基类。我最终也应该这么做:)

我的代码:

class PhotoAdapter(
    private val context: Context,
    private val photoRepository: PhotoRepository,
    private val viewPhotoCallback: KFunction1<Int, Unit>,
    val lifecycleOwner: LifecycleOwner
) : PagingDataAdapter<Photo, PhotoItemViewHolder>(differCallback) {

    /**
     * Holds the layout positions of the selected items.
     */
    val selectedItems = ObservableArrayList<Int>()

    /**
     * Holds a Boolean indicating if multi selection is enabled. In a LiveData.
     */
    var isMultiSelectMode: MutableLiveData<Boolean> = MutableLiveData(false)

    override fun onBindViewHolder(holderItem: PhotoItemViewHolder, position: Int) {
        holderItem.bindTo(this, getItem(position))
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoItemViewHolder =
        PhotoItemViewHolder(parent, context, photoRepository)

    /**
     * Called by ui. On Click.
     */
    fun viewPhoto(position: Int) {
        viewPhotoCallback.invoke(getItem(position)?.id!!)
    }

    /**
     * Disables multi selection.
     */
    fun disableSelection() {
        selectedItems.clear()
        isMultiSelectMode.postValue(false)
    }

    /**
     * Enables multi selection.
     */
    fun enableSelection() {
        isMultiSelectMode.postValue(true)
    }

    /**
     * Add an item it the selection.
     */
    fun addItemToSelection(position: Int): Boolean = selectedItems.add(position)

    /**
     * Remove an item to the selection.
     */
    fun removeItemFromSelection(position: Int) = selectedItems.remove(position)

    /**
     * Indicate if an item is already selected.
     */
    fun isItemSelected(position: Int) = selectedItems.contains(position)

    /**
     * Indicate if an item is the last selected.
     */
    fun isLastSelectedItem(position: Int) = isItemSelected(position) && selectedItems.size == 1

    /**
     * Select all items.
     */
    fun selectAll() {
        for (i in 0 until itemCount) {
            if (!isItemSelected(i)) {
                addItemToSelection(i)
            }
        }
    }

    /**
     * Get all items that are selected.
     */
    fun getAllSelected(): List<Photo> {
        val items = mutableListOf<Photo>()
        for(position in selectedItems) {
            val photo = getItem(position)
            if (photo != null) {
                items.add(photo)
            }
        }
        return items
    }

    companion object {
        private val differCallback = object : DiffUtil.ItemCallback<Photo>() {

            override fun areItemsTheSame(oldItem: Photo, newItem: Photo): Boolean =
                oldItem.id == newItem.id

            override fun areContentsTheSame(oldItem: Photo, newItem: Photo): Boolean =
                oldItem == newItem

        }
    }

}
类光适配器(
私有val上下文:上下文,
私人val光沉积:光沉积,
private val viewPhotoCallback:KFunction1,
val lifecycleOwner:lifecycleOwner
):PagingDataAdapter(DifferenceCallback){
/**
*保存选定项目的布局位置。
*/
val selectedItems=observearraylist()
/**
*保存一个布尔值,指示是否启用了多选。在LiveData中。
*/
var isMultiSelectMode:MutableLiveData=MutableLiveData(false)
覆盖BindViewHolder(holderItem:PhotoItemViewHolder,位置:Int){
holderItem.bindTo(这个,getItem(位置))
}
重写CreateViewHolder(父级:ViewGroup,viewType:Int):PhotoItemViewHolder=
PhotoItemViewHolder(父项、上下文、Photopository)
/**
*由ui调用。单击。
*/
趣味视图照片(位置:Int){
调用(getItem(position)?.id!!)
}
/**
*禁用多重选择。
*/
趣味禁用选择(){
selectedItems.clear()
isMultiSelectMode.postValue(false)
}
/**
*启用多重选择。
*/
趣味使能选择(){
isMultiSelectMode.postValue(真)
}
/**
*将项目添加到所选内容中。
*/
fun addItemToSelection(位置:Int):Boolean=selectedItems.add(位置)
/**
*删除所选内容中的项目。
*/
fun removietemfromselection(position:Int)=selectedItems.remove(position)
/**
*指示是否已选择某个项目。
*/
fun isItemSelected(位置:Int)=selectedItems.contains(位置)
/**
*指示项目是否为最后选定的项目。
*/
乐趣isLastSelectedItem(位置:Int)=isItemSelected(位置)&&selectedItems.size==1
/**
*选择所有项目。
*/
fun selectAll(){
for(在itemCount之前,0中的i){
如果(!isItemSelected(i)){
增补选举(一)
}
}
}
/**
*获取选定的所有项目。
*/
fun getAllSelected():列表{
val items=mutableListOf()
for(在selectedItems中的位置){
val photo=getItem(位置)
如果(照片!=null){
项目。添加(照片)
}
}
退货项目
}
伴星{
private val differCallback=对象:DiffUtil.ItemCallback(){
覆盖有趣的项目相同(旧项目:照片,新项目:照片):布尔值=
oldItem.id==newItem.id
覆盖内容相同(旧项:照片,新项:照片):布尔值=
oldItem==newItem
}
}
}

class PhotoAdapter(
    private val context: Context,
    private val photoRepository: PhotoRepository,
    private val viewPhotoCallback: KFunction1<Int, Unit>,
    val lifecycleOwner: LifecycleOwner
) : PagingDataAdapter<Photo, PhotoItemViewHolder>(differCallback) {

    /**
     * Holds the layout positions of the selected items.
     */
    val selectedItems = ObservableArrayList<Int>()

    /**
     * Holds a Boolean indicating if multi selection is enabled. In a LiveData.
     */
    var isMultiSelectMode: MutableLiveData<Boolean> = MutableLiveData(false)

    override fun onBindViewHolder(holderItem: PhotoItemViewHolder, position: Int) {
        holderItem.bindTo(this, getItem(position))
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoItemViewHolder =
        PhotoItemViewHolder(parent, context, photoRepository)

    /**
     * Called by ui. On Click.
     */
    fun viewPhoto(position: Int) {
        viewPhotoCallback.invoke(getItem(position)?.id!!)
    }

    /**
     * Disables multi selection.
     */
    fun disableSelection() {
        selectedItems.clear()
        isMultiSelectMode.postValue(false)
    }

    /**
     * Enables multi selection.
     */
    fun enableSelection() {
        isMultiSelectMode.postValue(true)
    }

    /**
     * Add an item it the selection.
     */
    fun addItemToSelection(position: Int): Boolean = selectedItems.add(position)

    /**
     * Remove an item to the selection.
     */
    fun removeItemFromSelection(position: Int) = selectedItems.remove(position)

    /**
     * Indicate if an item is already selected.
     */
    fun isItemSelected(position: Int) = selectedItems.contains(position)

    /**
     * Indicate if an item is the last selected.
     */
    fun isLastSelectedItem(position: Int) = isItemSelected(position) && selectedItems.size == 1

    /**
     * Select all items.
     */
    fun selectAll() {
        for (i in 0 until itemCount) {
            if (!isItemSelected(i)) {
                addItemToSelection(i)
            }
        }
    }

    /**
     * Get all items that are selected.
     */
    fun getAllSelected(): List<Photo> {
        val items = mutableListOf<Photo>()
        for(position in selectedItems) {
            val photo = getItem(position)
            if (photo != null) {
                items.add(photo)
            }
        }
        return items
    }

    companion object {
        private val differCallback = object : DiffUtil.ItemCallback<Photo>() {

            override fun areItemsTheSame(oldItem: Photo, newItem: Photo): Boolean =
                oldItem.id == newItem.id

            override fun areContentsTheSame(oldItem: Photo, newItem: Photo): Boolean =
                oldItem == newItem

        }
    }

}
类PhotoItemViewHolder(
父对象:视图组,
私有val上下文:上下文,
私人val光沉积:光沉积
):RecyclerView.ViewHolder(
LayoutFlater.from(parent.context)。充气(R.layout.photo_项,parent,false)
) {
private val imageView:imageView=itemView.findViewById(R.id.photoItemImageView)
private val checkBox:checkBox=itemviewbyd(R.id.photoItemCheckBox)
变量photo:photo?=null
专用lateinit变量适配器:PhotoAdapter
/**
*将父适配器和照片绑定到ViewHolder。
*/
有趣的bindTo(适配器:PhotoAdapter,照片:photo?){
这张照片
this.adapter=适配器
imageView.setOnClickListener{
if(adapter.isMultiSelectMode.value!!){
//如果单击的项目是最后选定的项目
if(适配器isLastSelectedItem(布局位置)){
adapter.disableSelection()
return@setOnClickListener
}
//如果尚未选中,则设置为选中
setItemChecked(!adapter.isItemSelected(layoutPosition))
}否则{
适配器.视图照片(布局位置)
}
}
imageView.setOnLongClickListener{
如果(!adapter.isMultiSelectMode.value!!){
adapter.enableSelection()
setItemChecked(真)
}
真的
}
adapter.isMultiSelectMode.observe(adapter.lifecycleOwner{
如果(it){//启用选择时,显示复选框
checkBox.show()
}否则{
checkBox.hide()
}
})
adapter.selectedItems.addOnListChangedCallback(在SelectedItemsChanged上)
listChanged()
加载缩略图()
}
/**
*侦听器,用于查看选定图像中的更改。
*无论发生什么,都调用[listChanged]。
*/
私人val onSelectedItemsChanged=
对象:observeList.OnListChangedCallback(){
更改后覆盖乐趣(发件人:ObservableList?){
listChanged()
}
覆盖已更改的参数(
发送者:观察者?,
位置开始:Int,
itemCount:Int
) {
listChanged()
}
覆盖已插入的参数(
发送者:观察者?,
位置开始:Int,