天天看點

RecyclerView點選事件

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>           



繼續閱讀