Android中RecyclerView点击Item设置事件

在上一篇Android RecylerView入门教程中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现。博客最下面有Demo程序运行动画。

奉上Demo的Github链接。

在调研过程中,发现有同学修改RecyclerView源码来实现Item的点击监听,但认为这不是一个优雅的解决方案,最终决定在RecyclerView.ViewHolder上做文章。

思路是:因为ViewHolder我们可以拿到每个Item的根布局,所以如果我们为根布局设置单独的OnClick监听并将其开放给Adapter,那不就可以在组装RecyclerView时就能够设置ItemClickListener,只不过这个Listener不是设置到RecyclerView上而是设置到Adapter。

我们首先看ViewHolder的代码:

public class MyViewHolder extends ViewHolder implements OnClickListener,OnLongClickListener{ public ImageView iv; public TextView tv; private MyItemClickListener mListener; private MyItemLongClickListener mLongClickListener; public MyViewHolder(View rootView,MyItemClickListener listener,MyItemLongClickListener longClickListener) { super(rootView); iv = (ImageView)rootView.findViewById(R.id.item_iv); tv = (TextView)rootView.findViewById(R.id.item_tv); this.mListener = listener; this.mLongClickListener = longClickListener; rootView.setOnClickListener(this); rootView.setOnLongClickListener(this); } /** * 点击监听 */ @Override public void onClick(View v) { if(mListener != null){ mListener.onItemClick(v,getPosition()); } } /** * 长按监听 */ @Override public boolean onLongClick(View arg0) { if(mLongClickListener != null){ mLongClickListener.onItemLongClick(arg0, getPosition()); } return true; } }</span>

因为在构造ViewHolder时,rootView将作为一个必传参数传递进来,所以我们只需要拿到rootView并给其绑定点击监听事件即可。

下面要考虑的就是怎样把listener传递进来。Demo中设定了监听点击事件的Interface:MyItemClickListener:

public interface MyItemClickListener { public void onItemClick(View view,int postion); }

MyItemClickListener模仿ListView的OnItemClickListener,开放了view和position两个参数,这对习惯使用ListView的开发者们使用起来更得心应手。从ViewHolder的代码中可以看到,执行onClick方法时会调用getPosition()将当前Item的位置回调给listener。getPosition()是ViewHolder的内置方法,可直接使用。

上面提到过,listener是设定到Adapter上的,所以Adapter就需要对外开放相关方法:

@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent,false); MyViewHolder vh = new MyViewHolder(itemView,mItemClickListener,mItemLongClickListener); return vh; } /** * 设置Item点击监听 * @param listener */ public void setOnItemClickListener(MyItemClickListener listener){ this.mItemClickListener = listener; } public void setOnItemLongClickListener(MyItemLongClickListener listener){ this.mItemLongClickListener = listener; }

上篇博客(Android-RecylerView初识)提到过,Adapter的onCreateViewHolder是负责实例化每个Item的视图,所以我在实例化视图时就将listener传递给ViewHolder。

最后就是组装RecyclerView时根据需求设定点击监听了:

/** * 初始化RecylerView */ private void initView(){ mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView); MyLayoutManager manager = new MyLayoutManager(this); manager.setOrientation(LinearLayout.HORIZONTAL);//默认是LinearLayout.VERTICAL mRecyclerView.setLayoutManager(manager); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); } private void initData(){ this.mData = new ArrayList<MyItemBean>(); for(int i=0;i<20;i++){ MyItemBean bean = new MyItemBean(); bean.tv = "Xmy"+i; mData.add(bean); } this.mAdapter = new MyAdapter(mData); this.mRecyclerView.setAdapter(mAdapter); RecyclerView.ItemDecoration decoration = new MyDecoration(this); this.mRecyclerView.addItemDecoration(decoration); this.mAdapter.setOnItemClickListener(this); this.mAdapter.setOnItemLongClickListener(this); }

Demo为ViewHolder设置了OnClick和OnLongClickListener,在Activity中我们实现了接口方法并在里面打印Toast提示:

@Override public void onItemClick(View view, int postion) { MyItemBean bean = mData.get(postion); if(bean != null){ Toast.makeText(this, bean.tv, Toast.LENGTH_SHORT).show(); } } @Override public void onItemLongClick(View view, int postion) { MyItemBean bean = mData.get(postion); if(bean != null){ Toast.makeText(this, "LongClick "+bean.tv, Toast.LENGTH_SHORT).show(); } }

下面是Demo的运行动画。

以上所述是小编给大家介绍的Android中RecyclerView点击Item设置事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-09-03 22:48:23

Android中RecyclerView点击Item设置事件的相关文章

Android中RecyclerView点击Item设置事件_Android

在上一篇Android RecylerView入门教程中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件,这就需要开发者自己实现.博客最下面有Demo程序运行动画. 奉上Demo的Github链接. 在调研过程中,发现有同学修改RecyclerView源码来实现Item的点击监听,但认为这不是一个优雅的解决方案,最终决定在RecyclerView.ViewHolder上做文章. 思路是:因为ViewH

Android中Listview点击item不变颜色及设置listselector 无效的解决方案_Android

这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listselector,有一个默认的颜色,同理如果点击没颜色变化我们怎么设置listselector也不会变颜色的. 但是在我们的开发过程中,我们可能会碰到这样的问题listview点击不变颜色,总结了一下大概有这几种原因: 1.item的layout设置background颜色值,去掉背景颜色即可 2.listview中listselector属性的效果被覆盖了,比如列表的Item为一个占满单元格的I

Android中Listview点击item不变颜色及设置listselector 无效的解决方案

这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listselector,有一个默认的颜色,同理如果点击没颜色变化我们怎么设置listselector也不会变颜色的. 但是在我们的开发过程中,我们可能会碰到这样的问题listview点击不变颜色,总结了一下大概有这几种原因: 1.item的layout设置background颜色值,去掉背景颜色即可 2.listview中listselector属性的效果被覆盖了,比如列表的Item为一个占满单元格的I

onitemclick-关于android中listview点击item没有反应

问题描述 关于android中listview点击item没有反应 public class MapActivity extends BasePagerActivity { private MapView mMapView = null; private BaiduMap mBaiduMap; private ListView map_menu_lv; @Override protected void onCreate(Bundle savedInstanceState) { // TODO A

Android 中ListView点击Item无响应问题的解决办法

如果listitem里面包括button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最常用的解决办法是在listitem的布局文件中设置descendantFocusability属性. item的布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.androi

Android 中RecyclerView多种item布局的写法(头布局+脚布局)

RecyclerView多个item布局的写法(头布局+脚布局) 上图 github 下载源码 Initial commit第一次提交的代码,为本文内容 以下的为主要代码,看注释即可,比较简单 MainActivity 含上拉加载更多 package com.anew.recyclerviewall; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivi

Android中RecyclerView的item宽高问题详解

前言 本文主要给大家介绍了关于Android中RecyclerView的item宽高问题的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 在创建viewholder传入的View时,如果不指定其viewgroup,就会出现宽高只包裹显示内容的问题. View view = LayoutInflater.from(context).inflate(R.layout.test_test,null); 上面的做法就会出问题 改成这样就可以正常显示设置的宽高 View vie

Android关于listview点击item中某一个按钮把这个item置顶的问题

问题描述 Android关于listview点击item中某一个按钮把这个item置顶的问题 大神告知我如何点击listview中item的某一个按钮·把相应的item进行置顶呢?或者说不用listview用动态加载如何实现呢? 解决方案 置顶,其实就是把你点击的这个item放到数据源列表的第一项,然后notify一下 解决方案二: 比如你的listview对应的数据列表为items,在getview时,可以在每个试图中保留位置postion,当点击时,取出postion,然后取出items中p

Android中RecyclerView拖拽、侧删功能的实现代码

废话不多说,下面展示一下效果. 这是GridView主文件实现. public class GridViewActivity extends AppCompatActivity { RecyclerView mRecyclerView; List<String> mStringList; RecyclerAdapter mRecyAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { s