在開發中,RecyclerView以其靈活的布局等特性逐漸替代了ListView和GridView。但是RecyclerView自身并沒有item的點擊事件監聽。這就需要我們自己去設置監聽了。
原理:
為RecyclerView的每個子item設置setOnClickListener,然后在onClick中再調用一次對外封裝的接口,將這個事件傳遞給外面的調用者。
1、聲明一個接口(這里使用了泛型,方便通用;也可指定數據的類型),模擬了ListView的OnItemClickListener,聲明onClick方法 和 onLongClick方法,分別對應 點擊事件和 長按事件。
public interface OnItemClickCallback<T> {
// 點擊事件
void onClick(View view , T info);
// 長按事件
void onLongClick(View view , T info);
}
2、在adapter中申明一個該接口變量
// item條目布局注入器
private LayoutInflater mInflater;
// 申明一個點擊事件接口變量
private OnItemClickCallback callback = null;
并在構造方法中,傳入實例,用來將點擊事件轉移給外面的調用者。
public MyAdapter(Context ctx, OnItemClickCallback clickCallback){
this.mInflater = LayoutInflater.from(mContext);
this.callback = clickCallback;
}
在onBindViewHolder方法中將點擊事件轉移給外面的調用者:
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// 給item中的指定控件添加點擊事件(可以是item的子控件,也可以是itemView本身)
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
callback.onClick(view,jsList.get(position));
}
});
}
在Activity中使用
RecyclerView.LayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
myRecycler.setLayoutManager(manager);
// OnItemClickCallback<JsInfo>這里指定數據類型(一般為item的數據模型)
myAdapter= new MyAdapter(this, new OnItemClickCallback<JsInfo>() {
@Override
public void onClick(View view, JsInfo info) {
Toast.makeText(this,"點擊了"+info.getName(),Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(View view, JsInfo info) {
Toast.makeText(this,"長按了"+info.getName(),Toast.LENGTH_SHORT).show();
}
});
myAdapter.setJsData(mDataList);
myRecycler.setAdapter(myAdapter);
效果圖
由于沒有添加分割線,界面比較難看。添加分割線點擊http://www.lxweimin.com/p/fe41428ca2f3
點擊item的效果圖.png