You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:06:23