为每个卡片视图打开 1 个不同的 activity

Open 1 different activity for each cardview

我想弄清楚如何在单击 cardview 中的一项(使用 recyclerview)时转到另一个 activity。 我在互联网和这个网站上搜索并尝试了几个选项,但它不起作用(我只尝试了位置 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”,但它也不起作用。

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

里面的onClick()回调this关键字会指向View.OnClickListener的匿名内部class;因此您需要使用 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 中使用 context 而不是 this

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

Intent构造函数需要一个context作为第一个参数,但是ViewHolder中的this引用了ViewHolder的实例,所以需要从view中获取context或者使用您在 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);
                    }
                }
            });
        }
    }

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