本文主要介紹:如何給RecyclerView添加點擊事件。在這之前,小編搜索過,但沒有搜到步驟很全的文章。所以,以此記錄,希望能對一些朋友有所幫助。
給RecyclerView添加點擊事件,主要分為三步:
第一步:定義事件接口
public interface OnItemClickListener {
? void onItemClick(View view, int position);
}
第二步:設置RecyclerView數(shù)據(jù)適配器
以下只列出了部分重要代碼,文末有整個Acticity代碼:
public class MyAdapter extends RecyclerView.Adapter implementsView.OnClickListener {
? private OnItemClickListener mOnItemClickListener = null;
? @Override
? public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item_main, null);
// 給View注冊點擊事件
view.setOnClickListener((View.OnClickListener) this);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
MyViewHolder holder2 = (MyViewHolder) holder;
Model model = mData.get(position);
holder2.userName.setText(model.getName());
// 將position保存在itemView的Tag中,以便點擊時進行獲取
holder2.itemView.setTag(position);
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
// 注意這里使用getTag方法獲取position
mOnItemClickListener.onItemClick(v, (int)v.getTag());
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
}
第三步:監(jiān)聽點擊事件
myAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position){
// 在這里處理item的點擊事件
}
});
Activity完整代碼:
public class MainActivity extends AppCompatActivity {
private MyAdapter myAdapter;
private ArrayList<Model> list = new ArrayList<>();// 數(shù)據(jù)源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myAdapter = newWaterFallAdapter(this, list);
// 找到RecyclerView控件
RecyclerView mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
mRecyclerView.setAdapter(myAdapter);
// 設置監(jiān)聽事件
myAdapter.setOnItemClickListener(newOnItemClickListener() {
@Override
public voidonItemClick(View view, int position){
// 在這里處理item的點擊事件,position就是點擊的item
}
});
}
// 定義接口
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public class MyAdapter extends RecyclerView.Adapter implements View.OnClickListener {
private final Context mContext;
private ArrayList<Model>?mData;//定義數(shù)據(jù)源
private OnItemClickListener mOnItemClickListener = null;
//定義適配器構造方法,默認傳入上下文和數(shù)據(jù)源
public MyAdapter(Context context, ArrayList<Model> data) {
mContext = context;
mData = data;
}
// 將ItemView渲染進來,創(chuàng)建ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item_main, null);
//將創(chuàng)建的View注冊點擊事件
view.setOnClickListener((View.OnClickListener) this);
return new MyViewHolder(view);
}
// 將數(shù)據(jù)源的數(shù)據(jù)綁定到相應控件上
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, intposition) {
MyViewHolder holder2 = (MyViewHolder) holder;
HomeModel model = mData.get(position);
holder2.userName.setText(model.getName());
// 將position保存在itemView的Tag中,以便點擊時進行獲取
holder2.itemView.setTag(position);
}
@Override
public int getItemCount() {
return list.size();
}
//定義自己的ViewHolder,將View的控件引用在成員變量上
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView userName;
public MyViewHolder(View itemView) {
super(itemView);
userName = (TextView) itemView.findViewById(R.id.recycler_view_tv);
}
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意這里使用getTag方法獲取position
mOnItemClickListener.onItemClick(v, (int)v.getTag());
}
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.mOnItemClickListener = listener;
}
}