由于RecyclerView没有自带的Item点击事件方法,我们可以在其Adapter中为ViewHolder的view添加点击事件,并在其回调方法中自定义回调。
public class AppListAdapter extends RecyclerView.Adapter<AppListAdapter.ViewHolder> { private Context context; private LayoutInflater inflater; private List<AppModel> appModelList; private OnItemClickListener listener; public AppListAdapter(Context context, List<AppModel> appModelList) { this.context = context; this.appModelList = appModelList; inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.layout_applist_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { AppModel appModel = appModelList.get(position); holder.ivAppIcon.setImageDrawable(appModel.getIcon()); holder.tvAppName.setText(appModel.getAppName()); holder.tvAppPackage.setText(appModel.getPackageName()); holder.tvAppSize.setText(appModel.getAppSize()); //使用holder的itemView来回调自定义的item点击监听 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onItemClick(holder.getAdapterPosition()); } }); } @Override public int getItemCount() { return appModelList.size(); } class ViewHolder extends RecyclerView.ViewHolder{ private ImageView ivAppIcon; private TextView tvAppName; private TextView tvAppPackage; private TextView tvAppSize; public ViewHolder(View itemView) { super(itemView); ivAppIcon = itemView.findViewById(R.id.iv_app_item_icon); tvAppName = itemView.findViewById(R.id.tv_app_item_name); tvAppPackage = itemView.findViewById(R.id.tv_app_item_package); tvAppSize = itemView.findViewById(R.id.tv_app_item_size); } } //自定义回调方法 public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } //自定义接口 public interface OnItemClickListener { void onItemClick(int position); } }
外部只需要调用适配器的setOnItemClickListener方法并传入一个匿名实现的接口即可实现RecyclerView的Item点击事件监听
adapter.setOnItemClickListener(new AppListAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { AppModel model = mList.get(position); Intent intent = new Intent(getActivity(), AppInfoActivity.class); intent.putExtra("app_name", model.getAppName()); intent.putExtra("package_name", model.getPackageName()); getActivity().startActivity(intent); } });