对RecyclerView的item添加点击事件
对于用惯了listview的程序猿来说,recyclerview没有item没有点击事件实在是一件很蛋疼的事情。在某些情况下,recyclerview确实要比listview好用的多,所以,今天闲来无事,就研究研究,给recyclerview的item添加个点击事件,废话不多说,直接上代码。
1.首先定义一个接口,用于点击事件
- public static interface OnItemClickListener { void onItemClick(View view , int position);}
2.声明一下这个接口的变量
- private OnItemClickListener mOnItemClickListener = null;//自定义点击事件的接口
3.在onCreateViewHolder()中为每个item添加点击事件
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
- View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); ViewHolder viewHolder = new ViewHolder(view); //将创建的View注册点击事件
- view.setOnClickListener(this); return viewHolder;}
4.将点击事件转移给调用者
- @Override
- public void onClick(View v) {
- if (mOnItemClickListener != null) {
- //注意这里使用getTag方法获取position
- mOnItemClickListener.onItemClick(v,(int)v.getTag());
- }}
5.上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item的position
- @Override
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- ViewHolder viewholder = (ViewHolder) holder;
- viewholder.mTextView.setText(testdatas[position]); //将position保存在itemView的Tag中,以便点击时进行获取
- viewholder.itemView.setTag(position);
- }
6.最后暴露给外面的调用者,定义一个设置Listener的方法()
- public void setOnItemClickListener(OnItemClickListener listener) {
- this.mOnItemClickListener = listener;
- }
7.好了,到了这里,就算大功告成了,接下来就是通过适配器adapter进行调用了,相信大家都会,这里就不累述了。(下附完整代码)。
- /**
- * Created by xiaoyang-1101 on 2017/8/17.
- */
- public class MyTestAdapter extends RecyclerView.Adapter implements View.OnClickListener {
- private String[] testdatas;
- public MyTestAdapter(String[] datas) {
- testdatas = datas;
- }
- private OnItemClickListener mOnItemClickListener = null;
- //自定义点击事件的接口
- public static interface OnItemClickListener {
- void onItemClick(View view , int position);
- }
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
- View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
- ViewHolder viewHolder = new ViewHolder(view);
- //将创建的View注册点击事件
- view.setOnClickListener(this);
- return viewHolder;
- }
- @Override
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- ViewHolder viewholder = (ViewHolder) holder;
- viewholder.mTextView.setText(testdatas[position]);
- //将position保存在itemView的Tag中,以便点击时进行获取
- //可以直接放入其他你需要的对象,一般是放位置信息position
- viewholder.itemView.setTag(position);
- }
- @Override
- public void onClick(View v) {
- if (mOnItemClickListener != null) {
- //注意这里使用getTag方法获取position
- mOnItemClickListener.onItemClick(v,(int)v.getTag());
- }
- }
- public void setOnItemClickListener(OnItemClickListener listener) {
- this.mOnItemClickListener = listener;
- }
- //获取数据的数量
- @Override
- public int getItemCount() {
- return testdatas.length;
- }
- //自定义的ViewHolder,持有每个Item的的所有界面元素
- class ViewHolder extends RecyclerView.ViewHolder {
- public TextView mTextView;
- public ViewHolder(View view){
- super(view);
- mTextView = (TextView) view.findViewById(R.id.my_text);
- }
- }
- }