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

RecyclerView列表项按钮点击跳转页面报错的解决咨询

RecyclerView列表项按钮点击跳转页面报错的解决咨询

嘿,我现在遇到个问题:在RecyclerView的列表项里加了个按钮,想点击后打开新页面,但代码里标红报错了,麻烦帮我看看怎么解决~

报错信息:

Cannot resolve constructor 'Intent(anonymous android.view.View.OnClickListener, java.lang.Class<com.example.newp.MainActivity>)'

'startActivity(android.content.Context, android.content.Intent, android.os.Bundle)' in 'androidx.core.content.ContextCompat' cannot be applied to '(android.content.Intent)'

我的代码:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    Context context;
    ArrayList<Fly> list;
    public static int idB = 0;

    public MyAdapter(Context context, ArrayList<Fly> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view =  LayoutInflater.from(context).inflate(R.layout.userentry,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        Fly fly = list.get(position);
        holder.name.setText(fly.getNamefly());
        holder.datefly.setText(fly.getDatefly());
        holder.hourfly.setText(fly.getHourfly());
        holder.contentfly.setText(fly.getContentfly());
        holder.pricefly.setText(fly.getpricefly());
        holder.buttonBUYR.setText(fly.getbuttonBUY());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class MyViewHolder extends RecyclerView.ViewHolder{
        TextView name,datefly,hourfly,contentfly,pricefly,buttonBUYR;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.textname);
            datefly = itemView.findViewById(R.id.textdate);
            hourfly = itemView.findViewById(R.id.texthour);
            contentfly = itemView.findViewById(R.id.textcontent);
            pricefly = itemView.findViewById(R.id.textprice);
            buttonBUYR = itemView.findViewById(R.id.buttonBUY);

            itemView.findViewById(R.id.buttonBUY).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(this, MainActivity.class);
                    startActivity(intent);
                }
            });
        }
    }
}

问题分析与解决方法:

报错的原因很明确:

  1. Intent构造参数错误:匿名内部类OnClickListener里的this指代的是这个点击事件对象,而不是我们需要的Context,所以Intent的第一个参数类型不匹配。
  2. startActivity调用方式错误:ViewHolder本身没有startActivity方法,必须通过Context来调用。

你可以把点击事件里的代码改成这样:

itemView.findViewById(R.id.buttonBUY).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 获取itemView的上下文,这是当前列表项所在的Activity/Fragment的Context
        Context ctx = itemView.getContext();
        Intent intent = new Intent(ctx, MainActivity.class);
        ctx.startActivity(intent);
    }
});

另外还有一种方式,就是用Adapter里传入的context,不过需要注意ViewHolder不能是静态类(如果要直接用Adapter的context的话),或者可以把context通过ViewHolder的构造方法传进去,但用itemView.getContext()是更简单安全的方式,还能避免潜在的内存泄漏问题~

备注:内容来源于stack exchange,提问作者yosef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:05:27