为何CardView第0项点击会启动2个Activity而非1个?
RecyclerView条目点击启动Activity异常问题修复
我尝试通过setOnItemClickListener结合CardView的position来启动对应Activity,但点击第0项(position=0)时,会先启动第1项对应的Activity,随后才启动第0项的Activity。
原MainActivity中点击监听代码
myAdapter.setOnItemClickListener(new ItemListAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { switch (position) { case 0: Intent activityOne = new Intent(MainActivity.this, activityOne.class); activityOne.putExtra("title", "Restaurant One"); startActivity(activityOne); case 1: Intent activityTwo = new Intent(MainActivity.this, activityTwo.class); activityTwo.putExtra("title", "Restaurant Two"); startActivity(activityTwo); } String title = customList.get(position).getTextHeader(); Toast.makeText(getApplicationContext(), title, Toast.LENGTH_SHORT).show(); } });
原ItemListAdapter代码
public class ItemListAdapter extends RecyclerView.Adapter<ItemListAdapter.ViewHolder> { private ArrayList<Item> myList; private OnItemClickListener myListener; public interface OnItemClickListener { void onItemClick(int position); } public void setOnItemClickListener(OnItemClickListener listener) { myListener = listener; } public static class ViewHolder extends RecyclerView.ViewHolder { public ImageView Logo; public TextView Header; public TextView Desc; public ViewHolder(View itemView, final OnItemClickListener listener) { super(itemView); Logo = itemView.findViewById(R.id.restImage); Header = itemView.findViewById(R.id.header); Desc = itemView.findViewById(R.id.description); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) ; { listener.onItemClick(position); } } } }); } } public ItemListAdapter(ArrayList<Item> exampleList) { myList = exampleList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_list, parent, false); ViewHolder vh = new ViewHolder(v, myListener); return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { Item currentItem = myList.get(position); holder.Logo.setImageResource(currentItem.getImageResource()); holder.Header.setText(currentItem.getTextHeader()); holder.Desc.setText(currentItem.getTextDesc()); } @Override public int getItemCount() { return myList.size(); } }
问题原因及修复方案
1. Switch Case缺少break语句
在onItemClick的switch逻辑中,case 0执行完后没有添加break,导致代码会继续向下执行case 1的逻辑,这就是点击第0项时两个Activity先后启动的直接原因。
修复后的点击监听代码:
myAdapter.setOnItemClickListener(new ItemListAdapter.OnItemClickListener() { @Override public void onItemClick(int position) { switch (position) { case 0: Intent activityOne = new Intent(MainActivity.this, activityOne.class); activityOne.putExtra("title", "Restaurant One"); startActivity(activityOne); break; // 添加break终止当前case逻辑 case 1: Intent activityTwo = new Intent(MainActivity.this, activityTwo.class); activityTwo.putExtra("title", "Restaurant Two"); startActivity(activityTwo); break; // 添加break终止当前case逻辑 } String title = customList.get(position).getTextHeader(); Toast.makeText(getApplicationContext(), title, Toast.LENGTH_SHORT).show(); } });
2. ViewHolder中if语句的语法错误
在ViewHolder的点击监听代码里,if (position != RecyclerView.NO_POSITION)后面多了一个多余的分号;,导致这个判断逻辑完全失效,不管position是否有效都会执行点击回调。虽然这不是本次异常的直接诱因,但会带来潜在的数组越界风险,需要一并修复。
修复后的ViewHolder点击监听代码片段:
itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { int position = getAdapterPosition(); // 移除多余的分号,让判断逻辑生效 if (position != RecyclerView.NO_POSITION) { listener.onItemClick(position); } } } });
内容的提问来源于stack exchange,提问作者Yong_
相关产品推荐
相关产品推荐

