RecyclerView点击事件

简介: package zhangphil.myrecyclerview;import android.support.v7.

package zhangphil.myrecyclerview;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Bundle;

/*
 * Android RecyclerView点击事件
 * 
 * 
 * Android最新的RecyclerView没有像之前的Android ListView那样事先已经提供好了
 * onItemClickListener()这样的回调事件响应用户点击。
 * 如果要实现类似ListView的onItemClickListener,则需要我们自己写代码实现。实现的思路和解决方案有多种。
 * 本案例的解决思路是这样的:
 * 第1步:自己写一个public interface OnRecyclerViewItemClickListener,此接口用于回调响应。用户的点击事件。
 * 第2步:把OnRecyclerViewItemClickListener new出来,其实就是完成里面的接口方法:onRecyclerViewItemClickListener()。我们将在onRecyclerViewItemClickListener方法体内完成类似ListView的onItemClickListener()。
 * 第3步,关键点。在此处,实现RecyclerView点击响应回调的解决方案出现多种选择和道路,本案例选择在ViewHolder的构造函数中为参数View增加点击事件:
 * public MyViewHolder(View itemView) {
 super(itemView);

 itemView.setOnClickListener(new View.OnClickListener() {

 @Override
 public void onClick(View v) {
 _click(v);
 }
 });
 }

 然后我们在外部额外多写一个: _click(View v),然后调用_click(v)触发onRecyclerViewItemClickListener(注意:根据需求,此过程中可以携带和传递更多参数):
 _click(View v) {
 mOnRecyclerViewItemClickListener.onRecyclerViewItemClickListener(this, v, pos);
 }

 至此,就完成了为RecyclerView增加点击响应时间的功能。
 * 
 * 
 * 		by Phil
 * 
 * */

public class MainActivity extends ActionBarActivity {

	// 增加点击事件接口 part 1
	private OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener = new OnRecyclerViewItemClickListener() {

		// 具体的点击事件在此
		@Override
		public void onRecyclerViewItemClickListener(ViewHolder holder,
				View view, int pos) {
			Toast.makeText(getApplication(), pos + "", Toast.LENGTH_SHORT)
					.show();
		}
	};

	public interface OnRecyclerViewItemClickListener {
		public void onRecyclerViewItemClickListener(ViewHolder holder,
				View view, int pos);
	}

	private RecyclerView mRecyclerView;

	// 测试用的数据集条目。
	private final int SIZE = 30;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

		LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);

		// Orientation=LinearLayout.HORIZONTAL ,水平的“ListView”。
		// VERTICAL,就是以前的ListView样式。
		mLayoutManager.setOrientation(LinearLayout.HORIZONTAL);
		mRecyclerView.setLayoutManager(mLayoutManager);

		RecyclerView.Adapter mAdapter = new MyRecyclerViewAdapter();
		mRecyclerView.setAdapter(mAdapter);
	}

	public class MyRecyclerViewAdapter extends
			RecyclerView.Adapter<MyViewHolder> {

		public MyRecyclerViewAdapter() {
			super();
		}

		@Override
		public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

			TextView tv = new TextView(getApplication());
			tv.setPadding(20, 10, 20, 10);
			tv.setGravity(Gravity.CENTER);

			MyViewHolder holder = new MyViewHolder(tv);
			holder.text = tv;

			return holder;
		}

		@Override
		public void onBindViewHolder(MyViewHolder viewHolder, int pos) {
			viewHolder.text.setText("pos:" + pos);
			viewHolder.pos = pos;
		}

		@Override
		public int getItemCount() {
			return SIZE;
		}
	}

	private class MyViewHolder extends RecyclerView.ViewHolder {
		public TextView text;
		public int pos;

		public MyViewHolder(View itemView) {
			super(itemView);

			itemView.setOnClickListener(new View.OnClickListener() {

				@Override
				public void onClick(View v) {
					_click(v);
				}
			});
		}

		// 增加点击事件接口 part 2,触发点击事件。
		private final void _click(View v) {
			mOnRecyclerViewItemClickListener.onRecyclerViewItemClickListener(
					this, v, pos);
		}
	}
}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>



相关文章
|
5月前
自定义View实现点击事件
自定义View实现点击事件
42 2
|
Android开发
ScrollView 与 ListView 以及 GridView 滑动冲突完美解决
ScrollView 与 ListView 以及 GridView 滑动冲突完美解决
SwipeRefreshLayout 下拉刷新控件(二)
SwipeRefreshLayout 下拉刷新控件(二)
SwipeRefreshLayout 下拉刷新控件(一)
SwipeRefreshLayout 下拉刷新控件(一)
ScrollView和HorizontalScrollView无法设置点击事件的源码解析
最近的开发过程中,发现存在ScrollView和HorizontalScrollView无法设置点击事件的现象。 我们知道,通常在设置点击事件时,位于View树上方的子View的OnClickListener,会优先于父View的OnClickListener执行。 开发过程中我们会经常使用类似的方式来给布局设置点击事件,比如给ListView的Item背景设置OnClickListener,用于点击item空白区域的跳转操作;然后再给item内部的子元素分别设置OnClickListener用于各自不同的点击操作。
RecyclerView 添加动画
RecyclerView 添加动画
193 0
|
开发者 异构计算
RecyclerView滑动时卡顿怎么办?
RecyclerView滑动时卡顿怎么办?
556 0
RecyclerView滑动时卡顿怎么办?
|
API
为RecyclerView添加下拉刷新功能
在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView。 现今App中列表的下拉刷新和上拉加载已经是一种习惯了,这两个操作也确实方便很多。 为RecyclerView添加这个功能可以通过多种方法,这里我选用了一种简单的做法。基于pulltorefresh这个库。
180 0
|
Java Android开发 索引
使用LayoutAnimationController为RecyclerView添加动画
### 使用LayoutAnimationController为RecyclerView添加动画 @author:莫川 #### 一、前言 为RecyclerView的Item添加动画有很多中方案,比如通过[设置setItemAnimator来实现](https://github.com/wasabeef/recyclerview-animators)或者是[通过遍历Recycler
4823 0