RecyclerView中item点击事件
来源:互联网 发布:淘宝超级店长使用教程 编辑:程序博客网 时间:2024/06/05 11:56
自从Google推出RecyclerView后,它就成为"宠儿",自定义插件式的组件用起来很爽。但是很遗憾的是,Google并没有给我们提供item的点击事件函数,但是我们可以类似ListView的item点击事件来构造出我们自己的RecyclerView item的点击事件。首先我们看ListView如何用setOnItemClickListener()方法实现item的点击事件的呢,搞明白这个问题,我们还得去看ListView源码,打开源码发现,查找该方法,竟然查不到,是不是它父类AbsListView中的函数呢,其实也不是的。原来setOnItemClickListener()是AdapterView类中的方法,终于理清楚了关系:
ListView extends AbsListView abstract class AbsListView extends AdapterView<ListAdapter> implements XXXXX abstract class AdapterView<T extends Adapter> extends ViewGroup abstract class ViewGroup extends View implements ViewParent, ViewManager
上面简单给出了ListView类"祖宗"几代的关系图,原来ListView就是个View,哈哈,废话不多说了,感兴趣的朋友可以自己看源码。
那么我们瞧瞧setOnItemClickListener()是如何实现的呢?
public interface OnItemClickListener { /** * Callback method to be invoked when an item in this AdapterView has * been clicked. * <p> * Implementers can call getItemAtPosition(position) if they need * to access the data associated with the selected item. * * @param parent The AdapterView where the click happened. * @param view The view within the AdapterView that was clicked (this * will be a view provided by the adapter) * @param position The position of the view in the adapter. * @param id The row id of the item that was clicked. */ void onItemClick(AdapterView<?> parent, View view, int position, long id);}/** * Register a callback to be invoked when an item in this AdapterView has * been clicked. * * @param listener The callback that will be invoked. */public void setOnItemClickListener(@Nullable OnItemClickListener listener) { mOnItemClickListener = listener;}
从上的源码中,可以找到,用到的是接口回调来完成的。上面的注释说明的太清楚了,不忍心删除因为我没有注释说的好。
下面给出ListView对象变量如何实现item点击事件的:
listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0,View view,final int index,long arg3){/**调用者具体的实现逻辑*/}
});
原来就是这样实现的啊!现在是不是很明白了呢?
说了那么多,接下来我们实战吧!
在开始之前,看下最终demo实现的效果:
上面每一个item都是一个卡片状,而且点击的时候还有水波纹效果,实现上面的效果用到CardView,下面也会简单的介绍CardView使用。
我们item布局文件list_text.xml:(主要就是显示文本,布局比较简单)
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" card_view:cardBackgroundColor="@color/pink" android:layout_marginLeft="@dimen/activity_horizontal_margin" android:layout_marginRight="@dimen/activity_horizontal_margin" android:layout_marginTop="5dp" android:layout_marginBottom="15dp" card_view:cardCornerRadius="10dp" card_view:cardElevation="10dp" android:foreground="@drawable/rippler" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/text" android:layout_width="match_parent" android:gravity="center" android:textSize="50sp" android:layout_height="wrap_content" /> </android.support.v7.widget.CardView>主布局文件activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>下面就是编写代码了,为了方便,全部放在一个类中了:
public class MainActivity extends Activity { private ArrayList<String> array = new ArrayList<String>();private RecyclerView recycler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initdata();recycler = (RecyclerView)findViewById(R.id.recycler_view);LinearLayoutManager layout = new LinearLayoutManager(this);recycler.setLayoutManager(layout);MyAdapter adapter = new MyAdapter();recycler.setAdapter(adapter);<span style="font-size: 11.3pt;"> </span><span style="font-family: Consolas; font-size: 11.3pt;">adapter.setOnItemClickListener(new onRecyclerViewItemClickListener(){</span>@Override public void onItemClick(View view,String data){ Toast.makeText(MainActivity.this,"你好,我是"+data, Toast.LENGTH_SHORT).show(); }});} public void initdata(){for(char i='a';i<='z';i++){array.add(String.valueOf(i));System.out.print(i);}}public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ private onRecyclerViewItemClickListener itemClickListener = null;@Overridepublic int getItemCount() {// TODO 自动生成的方法存根return array.size();}public void onBindViewHolder(ViewHolder viewholder, int position) { //为item布局中的控件设置数值// TODO 自动生成的方法存根viewholder.textview.setText(array.get(position));viewholder.itemView.setTag(viewholder.textview.getText());}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewgroup, int position) {// TODO 自动生成的方法存根View view = LayoutInflater.from(viewgroup.getContext()).inflate(R.layout.list_text,viewgroup,false); //获取item的布局view.setOnClickListener(new OnClickListener() { //为每一个item绑定监听@Overridepublic void onClick(View v) {// TODO 自动生成的方法存根if (itemClickListener != null)<span style="font-family: Consolas; font-size: 11.3pt;"> </span>itemClickListener.onItemClick(v,(String)v.getTag()); }}});return new ViewHolder(view); } public class ViewHolder extends RecyclerView.ViewHolder{ //获取item中的控件 private TextView textview;public ViewHolder(View itemView) {super(itemView);// TODO 自动生成的构造函数存根textview = (TextView)itemView.findViewById(R.id.text);}}public void setOnItemClickListener(onRecyclerViewItemClickListener listener) { this.itemClickListener = listener; // Log.d("ddd", itemClickListener.toString()); } }public interface onRecyclerViewItemClickListener {void onItemClick(View v, String tag);}}看下上面的效果吧:
有朋友会问,怎么少了item之间的分隔条啊,对,下面我们就把分隔条画出来。说到这里感觉本篇介绍的有点多,不过后面也会陆续介绍。public class Dividerlios extends RecyclerView.ItemDecoration{ private final static int ARRAS[] = {android.R.attr.listDivider};//使用系统提供的分隔条 当然也可以自己绘制 private Drawable drawDivider; public Dividerlios(Context context){TypedArray a = context.obtainStyledAttributes(ARRAS);drawDivider = a.getDrawable(0);a.recycle();}public void onDrawOver(Canvas canvas,RecyclerView recyclerView){ //在canvas上画分隔条,要获得分隔条的坐标int left = recyclerView.getPaddingLeft(); int right = recyclerView.getWidth() - recyclerView.getPaddingRight();int childCount = recyclerView.getChildCount();for(int i=0;i<childCount;i++){ //绘制全部的分隔条 View child = recyclerView.getChildAt(i); RecyclerView.LayoutParams parame = (RecyclerView.LayoutParams)child.getLayoutParams(); int top = child.getBottom() + parame.bottomMargin; int bottom = top + drawDivider.getIntrinsicHeight(); drawDivider.setBounds(left, top, right, bottom); drawDivider.draw(canvas);}}}在MainActivity.java中添加:Dividerlios divider= new Dividerlios(MainActivity.this); recycler.addItemDecoration(divider);然后上面的分割线效果就出来了。感兴趣朋友可以自己绘制分割线。
下面简单说明下,item里实现波纹和前景色变化,可以我们自定义drawable资源文件。selecter.xml:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#18ffc400"/> </shape> </item> <item android:state_focused="true" android:state_enabled="true"> <shape android:shape="rectangle"> <solid android:color="#0f000000"/> </shape> </item>rippler.xml:<?xml version="1.0" encoding="utf-8"?><ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#20000000" android:drawable="@drawable/<span style="font-family: Consolas; font-size: 15.0667px; white-space: pre;">selecter.xml</span>" />关于上面drawable资源如何使用,后面的文章会说明。这里不再说明。
很久没更新博客,写博客主要为了巩固知识,如果能帮助到需要的朋友,我会非常开心。
2 2
- RecyclerView中item点击事件
- Android中RecyclerView使用,RecyclerView-Item点击事件设置
- RecyclerView设置Item点击事件
- RecyclerView Item 的点击事件
- RecyclerView设置 item点击事件
- RecyclerView的item点击事件
- RecyclerView item 点击事件设置
- RecyclerView的item点击事件
- RecyclerView中的item点击事件
- RecyclerView的item点击事件
- RecyclerView的Item点击事件
- Android RecyclerView Item点击事件
- RecyclerView的item点击事件
- AndroidStudio GradView在RecyclerView中设置条目(Item)点击事件
- Android中RecyclerView添加item的点击事件
- Android中为RecyclerView添加item的点击事件
- RecyclerView item内部点击事件、item点击事件冲突
- Android-RecyclerView-Item点击事件设置
- JNI log来代替printf打印调试
- skynet
- ejabberd源码分析《一》application启动
- Quick cocos2dx-Lua中计时器(scheduler)
- 数组与字符串简单剖析
- RecyclerView中item点击事件
- 刷题(soj、voj)总结
- Dubbo学习过程、使用经验分享及实现原理简单介绍
- soj - 1001 Alphacode
- oc中的block,认识block
- 【JQuery】delay()方法
- 解决Java中MD5加密utf-8格式时与其他语言不同的问题
- PHP Libevent扩展安装及应用
- Python及bs4、lxml、numpy模块包的安装