RecyclerView 的 Item 的單擊事件
阿新 • • 發佈:2018-11-20
RecyclerView 的每個Item的點選事件並沒有像 ListView 一樣封裝在元件中,需要 Item 的單擊事件時就需要自己去實現,在 Adapter 中為RecyclerView 新增單擊事件參考如下:
RecyclerView的使用方法請參考:RecyclerView的簡單使用
第一步:
在 RecyclerView 的 Adapyer 中定義單擊事件的回撥介面:
/**
* 定義 RecyclerView 選項單擊事件的回撥介面
*/
public interface OnItemClickListener{
//引數(父元件,當前單擊的View,單擊的View的位置,資料)
void onItemClick(RecyclerView parent,View view, int position, String data);
}
第二步:
在RecyclerView的Adapyer中宣告該介面,並提供setter方法:
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
第三步:
在RecyclerView的Adapyer類實現View.OnClickListener介面,並重寫onClick(View view)方法,然後設定給介面的事件監聽:
public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
...
view.setOnClickListener(this);//設定監聽器
...
@Override
public void onClick(View view) {
//根據RecyclerView獲得當前View的位置
int position = recyclerView.getChildAdapterPosition(view);
//程式執行到此,會去執行具體實現的onItemClick()方法
if (onItemClickListener!=null){
onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
}
}
...
}
第四步:
在MainActivity中通過Adapter設定每個Item的單擊事件:
adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position, String data) {
Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
}
});
參考程式碼
Adapter
/**
* Created by jzman on 2017/5/13 0013.
* RecycleView的Adapter
*/
public class RvAdapter1 extends RecyclerView.Adapter<RvAdapter1.DataViewHolder> implements View.OnClickListener{
private Context mContext;
private RecyclerView recyclerView;
private ArrayList<String> mList;
public RvAdapter1() {}
public RvAdapter1(Context mContext, ArrayList<String> mList) {
this.mContext = mContext;
this.mList = mList;
}
/**
* 用於建立ViewHolder
* @param parent
* @param viewType
* @return
*/
@Override
public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item,null);
view.setOnClickListener(this);
//使用程式碼設定寬高(xml佈局設定無效時)
view.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
DataViewHolder holder = new DataViewHolder(view);
return holder;
}
/**
* 繫結資料
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(DataViewHolder holder, int position) {
holder.tv_data.setText(mList.get(position));
}
/**
* 選項總數
* @return
*/
@Override
public int getItemCount() {
return mList.size();
}
@Override
public void onClick(View view) {
//根據RecyclerView獲得當前View的位置
int position = recyclerView.getChildAdapterPosition(view);
//程式執行到此,會去執行具體實現的onItemClick()方法
if (onItemClickListener!=null){
onItemClickListener.onItemClick(recyclerView,view,position,mList.get(position));
}
}
/**
* 建立ViewHolder
*/
public static class DataViewHolder extends RecyclerView.ViewHolder{
TextView tv_data;
public DataViewHolder(View itemView) {
super(itemView);
tv_data = (TextView) itemView.findViewById(R.id.tv_recycle);
}
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener = onItemClickListener;
}
/**
* 定義RecyclerView選項單擊事件的回撥介面
*/
public interface OnItemClickListener{
//引數(父元件,當前單擊的View,單擊的View的位置,資料)
void onItemClick(RecyclerView parent,View view, int position, String data);
}
/**
* 將RecycleView附加到Adapter上
*/
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView= recyclerView;
}
/**
* 將RecycleView從Adapter解除
*/
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
this.recyclerView = null;
}
}
MainActivity
/**
* Created by jzman on 2017/5/13 0013.
*/
public class MainActivity extends AppCompatActivity {
private RecyclerView rv;
RvAdapter1 adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = (RecyclerView) findViewById(R.id.rv);
//設定佈局管理器
// rv.setLayoutManager(new LinearLayoutManager(this));//線性
rv.setLayoutManager(new GridLayoutManager(this,4));//線性
// rv.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//線性
adapter = new RvAdapter1(this,initData());
adapter.setOnItemClickListener(new RvAdapter1.OnItemClickListener() {
@Override
public void onItemClick(RecyclerView parent, View view, int position, String data) {
Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
}
});
rv.setAdapter(adapter);
}
public static ArrayList<String> initData(){
ArrayList<String> arrayList = new ArrayList<>();
for (int i=0;i<50;i++){
arrayList.add("第"+i+"條資料");
}
return arrayList;
}
}
顯示效果
可以關注微信公眾號:jzman-blog 獲取最新文章更新,歡迎一起交流學習!