RecycleView快速使用(2020/3/25 in Kotlin)

本文详细介绍如何在Android应用中快速使用RecycleView组件。通过三个简单步骤:创建View、创建Adapter并将其与View关联,即可实现数据的高效展示。文章提供具体代码示例,帮助开发者轻松掌握RecycleView的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写这篇文章是为了方便直接使用RecycleView
其中并未叙述原理。

使用RecycleView一共只有三步
步骤1.创建View,如:在main_activity.xml里添加recycleview的View
步骤2.创建Adapter,如:创建继承RecyclerView.Adapter的Adapter
步骤3.给View挂上Adapter,如:在MainActivity里设置view.adapter = myAdapter

实现后的动态效果如下:

1 XML布局里面加上RecyclerView,起个名字(id)
<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/mRecycleView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />
2 在Acticity里给RecycleView设置Adapter
	//初始化RecycleView
    private fun initRecycleView() {
        log("initRecycleView")
        elfHomeAdapter = ElfHomeAdapter()
        mRecycleView.layoutManager = LinearLayoutManager(this)
        mRecycleView.adapter = elfHomeAdapter
    }
3 创建继承了RecyclerView.Adapter的Adapter
class ElfHomeAdapter() :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var mList: ArrayList<ElfData> = ArrayList()    //存储Item数据

    class ElfData(_length: Int, _desc: Int) {    //自定义的Item数据结构
        var length: String = _length.toString()
        var desc: String = _desc.toString()
    }

    companion object {  //标记View的位置
        const val IS_BOTTOM = 1
        const val IS_NOT_BOTTOM = 0
    }

//    //刷新Data,当Activity,onResume时手动调用。(场景:如果你在其他界面改变了数据,回到本场景得手动刷新一下)
//    fun freshData() {
//        val list: ArrayList<ElfData> = ArrayList()
//        val dataSize = sqliteDataManager.getSize()
//        for (i in 1..dataSize) list.add(ElfData(sqliteDataManager.getMovSize(i), i))
//        mList = list
//    }

    //获取想展示的Item的数量
    override fun getItemCount(): Int {
        log("getItemCount " + mList.size)
        return mList.size + 1  //+1是为了显示底部的按钮
    }

    //获取Item的ViewType,给onCreateViewHolder用的。
    override fun getItemViewType(position: Int): Int {
        log("getItemViewType")
        return if (position == mList.size) IS_BOTTOM else IS_NOT_BOTTOM
    }

    //自定义Item的Holder
    internal inner class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var length: TextView = itemView.findViewById(R.id.length)
        var desc: TextView = itemView.findViewById(R.id.desc)
        var enterBtn: Button = itemView.findViewById(R.id.enter)
    }

    //自定义底部按钮的Holder
    internal inner class ButtonHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var addBtn: Button = itemView.findViewById(R.id.newelf)
        var killBtn: Button = itemView.findViewById(R.id.killelf)
    }

    //自定义空白的Holder,不出问题的话,调用不到。
    internal inner class NullHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    private fun log(str: String) {
        Log.d("ElfHomeAdapter", str)
    }

    //当RecyclerView需要RecyclerView.ViewHolder展示Item时调用。
    //(parent就是xml里面的自建的recycleView,viewType用来辅助你生成不同的View)
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        log(parent.accessibilityClassName.toString())
        log("onCreateViewHolder")
        when (viewType) {
            0 -> return ItemHolder(
                LayoutInflater.from(parent.context).inflate(
                    R.layout.item_alf,
                    parent,
                    false
                )
            )
            1 -> return ButtonHolder(
                LayoutInflater.from(parent.context).inflate(
                    R.layout.item_elfmag,
                    parent,
                    false
                )
            )
        }
        return NullHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_elfmag, parent, false)
        )
    }

    //当RecyclerView想展示特定位置的Item时会调用. 可以更新特定Item数据。
    //(holder是自建的holder,position是这个Item的位置)
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        log("onBindViewHolder")
        when (getItemViewType(position)) {
            IS_NOT_BOTTOM -> {
                val itemHolder =
                    holder as ItemHolder
                itemHolder.length.text = mList[position].length
                itemHolder.desc.text = mList[position].desc
                itemHolder.enterBtn.setOnClickListener {
                   	//自定义事件
                }
            }
            IS_BOTTOM -> {
                val buttonHolder = holder as ButtonHolder
                buttonHolder.addBtn.setOnClickListener {
                    val movId = mList.size + 1
                    mList.add(ElfData(0, movId))
                    notifyDataSetChanged()
                }
                if (position > 0) {
                    buttonHolder.killBtn.setOnClickListener {
                        val movSize = mList.size
                        mList.removeAt(movSize - 1)
                        notifyDataSetChanged()
                    }
                    buttonHolder.killBtn.visibility = View.VISIBLE
                } else {
                    buttonHolder.killBtn.visibility = View.INVISIBLE
                }
            }
        }
    }
}

结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值