Ian Bell
Ian Bell

Reputation: 543

Position of an imageview changing when searching for an item in RecyclerView

I have a RecyclerView in which I have an ImageView for each item in the form of sendEmail icon. Initially, the ImageView is visible but once I click on it, I hide it using setVisibility(View.GONE) and update the Adapter.

Now, when I click on the sendEmail icon, I hide the icon in that position instantly using reportitems.get(position).setStatus("emailsent");. Now, if, before the search operation, the second item had the ImageView visible and first item did not, then after search if the second item were to be the only item that is relevant, then the ImageView does not show up there in the first position. I am using dynamic search where upon inputting a character, the adapter refreshes instantly and shows the updated RecyclerView. How can I fix this issue?

I have added the image of my recyclerview below

After search, even though SQ 322 should have the sendEmail icon, it does not show up

enter image description here

Activity code

mAdapter.setOnItemClickListener(new ReportAdapter.OnItemClickListener() {
    public void onSendEmailClick(int position){


        flightNumber=reportitems.get(position).getFlightNumber();
        departureDate=reportitems.get(position).getDepartureDate();

        FlightClosureStatus flightClosureStatus=new FlightClosureStatus(flightNumber,departureDate,"emailsent");
        flightViewModel.updateFlightClosureStatus(flightClosureStatus);

        reportitems.get(position).setStatus("emailsent");
        mAdapter.notifyDataSetChanged();
        }
        }

Adapter Code

public class ReportAdapter extends RecyclerView.Adapter<ReportAdapter.ReportViewHolder> {

    private ArrayList<ReportItem> reportlist;
    private OnItemClickListener mListener;
    private Context mContext;

    public ReportAdapter(ArrayList<ReportItem> reportlist, Context context) {
        this.reportlist = reportlist;
        this.mContext = context;
    }

    public interface OnItemClickListener {
        void onSendEmailClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    public static class ReportViewHolder extends RecyclerView.ViewHolder {

        public TextView departureDate;
        public TextView flightNumber;
        public ImageView emailView;
  
        public ReportViewHolder(@NonNull View itemView, OnItemClickListener listener, Context context) {
            super(itemView);
            departureDate = itemView.findViewById(R.id.departureDaterecyclerview);
            flightNumber =  itemView.findViewById(R.id.flightnumberrecyclerview);
            emailView = itemView.findViewById(R.id.sendemailIcon);
           
            emailView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if(listener != null) {
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION) {
                            listener.onSendEmailClick(position);

                        }
                    }

                }
            });

        }
    }

    @NonNull
    @Override
    public ReportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.report_listing_item, parent, false);
        ReportViewHolder rvh= new ReportViewHolder(v,mListener,mContext);
        return rvh;
    }

    @SuppressLint("ResourceAsColor")
    @Override
    public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {

        ReportItem currentItem = reportlist.get(position);

        //here i am setting the visibility of the imageview to gone
        if(currentItem.getStatus().contentEquals("emailsent")){
            holder.emailView.setVisibility(View.GONE);
        }

        holder.flightNumber.setText(currentItem.getFlightNumber());
        holder.departureDate.setText((currentItem.getDepartureDate()));


    }

    public List<ReportItem> getList() {
        return reportlist;
    }
}

Upvotes: 0

Views: 72

Answers (1)

Rajan Kali
Rajan Kali

Reputation: 12953

Replace your onBindViewHolder with below, basically recycler uses items from pool when available, and once the item visibility is GONE and it is never set to VISIBLE again unless you do it

 @SuppressLint("ResourceAsColor")
    @Override
    public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {

        ReportItem currentItem = reportlist.get(position);

        //here i am setting the visibility of the imageview to gone
        if(currentItem.getStatus().contentEquals("emailsent")){
            holder.emailView.setVisibility(View.GONE);
        }else{
            holder.emailView.setVisibility(View.VISIBLE);
        }

        holder.flightNumber.setText(currentItem.getFlightNumber());
        holder.departureDate.setText((currentItem.getDepartureDate()));


    }

Upvotes: 1

Related Questions