Shivam Panwar
Shivam Panwar

Reputation: 496

RecyclerView OnItemclick not working properly

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

}

enter image description here

If required any further assist about code please comment.

Upvotes: 1

Views: 414

Answers (3)

Budius
Budius

Reputation: 39856

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

Upvotes: 1

D_Alpha
D_Alpha

Reputation: 4069

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..

Upvotes: 1

Tanim reja
Tanim reja

Reputation: 2188

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

}

Upvotes: 1

Related Questions