【问题标题】:Open 1 different activity for each cardview为每个卡片视图打开 1 个不同的活动
【发布时间】:2023-03-12 18:05:01
【问题描述】:

当我单击cardview 中的一项(使用recyclerview)时,我试图弄清楚如何进行另一项活动。 我在互联网和这个网站上搜索并尝试了几个选项,但它不起作用(我只尝试了位置 0,其他的也会这样做)。在这里,我尝试使用卡片 0 转到“selection_niveau”。

第一次尝试:在 OnClick 内:

public class adapter_categorie_solo extends RecyclerView.Adapter<adapter_categorie_solo.ViewHolder> {

    List<String> titles;
    List<Integer> images;
    LayoutInflater inflater;

    public adapter_categorie_solo(Context ctx, List<String> titles, List<Integer> images){
        this.titles = titles;
        this.images = images;
        this.inflater = LayoutInflater.from(ctx);
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.cardview_solo_categorie,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        holder.gridIcon.setImageResource(images.get(position));

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        ImageView gridIcon;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.textView2);
            gridIcon = itemView.findViewById(R.id.imageView2);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "Clicked -> " + getAdapterPosition(), Toast.LENGTH_SHORT).show();

                    if (getAdapterPosition()==0)
                    Intent intent = new Intent (this,selection_niveau.class);
                }
            });
        }
    }
}

我收到此错误:

error: variable declaration not allowed here
                    Intent intent = new Intent (this,selection_niveau.class);

第二次尝试:在 onBindViewHolder 内

public class adapter_categorie_solo extends RecyclerView.Adapter<adapter_categorie_solo.ViewHolder> {

    List<String> titles;
    List<Integer> images;
    LayoutInflater inflater;

    public adapter_categorie_solo(Context ctx, List<String> titles, List<Integer> images){
        this.titles = titles;
        this.images = images;
        this.inflater = LayoutInflater.from(ctx);
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.cardview_solo_categorie,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.title.setText(titles.get(position));
        holder.gridIcon.setImageResource(images.get(position));
        Intent intent;
        if(position == 0)
            intent = new Intent(this, selection_niveau.class);

        holder.itemView.setOnClickListener(new View.OnClickListener(){
            @Override public void onClick(View v){
                Context.startActivity(intent);
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView title;
        ImageView gridIcon;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.textView2);
            gridIcon = itemView.findViewById(R.id.imageView2);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "Clicked -> " + getAdapterPosition(), Toast.LENGTH_SHORT).show();

                }
            });
        }
    }
}

我得到了这个错误:

error: no suitable constructor found for Intent(adapter_categorie_solo,Class<selection_niveau>)
            intent = new Intent(this, selection_niveau.class);
                     ^
    constructor Intent.Intent(String,Uri) is not applicable
      (argument mismatch; adapter_categorie_solo cannot be converted to String)
    constructor Intent.Intent(Context,Class<?>) is not applicable
      (argument mismatch; adapter_categorie_solo cannot be converted to Context)

我尝试将“this”更改为仅“context”,但它也不起作用。

这些是我在 Internet 和此处找到的一些解决方案,但没有一个有效,作为初学者,我无法真正理解为什么。

【问题讨论】:

    标签: java android android-activity android-recyclerview android-cardview


    【解决方案1】:

    onClick()内部回调this关键字会指向View.OnClickListener的匿名内部类;所以你需要改为使用v.getContext() 来更改上下文。

    通过将itemView.setOnClickListener 替换为:

    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Clicked -> " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
    
            if (getAdapterPosition()==0) {
                Intent intent = new Intent (v.getContext(), selection_niveau.class);
            }
        }
    });
    

    【讨论】:

    • 感谢您的帮助,但我收到此错误(我之前已经遇到过):错误:此处不允许变量声明 Intent intent = new Intent (v.getContext(), selection_niveau.class);
    • @HugoBecker .. 你需要用大括号 { } .. if 没有大括号不允许在其中定义项目.. 请参阅更新的答案.. 顺便说一句这将只针对第一行项目单击运行。您可以删除if 条件以对所有行项目运行它
    • 现在没有错误,但它没有打开活动...顺便说一句,对其他项目使用其他“if”,例如 1,2...。因此打开另一个活动也可以?
    • @HugoBecker 你能去掉这个条件,然后测试
    • 我删除了条件,还是一样的:没有错误,但它没有打开新活动
    【解决方案2】:

    Intent构造函数需要一个上下文作为第一个参数,但是ViewHolder中的this指的是ViewHolder的实例,所以你需要从视图中获取上下文或者使用你在构造函数中得到的上下文引用adapter_categorie_solo.

    public class ViewHolder extends RecyclerView.ViewHolder{
            TextView title;
            ImageView gridIcon;
    
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.textView2);
                gridIcon = itemView.findViewById(R.id.imageView2);
    
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(v.getContext(), "Clicked -> " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
    
                        if (getAdapterPosition()==0)
                        {
                            Intent intent = new Intent (ctx,selection_niveau.class);
                            ctx.startActivity(intent);
                        }
                    }
                });
            }
        }
    

    如果您想根据点击位置开始不同的活动,使用switch 而不是if 将是最佳方法。

    【讨论】:

    • 部分工作!它打开一个新活动,但直接将其关闭。但是,新的活动现在并不复杂,只是一个图像视图,所以我真的不知道出了什么问题......
    • 正在关闭什么?
    • 新活动。我点击第一张卡片(数字 0),它打开了新的活动,该活动立即关闭,然后我被重定向到我的主要活动。
    • 请检查您的日志,崩溃应用重新启动后,新活动中出现崩溃。
    • 尝试重启查看日志,但现在又出现了一个以前没有的错误,不明白为什么错误:找不到符号ctx.startActivity(in);符号:变量在
    【解决方案3】:

    Intent 中使用context 而不是this

    if(position == 0)
         intent = new Intent(context, selection_niveau.class);
    

    【讨论】:

    • 我已经尝试使用上下文,但它说这是一个未知变量....
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多