一、直接在onBindViewHolder方法中实现点击事件即可。(实现的是item中的子组件的点击事件)
二、通过自定义接口方法。
1、自定义接口:
/** * 自定义接口 */ public interface OnRecyclerViewItemClickListener { public void onItemClick(View view, int postion); }
2、在自定义的ViewHolder中实现onClickListener接口。item布局view会通过ViewHolder的构造函数的参数传递过来,所以,可以给这个view添加onClickListener点击事件接口,并实现相应的接口方法。
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView tvCategory; private OnRecyclerViewItemClickListener mListener;// 声明自定义的接口 public ViewHolder(View itemView, OnRecyclerViewItemClickListener mListener) { super(itemView); itemView.setOnClickListener(this); this.mListener = mListener; tvCategory = itemView.findViewById(R.id.Layout_Item_CityLocation_Category_tvTitle); } @Override public void onClick(View v) { //getAdapterPosition()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去 mListener.onItemClick(v, getAdapterPosition()); } }
3、自定义public方法用于将接口暴露给外部。
/** * 定义public方法用以将接口暴露给外部 * @param listener */ public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.myClickItemListener = listener; }
4、在活动中调用。
categoryListAdapter.setOnItemClickListener(new CategoryListAdapter.OnRecyclerViewItemClickListener() { @Override public void onItemClick(View view, int postion) { Toast.makeText(mContext, postion + "", Toast.LENGTH_SHORT).show(); resetBooleanList(booleanList); booleanList.set(postion, true); categoryListAdapter.notifyDataSetChanged(); } });
RecyclerView的数据适配器的完整代码如下:
package com.deepreality.corporation_app.Adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.deepreality.corporation_app.R; import java.util.List; public class CategoryListAdapter extends RecyclerView.Adapter<CategoryListAdapter.ViewHolder> { private Context mContext; private List<String> strList; private List<Boolean> booleanList; private ViewHolder viewHolder; private OnRecyclerViewItemClickListener myClickItemListener;// 声明自定义的接口 public CategoryListAdapter(Context mContext, List<String> strList, List<Boolean> booleanList) { this.mContext = mContext; this.strList = strList; this.booleanList = booleanList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item_citylocation_category, parent, false); viewHolder = new ViewHolder(view, myClickItemListener); return viewHolder; } /** * 定义public方法用以将接口暴露给外部 * @param listener */ public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.myClickItemListener = listener; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { holder.tvCategory.setText(strList.get(position)); if (booleanList.get(position)) { holder.tvCategory.setBackgroundResource(R.color.colorWhite); } else { holder.tvCategory.setBackgroundResource(R.color.colorLightGray); } } @Override public int getItemCount() { return strList.size(); } /** * 自定义接口 */ public interface OnRecyclerViewItemClickListener { public void onItemClick(View view, int postion); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView tvCategory; private OnRecyclerViewItemClickListener mListener;// 声明自定义的接口 public ViewHolder(View itemView, OnRecyclerViewItemClickListener mListener) { super(itemView); itemView.setOnClickListener(this); this.mListener = mListener; tvCategory = itemView.findViewById(R.id.Layout_Item_CityLocation_Category_tvTitle); } @Override public void onClick(View v) { //getAdapterPosition()为Viewholder自带的一个方法,用来获取RecyclerView当前的位置,将此作为参数,传出去 mListener.onItemClick(v, getAdapterPosition()); } } }