How to change item in a RecyclerView in Android Studio?

倾然丶 夕夏残阳落幕 提交于 2020-07-03 09:36:27

问题


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?


回答1:


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



回答2:


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.




回答3:


You can do it from quick and simple method

recyclerViewAdapter.notifyDataSetChanged(position);

position of your item what you want to change.



来源:https://stackoverflow.com/questions/62355901/how-to-change-item-in-a-recyclerview-in-android-studio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!