Android RecyclerView OnItemclick工作不正常

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等。缺点是

我有一个recycler视图,并在其中实现OnClicklistener。基本上,我有一个名为actressadapter的适配器类和一个viewholder类MyViewHolder。我在viewholder类内实现OnClickListener,通过intent方法启动另一个活动。我的基本数据在一个名为actor的类中,该类有三个变量name、country(两个字符串)和Id(UUID)。我将这些女演员的数据提供给适配器。下一个活动只是显示它检索到的女演员的名称,如abc、def等。缺点是点击后只显示一位女演员的名字。例如,如果它显示abc,那么每次点击它都会显示abc。不知道为什么会发生这种情况,因为根据代码,我将actressname作为一个额外的名称传递

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
。这就是它正常工作的原因。