Reputation: 29
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.
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
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
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
Reputation:
You can do it from quick and simple method
recyclerViewAdapter.notifyDataSetChanged(position);
position of your item what you want to change.
Upvotes: 0