RecyclerView OnItemclick not working properly

2019-08-04 16:37发布

问题:

I have a recycler view and I am implementing OnClicklistener inside it. Basically , I have an adapter class called actressadapter and a viewholder class MyViewHolder.I am implementing OnClickListener inside viewholder class to initiate another activity via intent method. My basic data is inside a class called actress which has three variables name,country(both String) and an Id(UUID). I am providing this data that is of actresses to my adapter.Next activity is just displaying the name of actress like abc ,def etc that it retrieves . The fault is that it shows name of only one actress after clicking. For instance if it shows abc ,then for each click it will show abc.Don't know why is this happening because as per code I am passing actressname as an extra .

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

}

If required any further assist about code please comment.

回答1:

try this way hope it works...

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

}


回答2:

The best way to use the method getLayoutPosition() of adapter class to get the selected item(position).

You have to update your code for better result. Replace your existing code with that.

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

Hope it will work..



回答3:

your issue is that you made actress a variable of the Adapte, and it should be of the Holder.

To fix it:

Delete the line:

 private  Actress actress,mActress;

Change the onBindViewHolder method to:

holder.bindactress(al.get(position))

And make replace your holder class with that:

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