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>