繁体   English   中英

在 RecyclerView 中搜索项目时,imageview 的 Position 发生变化

[英]Position of an imageview changing when searching for an item in RecyclerView

我有一个RecyclerView ,其中每个项目都有一个以sendEmail图标形式出现的ImageView 最初, ImageView是可见的,但一旦我点击它,我使用setVisibility(View.GONE)隐藏它并更新Adapter

现在,当我单击sendEmail图标时,我会立即使用reportitems.get(position).setStatus("emailsent"); . 现在,如果在search操作之前,第二个项目的ImageView可见而第一个项目不可见,那么在搜索后,如果第二个项目是唯一相关的项目,那么ImageView不会出现在第一个项目中position。 我正在使用动态搜索,在输入字符时,适配器会立即刷新并显示更新的 RecyclerView。 我该如何解决这个问题?

我在下面添加了我的 recyclerview 的图像

搜索后,即使 SQ 322 应该有sendEmail图标,它也没有出现

在此处输入图像描述

活动代码

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

适配器代码

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

用下面替换你的onBindViewHolder ,基本上回收器在可用时使用池中的项目,一旦项目可见性GONE ,除非你这样做,否则它永远不会再次设置为VISIBLE

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


    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM