Fragment中为RecyclerView实现OnItemClickListener报错如何解决
问题原因
RecyclerView 本身未内置 setOnItemClickListener() API,该方法是 AdapterView 子类(如 ListView、GridView)的独有方法,所以你调用时会出现标红报错。
解决方案
需要自定义点击回调接口,在 Adapter 中绑定点击事件触发回调,再在 Fragment 中接收回调处理跳转逻辑,修改代码如下:
第一步:修改 RecycleViewWorldAdapter 类
public class RecycleViewWorldAdapter extends RecyclerView.Adapter<RecycleViewWorldAdapter.MyViewHolder> { private ArrayList<WorldDataModel> worldDataModelArrayList; // 自定义点击回调接口 public interface OnItemClickListener { void onItemClick(int position); } private OnItemClickListener mListener; // 提供设置回调的公共方法 public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } public class MyViewHolder extends RecyclerView.ViewHolder { public TextView textViewLocationName, textViewPlacesName; public ImageView imageOnCard; public MyViewHolder(View itemView) { super(itemView); textViewLocationName = (TextView) itemView.findViewById(R.id.location_name); textViewPlacesName = (TextView) itemView.findViewById(R.id.places_name); imageOnCard = (ImageView) itemView.findViewById(R.id.image_on_cardview); // 给item根布局设置点击事件 itemView.setOnClickListener(v -> { if (mListener != null) { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { mListener.onItemClick(position); } } }); } } // 其余原有代码保持不变 public RecycleViewWorldAdapter(ArrayList<WorldDataModel> worldDataModelArrayList) { this.worldDataModelArrayList = worldDataModelArrayList; } @Override public MyViewHolder onCreateViewHolder( ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item_layout, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(RecycleViewWorldAdapter.MyViewHolder holder, int position) { WorldDataModel worldDataModel = worldDataModelArrayList.get(position); holder.textViewPlacesName.setText(worldDataModel.getName()); holder.textViewLocationName.setText(worldDataModel.getAddress()); holder.imageOnCard.setImageDrawable(worldDataModel.getImageThumbnail()); } @Override public int getItemCount() { return worldDataModelArrayList.size(); } }
第二步:修改 MountainFragment 类
删除原有 recyclerView.setOnItemClickListener(...) 整段代码,替换为给 Adapter 设置自定义回调的逻辑:
// 原有设置Adapter的代码保持不变 RecycleViewWorldAdapter adapter = new RecycleViewWorldAdapter(mountainArrays); recyclerView.setAdapter(adapter); // 替换原有点击事件代码 adapter.setOnItemClickListener(position -> { Intent intent = new Intent(getActivity(), DetailsActivity.class); intent.putExtra("category", LOCATION_TYPE); intent.putExtra("location", position + 1); startActivity(intent); });
内容的提问来源于stack exchange,提问作者tankian vei
相关产品推荐
相关产品推荐

