1

我有一个回收站视图,我正在其中实施OnClicklistener。基本上,我有一个名为actressadapter的适配器类和一个ViewView类MyViewHolder.I,我正在Viewholder类中实现OnClickListener以通过intent方法启动另一个活动。我的基本数据是在一个名为女演员的类中,它有三个变量姓名,国家(都是字符串)和一个Id(UUID)。我将这些数据提供给我的适配器上的女演员。下一个活动仅显示女演员的名称,如abc,def等。错误是它在点击后显示只有一个女演员的名字。例如,如果它显示abc,那么对于每次点击它都会显示abc。不知道为什么会发生这种情况,因为根据代码,我将actressname作为额外值传递。RecyclerView OnItemclick无法正常工作

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(); 
} 

}

enter image description here

如果需要提供进一步的帮助有关代码,请发表评论。

回答

1

尝试这种方式希望工程......

@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); 
       } 
      }); 

} 
+0

可以通过声明变量'actress'本地最终使用和整个方法中相同的变量,而不是查询gettext和转换为字符串等 –

1

您的问题是,你做actress的Adapte的一个变量,它应该是持有人。

要解决这个问题:

删除线:

private Actress actress,mActress; 

更改onBindViewHolder方法:

holder.bindactress(al.get(position)) 

,并与该更换您的支持类:

// 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()); 
    } 
} 
+0

它被进一步优化工作正常,但我们不能删除私人女演员女主角,因为女演员正在使用onBindViewHolder,并且如果您声明视图持有人为静态,这本身就意味着您无法访问适配器类的女演员。所以必须为viewhloder创造女演员女演员。 –

+1

我编辑了答案。将'onBindViewHolder'方法改为'holder.bindactress(al.get(position))'。如果您从我的答案中仔细阅读ViewHolder类,您会看到每个视图持有者都包含它自己的“女演员”。这是什么使它正常工作。 – Budius

1

使用适配器类的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(); 
    } 
} 

希望将工作..

+0

这工作正常,做得很好。 –

相关问题