Recycleview的item和item内部点击事件

最近好悠闲,让我感觉自己不是个程序员,公司没啥事做了。。。
很早就想写这篇文章了,只是一直没有机会,毕竟recycleview和listview的点击事件对于新手来说也是个不大不小的坑,但是也不要怕,很简单的,这种东西都是很基础的,毕竟我也只敢写点介绍基础的文章了,有点妄自菲薄了,因为前几天看了大佬写的源码分析让我感觉到虽然入行了快一年,自己还是没摆脱菜鸟的本质,所以只有不断地学习才能变得强大,跑偏了,跑偏了,进入正题..........
这篇文章主要总结一下listview和recycleview的item和它内部控件点击事件和怎么在activity里面实现item和item内部的点击事件。我们主要以recycleview我们一个个地来分析,listview基本被弃用了,不熟悉recycleview的小伙伴可以看一下我的另一篇博客kotlin语言实现简单的recycleview
参考资料 : Android RecyclerView(进阶篇)

1、在adapter内部实现recycleview的item点击事件以及item内部控件的点击事件

这种比较简单,直接在适配器内部实现点击事件
适配器代码:

class RecycleAdapter(var list: MutableList) :
    RecyclerView.Adapter() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
        var view = LayoutInflater.from(parent.context).inflate(R.layout.itemlayout, parent, false)
        return MyHolder(view)
    }

    override fun onBindViewHolder(holder: MyHolder, position: Int) {
        holder.itemView.text2.text = list[position].phoneNumber.toString()
        holder.itemView.text1.text=list[position].name
        holder.itemView.setOnClickListener {
           Log.d("zzp","你点击了第 $position 项")
            /*moitmClick.onItemClick(holder.itemView, position)*/
        }
        holder.itemView.text1.setOnClickListener {
            Log.d("zzp","你点击了第$position 项的姓名")
        }
        holder.itemView.text2.setOnClickListener {
            Log.d("zzp","你点击了第$position 项的电话号码")
        }
    }

    override fun getItemCount(): Int {
        return list.size
    }
  
    class MyHolder(itemview: View?) : RecyclerView.ViewHolder(itemview!!) {
    }
}

activity代码:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recycle.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        var list:MutableList
        list=ArrayList()
        list.add(User("小张",1000000))
        list.add(User("小周",2000000))
        list.add(User("小王",3000000))
        list.add(User("小李",4000000))
        list.add(User("小吴",5000000))
        var adapter=RecycleAdapter(list)
        recycle.adapter=adapter
    }
}

activity_main.xml:




    


itemlayout.xml:



    

    
    
    
    

当我们分别点击第一项的item、内部名字和电话的时候
然后效果是这样的:


image.png

第一种在适配器内部实现点击事件很简单,没啥好说的,只要在适配器的内部方法onBindViewHolder拿到控件,再为控件设置点击事件就可以了。

2、在activity中实现item及内部控件的点击事件

这个就比前一个稍微有点难度,但还是很easy,我把它分为一下几步

1、在适配器里面定义一个接口并实现接口方法
 interface itemClick {
        fun onItemClick(view: View, int: Int)
        fun OnItemNameClick(view: View, int: Int)
        fun onitemPhoneNumberClick(view: View,int: Int)
        fun OnItemLongClick(view: View,int: Int)//item长按点击事件
    }
2、定义接口对象
 private lateinit var moitmClick: itemClick
3、接口对象初始化
 fun setItemClick(itemClick: itemClick) {
        moitmClick = itemClick
    }
4、在onBindViewHolder中实现控件以及item的点击事件,并在点击事件内部实现相应的接口方法
 override fun onBindViewHolder(holder: MyHolder, position: Int) {
        holder.itemView.text2.text = list[position].phoneNumber.toString()
        holder.itemView.text1.text=list[position].name
        holder.itemView.setOnClickListener {
            moitmClick.onItemClick(holder.itemView, position)
        }
        holder.itemView.text1.setOnClickListener {
           moitmClick.OnItemNameClick(holder.itemView.text2,position)
        }
        holder.itemView.text2.setOnClickListener {
            moitmClick.onitemPhoneNumberClick(holder.itemView.text1,position)
        }
       holder.itemView.setOnLongClickListener(object : View.OnLongClickListener {
            override fun onLongClick(v: View?): Boolean {
                moitmClick.OnItemLongClick(holder.itemView,position)
                return true
            }
        })
    }
5、在activity里面调用adapter内的点击事件
 adapter.setItemClick(object :RecycleAdapter.itemClick {
            override fun onItemClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项")
            }

            override fun OnItemNameClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项的名字")
            }

            override fun onitemPhoneNumberClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项的电话")
            }

            override fun OnItemLongClick(view: View, int: Int) {
                Log.d("zzp","你长按了第 $int 项")
            }

        })

下面附上完整的adapter代码和activity代码,布局代码与第一个相同

RecycleAdapter:

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.itemlayout.view.*

/**
 *包名    com.example.recycleviewclick
 *作者    zzp
 *创建时间 2021/9/18 10:46
 *描述    TODO
 */
class RecycleAdapter(var list: MutableList) :
    RecyclerView.Adapter() {
    private lateinit var moitmClick: itemClick
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
        var view = LayoutInflater.from(parent.context).inflate(R.layout.itemlayout, parent, false)
        return MyHolder(view)
    }

    override fun onBindViewHolder(holder: MyHolder, position: Int) {
        holder.itemView.text2.text = list[position].phoneNumber.toString()
        holder.itemView.text1.text=list[position].name
        holder.itemView.setOnClickListener {
            moitmClick.onItemClick(holder.itemView, position)
        }
        holder.itemView.text1.setOnClickListener {
           moitmClick.OnItemNameClick(holder.itemView.text2,position)
        }
        holder.itemView.text2.setOnClickListener {
            moitmClick.onitemPhoneNumberClick(holder.itemView.text1,position)
        }
        holder.itemView.setOnLongClickListener(object : View.OnLongClickListener {
            override fun onLongClick(v: View?): Boolean {
                moitmClick.OnItemLongClick(holder.itemView,position)
                return true
            }
        })

    }

    override fun getItemCount(): Int {
        return list.size
    }
    
    interface itemClick {
        fun onItemClick(view: View, int: Int)
        fun OnItemNameClick(view: View, int: Int)
        fun onitemPhoneNumberClick(view: View,int: Int)
        fun OnItemLongClick(view: View,int: Int)
    }

    fun setItemClick(itemClick: itemClick) {
        moitmClick = itemClick
    }
    class MyHolder(itemview: View?) : RecyclerView.ViewHolder(itemview!!) 
}

activity代码:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        recycle.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        var list:MutableList
        list=ArrayList()
        list.add(User("小张",1000000))
        list.add(User("小周",2000000))
        list.add(User("小王",3000000))
        list.add(User("小李",4000000))
        list.add(User("小吴",5000000))
        var adapter=RecycleAdapter(list)
        recycle.adapter=adapter
        adapter.setItemClick(object :RecycleAdapter.itemClick {
            override fun onItemClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项")
            }

            override fun OnItemNameClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项的名字")
            }

            override fun onitemPhoneNumberClick(view: View, int: Int) {
                Log.d("zzp","你点击了第 $int 项的电话")
            }

            override fun OnItemLongClick(view: View, int: Int) {
                Log.d("zzp","你长按了第 $int 项")
            }

        })
    }
}

上述就是关于recycleview的点击事件,随机附赠了一个item的长按事件,在长按事件中返回true和false是有讲究的,
在开发中我们往往在点击item或其内部控件时与Activity进行数据交互,最好的办法就是第二种把它的点击事件暴露到activity中,或者在adapter构造方法中传入参数,上面只是最简单的称述它的点击事件,具体还需要根据需求来看,比如暴露的接口方法到底需要接收什么参数,这个就需要根据自己需求来随机应变了,好了,就到这吧,我也继续摸鱼去了,有问题留言,一般都会第一时间回复。

你可能感兴趣的:(Recycleview的item和item内部点击事件)