共享我的封装的 kotlin recycleview adapter (用法更简单)


// 老规矩 先写用法 

// 注: 必须使用 databinding


/**
*b  binding  item 的   (父类) 需强转
*p  position 位置
*   mutableListOf("") 你的实际数据
*
* 后续发一个 支持多种布局的 adapter 
*
/

//  var pAdapter =  PAdapterKt(mutableListOf(""), R.layout.item) { b, p ->
                val ib = b as EmojiFragmentItemBinding
               //在这里 绑定数据 点击事件 等等
              
            }

//    mRecycler.layoutManager = LinearLayoutManager(this)
//    mRecycler.adapter = pAdapter










import androidx.recyclerview.widget.RecyclerView
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import android.view.ViewGroup
import androidx.databinding.ViewDataBinding
import androidx.databinding.DataBindingUtil
import android.view.LayoutInflater
import android.view.View
import java.util.ArrayList


open class PAdapterKt : RecyclerView.Adapter<ListHolder> {
    private var layoutId: Int
    var bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit = { b, p -> }

    //获取从Activity中传递过来每个item的数据集合
    private var mDatas: MutableList<out Any> = ArrayList<Any>()

    //HeaderView, FooterView
    private var mHeaderView: View? = null
    private var mFooterView: View? = null

    constructor(mData: MutableList<out Any>, layoutId: Int) {
        mDatas = mData
        this.layoutId = layoutId
    }

    constructor(mData: Int, layoutId: Int) {
        for (i in 0 until mData) {
            mDatas.add("" as Nothing)
        }
        this.layoutId = layoutId
    }

    constructor(
        mData: MutableList<out Any>,
        layoutId: Int,
        bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit
    ) {
        mDatas = mData
        this.layoutId = layoutId
        this.bindViewInterface = bindViewInterface
    }

    constructor(mData: Int, layoutId: Int,bindViewInterface: (binding: ViewDataBinding, position: Int) -> Unit) {
        for (i in 0 until mData) {
            mDatas.add("" as Nothing)
        }
        this.layoutId = layoutId
        this.bindViewInterface = bindViewInterface
    }

    //HeaderView和FooterView的get和set函数
    var headerView: View?
        get() = mHeaderView
        set(headerView) {
            mHeaderView = headerView
            notifyItemInserted(0)
        }
    var footerView: View?
        get() = mFooterView
        set(footerView) {
            mFooterView = footerView
            notifyItemInserted(itemCount - 1)
        }

    /**
     * 重写这个方法,很重要,是加入Header和Footer的关键,我们通过判断item的类型,从而绑定不同的view    *
     */
    override fun getItemViewType(position: Int): Int {
        if (mHeaderView == null && mFooterView == null) {
            return TYPE_NORMAL
        }
        if (mHeaderView != null) {
            if (position == 0) {
                //第一个item应该加载Header
                return TYPE_HEADER
            }
        }
        if (mFooterView != null) {
            if (position == itemCount - 1) {
                //最后一个,应该加载Footer
                return TYPE_FOOTER
            }
        }
        return TYPE_NORMAL
    }

    //创建View,如果是HeaderView或者是FooterView,直接在Holder中返回
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListHolder {
        if (mHeaderView != null && viewType == TYPE_HEADER) {
            val p = mHeaderView!!.parent as ViewGroup
            p.removeView(mHeaderView)
            return ListHolder(mHeaderView)
        }
        if (mFooterView != null && viewType == TYPE_FOOTER) {
            return ListHolder(mFooterView)
        }
        val binding = DataBindingUtil.inflate<ViewDataBinding>(
            LayoutInflater.from(parent.context),
            layoutId,
            parent,
            false
        )
        val listHolder = ListHolder(binding.root)
        listHolder.binding = binding
        return listHolder
    }

    //绑定View,这里是根据返回的这个position的类型,从而进行绑定的,   HeaderView和FooterView, 就不同绑定了
    override fun onBindViewHolder(holder: ListHolder, position: Int) {
        if (getItemViewType(position) == TYPE_FOOTER) {
            return
        }

        if (getItemViewType(0) != TYPE_HEADER) {
            holder.binding?.let { bindViewInterface(it, position) }
        } else if (position != 0) {
            holder.binding?.let { bindViewInterface(it, position - 1) }
        }

    }

    //返回View中Item的个数,这个时候,总的个数应该是ListView中Item的个数加上HeaderView和FooterView
    override fun getItemCount(): Int {
        return if (mHeaderView == null && mFooterView == null) {
            mDatas.size
        } else if (mHeaderView == null) {
            mDatas.size + 1
        } else if (mFooterView == null) {
            mDatas.size + 1
        } else {
            mDatas.size + 2
        }
    }


    companion object {
        const val TYPE_HEADER = 0 //说明是带有Header的
        const val TYPE_FOOTER = 1 //说明是带有Footer的
        const val TYPE_NORMAL = 2 //说明是不带有header和footer的
    }
}



class ListHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {
    var binding: ViewDataBinding? = null
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以通过以下步骤批量删除Kotlin RecyclerView中的项: 1. 添加一个选择模式。你可以在RecyclerView Adapter中添加一个布尔数组,用于跟踪哪些项被选中。例如: ``` private val selectedItems = BooleanArray(myDataset.size) { false } ``` 2. 在RecyclerView中添加一个选择监听器,用于在用户点击项目时新选择模式。例如: ``` recyclerView.addOnItemTouchListener( RecyclerItemClickListener(context, recyclerView, object : RecyclerItemClickListener.OnItemClickListener { override fun onItemClick(view: View, position: Int) { // toggle selection selectedItems[position] = !selectedItems[position] adapter.notifyItemChanged(position) } }) ) ``` 在此示例中,我们使用`RecyclerItemClickListener`类来检测RecyclerView中的单击事件。当用户单击项目时,我们切换相应位置的`selectedItems`数组中的值,并通知Adapter新项目。 3. 添加一个“删除”按钮,并在单击时删除选定的项目。例如: ``` deleteButton.setOnClickListener { var deletedCount = 0 // 记录已删除的项目数量 for (i in selectedItems.indices.reversed()) { if (selectedItems[i]) { myDataset.removeAt(i) adapter.notifyItemRemoved(i) deletedCount++ } } // 重置选择模式 Arrays.fill(selectedItems, false) adapter.notifyDataSetChanged() Toast.makeText(context, "已删除 $deletedCount 个项目", Toast.LENGTH_SHORT).show() } ``` 在此示例中,我们通过遍历`selectedItems`数组来查找选定的项目。如果选定了项目,则从`myDataset`中删除该项目,并通知Adapter新RecyclerView。最后,我们重置选择模式,并使用`Toast`通知用户已删除的项目数量。 希望这可以帮助你批量删除Kotlin RecyclerView中的项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的小彭彭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值