Android RecyclerView OnItemclick工作不正常
我有一个recycler视图,并在其中实现OnClicklistener。基本上,我有一个名为actressadapter的适配器类和一个viewholder类MyViewHolder。我在viewholder类内实现OnClickListener,通过intent方法启动另一个活动。我的基本数据在一个名为actor的类中,该类有三个变量name、country(两个字符串)和Id(UUID)。我将这些女演员的数据提供给适配器。下一个活动只是显示它检索到的女演员的名称,如abc、def等。缺点是点击后只显示一位女演员的名字。例如,如果它显示abc,那么每次点击它都会显示abc。不知道为什么会发生这种情况,因为根据代码,我将actressname作为一个额外的名称传递Android RecyclerView OnItemclick工作不正常,android,android-intent,android-recyclerview,onclicklistener,Android,Android Intent,Android Recyclerview,Onclicklistener,我有一个recycler视图,并在其中实现OnClicklistener。基本上,我有一个名为actressadapter的适配器类和一个viewholder类MyViewHolder。我在viewholder类内实现OnClickListener,通过intent方法启动另一个活动。我的基本数据在一个名为actor的类中,该类有三个变量name、country(两个字符串)和Id(UUID)。我将这些女演员的数据提供给适配器。下一个活动只是显示它检索到的女演员的名称,如abc、def等。缺点是
public class actressadapter extends RecyclerView.Adapter <actressadapter.MyViewHolder> {
private List<Actress>al;
private Actress actress,mActress;
public static final String str="shivam.panwar.actressdetails.actressadapter.str";
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView naam, desh;
public MyViewHolder(View view) {
super(view);
view.setOnClickListener(this);
naam = (TextView) view.findViewById(R.id.name);
desh= (TextView) view.findViewById(R.id.country);
}
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(v.getContext(),Actressview.class);
intent.putExtra(str,actress.getName());
v.getContext().startActivity(intent);
}
public void bindactress(Actress mActress) {
naam.setText(mActress.getName());
desh.setText(mActress.getCountry());
}
}
public actressadapter(List<Actress> al) {
this.al = al;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.actress_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
actress =al.get(position);
holder.bindactress(actress);
}
@Override
public int getItemCount() {
return al.size();
}
公共类actressadapter扩展了RecyclerView.Adapter
如果需要任何关于代码的进一步帮助,请发表评论。尝试这种方式,希望它能起作用
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
actress =al.get(position);
holder.bindactress(actress);
holder.naam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,holder.naam.getText().toString(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context,Actressview.class);
intent.putExtra(str,holder.naam.getText().toString());
context.startActivity(intent);
}
});
}
您的问题是您将actor
作为Adapte的一个变量,它应该是Holder的变量
要解决此问题,请执行以下操作:
删除该行:
private Actress actress,mActress;
将onBindViewHolder
方法更改为:
holder.bindactress(al.get(position))
并将您的holder类替换为:
// holder HAVE TO be static. It's WRONG not doing it static
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView naam, desh;
Actress actress;
public MyViewHolder(View view) {
super(view);
view.setOnClickListener(this);
naam = (TextView) view.findViewById(R.id.name);
desh= (TextView) view.findViewById(R.id.country);
}
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(v.getContext(),Actressview.class);
intent.putExtra(str,actress.getName());
v.getContext().startActivity(intent);
}
public void bindactress(Actress mActress) {
this.actress = mActress;
naam.setText(mActress.getName());
desh.setText(mActress.getCountry());
}
}
使用适配器类的方法getLayoutPosition()获取所选项目(位置)的最佳方法
您必须更新代码以获得更好的结果。用该代码替换现有代码
public class actressadapter extends RecyclerView.Adapter <actressadapter.MyViewHolder> {
private List<Actress>al;
private Actress actress,mActress;
private int itemPosition; // change
public static final String str="shivam.panwar.actressdetails.actressadapter.str";
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView naam, desh;
public MyViewHolder(View view) {
super(view);
view.setOnClickListener(this);
naam = (TextView) view.findViewById(R.id.name);
desh= (TextView) view.findViewById(R.id.country);
}
@Override
public void onClick(View v) {
itemPosition = getLayoutPosition(); // change
Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
Intent intent=new Intent(v.getContext(),Actressview.class);
intent.putExtra(str,al.get(itemPosition).getName()); // change
v.getContext().startActivity(intent);
}
public void bindactress(Actress mActress) {
naam.setText(mActress.getName());
desh.setText(mActress.getCountry());
}
}
public actressadapter(List<Actress> al) {
this.al = al;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.actress_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
actress =al.get(position);
holder.bindactress(actress);
}
@Override
public int getItemCount() {
return al.size();
}
}
公共类actressadapter扩展了RecyclerView.Adapter{
私有列表;
私人女演员麦克特雷斯;
private int itemPosition;//更改
public static final String str=“shivam.panwar.actressdetails.actressadapter.str”;
公共类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
desh naam公共文本视图;
公共MyViewHolder(视图){
超级(视图);
view.setOnClickListener(这个);
naam=(TextView)view.findViewById(R.id.name);
desh=(TextView)view.findViewById(R.id.country);
}
@凌驾
公共void onClick(视图v){
itemPosition=getLayoutPosition();//更改
Toast.makeText(v.getContext(),“Clicked”,Toast.LENGTH_SHORT.show();
Intent Intent=新的Intent(v.getContext(),Actressview.class);
intent.putExtra(str,al.get(itemPosition.getName());//更改
v、 getContext().startActivity(意图);
}
公众影星(女演员麦克特雷斯){
naam.setText(mActress.getName());
desh.setText(mActress.getCountry());
}
}
公共女演员适配器(列表al){
this.al=al;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.carter\u list\u行,父项,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
女演员=获得(职位);
女主角(女演员);
}
@凌驾
public int getItemCount(){
返回al.size();
}
}
希望它能起作用。可以进一步优化,方法是将变量actor
声明为本地final,并在整个方法中使用相同的变量,而不是查询getText和转换为字符串等。它工作正常,但我们不能删除行private-actor-actor,因为女演员正在onBindViewHolder中使用,并且如果您将viewholder声明为静态,则其本身意味着您无法访问适配器类的女演员。所以我们必须为收视者创作女演员。我编辑了答案。将onBindViewHolder
方法更改为holder.bindActor(al.get(position))
。如果你在ViewHolder类中仔细阅读我的答案,你会发现每个ViewHolder都包含自己的actor
。这就是它正常工作的原因。