RecyclerView中item点击事件

自从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; @Override protected 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;
		
		@Override
		public 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());
		}

		@Override
		public 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绑定监听
				@Override
				public 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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: RecyclerViewitem点击事件可以通过以下步骤实现: 1. 在RecyclerView的Adapter定义一个接口,用于回调item点击事件。 2. 在ViewHolder设置item点击事件,当item被点击时,调用接口的回调方法。 3. 在Activity或Fragment实现接口,处理item点击事件。 具体实现步骤可以参考以下代码: 1. 在Adapter定义接口: ``` public interface OnItemClickListener { void onItemClick(int position); } private OnItemClickListener mOnItemClickListener; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } ``` 2. 在ViewHolder设置item点击事件: ``` public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(getAdapterPosition()); } } } ``` 3. 在Activity或Fragment实现接口: ``` mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { // 处理item点击事件 } }); ``` 以上就是RecyclerViewitem点击事件的实现方法。 ### 回答2: RecyclerView是Android一个非常常用的控件之一。它是ListView的升级版,具有更好的性能和更强的可扩展性,因为它可以使用不同的布局管理器来定义不同的布局。 在RecyclerView,每个item都是由一个ViewHolder来控制,因此我们可以通过对ViewHolder进行控制来实现item点击事件。 首先,我们需要在RecyclerView的适配器item添加点击事件监听器。为此,我们需要定义一个接口来处理点击事件: public interface OnItemClickListener { void onItemClick(View view, int position); } 其View代表被点击的View,position代表item的位置。 然后,在RecyclerViewViewHolder,我们需要将点击事件ViewHolder绑定在一起,以便处理点击事件: public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private OnItemClickListener mListener; public ViewHolder(View itemView, OnItemClickListener listener) { super(itemView); mListener = listener; itemView.setOnClickListener(this); } @Override public void onClick(View v) { if (mListener != null) { mListener.onItemClick(v, getAdapterPosition()); } } } 在ViewHolder,我们首先将监听器传递进来,并将itemView点击事件ViewHolder绑定在一起。当itemView被点击时,就会调用onClick方法,我们在onClick方法点击事件通过接口传递给外部进行处理。 最后,在RecyclerView的适配器,我们需要实现OnItemClickListener接口,以处理item点击事件: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements OnItemClickListener { //其他代码省略 @Override public void onBindViewHolder(ViewHolder holder, int position) { //设置item的数据 holder.itemView.setTag(position); } @Override public void onItemClick(View view, int position) { //处理点击事件 Toast.makeText(mContext, "你点击了第" + position + "个item", Toast.LENGTH_SHORT).show(); } } 在适配器,我们需要将OnItemClickListener绑定在ViewHolder,并在onBindViewHolder方法设置item的数据。当item被点击时,就会调用onItemClick方法,我们可以在这里处理item点击事件。 综上所述,通过以上步骤,我们可以实现RecyclerView item点击事件。 ### 回答3: RecyclerView是Android常用的视图控件之一,它具有高度的可扩展性和足够的定制化能力,以满足开发人员的需求。RecyclerView的每个item都可以添加点击事件,来实现对item的响应。 为RecyclerViewitem添加点击事件,需要通过实现RecyclerView的OnItemClickListener接口来实现。首先,需要编写一个自定义的RecyclerViewAdapter类,并在 onCreateViewHolder() 方法为每个item添加点击事件监听器。 在onCreateViewHolder()方法,创建view holder并返回。 可以在这个方法设置监听器,如以下代码示例所示: ``` @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View view = LayoutInflater.from(context).inflate(R.layout.your_layout_file, parent, false); // set the view's size, margins, paddings and layout parameters RecyclerViewHolder viewHolder = new RecyclerViewHolder(view); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // item 点击事件处理 } }); return viewHolder; } ``` 在监听器的onClick()方法,我们可以根据需求来实现对item的点击响应,例如打开一个新的activity或是刷新当前的activity等。 另外,也可以通过在自定义的RecyclerViewHolder类item添加点击事件,有时候 为了给不同类型的view设置不同的点击事件时,我们需要根据view type来设置点击响应。 ``` class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textView; RecyclerViewHolder(View view) { super(view); textView = view.findViewById(R.id.text_view); view.setOnClickListener(this); } @Override public void onClick(View v) { // item点击事件处理 } } ``` 综上所述,RecyclerViewitem点击事件可以通过实现RecyclerView的OnItemClickListener接口来实现,添加点击监听器可以通过在onCreateViewHolder()方法为每个item添加点击事件监听器或是在自定义ViewHolder实现。根据需求可以针对不同情况进行调整实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值