fungous_bread
fungous_bread

Reputation: 29

How to change item in a RecyclerView in Android Studio?

I am trying something similar to like/unlike feature of Instagram. But whenever I try to click the star in the Recycler View, the white star does not change to red star as shown below:

The white changes to red and then to white again.

enter image description here

The MyAdapter class is:

 public class MyAdapter extends RecyclerView.Adapter<ListItemViewHolder>{

    private List<ListItem> listItems;

    MyAdapter(List<ListItem> listItems){
        this.listItems = listItems;
    }

    @NonNull
    @Override
    public ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ListItemViewHolder(TestListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ListItemViewHolder holder, int position) {

        ListItem listItem = listItems.get(position);
        holder.binding.name.setText(listItem.getTitle());
        holder.binding.post.setText(listItem.getDescription());

        if(listItem.isClick()){
            holder.binding.redStar.setVisibility(View.VISIBLE);
            holder.binding.whiteStar.setVisibility(View.GONE);
        }else{
            holder.binding.redStar.setVisibility(View.GONE);
            holder.binding.whiteStar.setVisibility(View.VISIBLE);
        }

        clicklitn(holder);

    }

    public void clicklitn(final ListItemViewHolder holder){
        holder.binding.redStar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.binding.redStar.setVisibility(View.GONE);
                holder.binding.whiteStar.setVisibility(View.VISIBLE);
                Log.d("CLICK DETECTION", "Red Star click detected");

                notifyItemChanged(holder.getAdapterPosition());
            }
        });
        holder.binding.whiteStar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.binding.redStar.setVisibility(View.VISIBLE);
                holder.binding.whiteStar.setVisibility(View.GONE);
                Log.d("CLICK DETECTION", "White Star click detected");

                notifyItemChanged(holder.getAdapterPosition());
            }
        });
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }
}

How can I solve this issue?

Upvotes: 0

Views: 101

Answers (3)

momvart
momvart

Reputation: 1999

You're not setting isClick when stars are clicked. I don't know how your class hierarchy is, however you should do something like this:

    public void clicklitn(final ListItemViewHolder holder){
        holder.binding.redStar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.binding.redStar.setVisibility(View.GONE);
                holder.binding.whiteStar.setVisibility(View.VISIBLE);
                Log.d("CLICK DETECTION", "Red Star click detected");
                //set item isClick to false
                notifyItemChanged(holder.getAdapterPosition());
            }
        });
        holder.binding.whiteStar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.binding.redStar.setVisibility(View.VISIBLE);
                holder.binding.whiteStar.setVisibility(View.GONE);

                Log.d("CLICK DETECTION", "White Star click detected");
                //set item isClick to true
                notifyItemChanged(holder.getAdapterPosition());
            }
        });
    }

Upvotes: 2

edison16029
edison16029

Reputation: 346

Your else part resets your colour change.

if(listItem.isClick()){
    holder.binding.redStar.setVisibility(View.VISIBLE);
    holder.binding.whiteStar.setVisibility(View.GONE);
}else{
    holder.binding.redStar.setVisibility(View.GONE);
    holder.binding.whiteStar.setVisibility(View.VISIBLE);
}

Since, you define your onClick operations inside clicklitn function, you don't need the if else here.

Upvotes: 1

user13651827
user13651827

Reputation:

You can do it from quick and simple method

recyclerViewAdapter.notifyDataSetChanged(position);

position of your item what you want to change.

Upvotes: 0

Related Questions