为每个卡片视图打开 1 个不同的活动
Posted
技术标签:
【中文标题】为每个卡片视图打开 1 个不同的活动【英文标题】:Open 1 different activity for each cardview 【发布时间】:2021-04-21 10:46:04 【问题描述】:当我单击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 和此处找到的一些解决方案,但没有一个有效,作为初学者,我无法真正理解为什么。
【问题讨论】:
【参考方案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);
【讨论】:
我已经尝试使用上下文,但它说这是一个未知变量....以上是关于为每个卡片视图打开 1 个不同的活动的主要内容,如果未能解决你的问题,请参考以下文章
Listview的项目位置0持有另一个列表视图,其中包含10个项目,每个项目打开单个活动但不同的文本数据
Listview 的项目位置 0 持有另一个包含 10 个项目的列表视图,每个项目打开单个活动但不同的文本数据