Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在RecyclerView中搜索项目时图像视图的位置发生更改_Java_Android_Android Recyclerview_Android Adapter - Fatal编程技术网

Java 在RecyclerView中搜索项目时图像视图的位置发生更改

Java 在RecyclerView中搜索项目时图像视图的位置发生更改,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,我有一个RecyclerView,其中每个项目都有一个ImageView,以sendmail图标的形式显示。最初,ImageView是可见的,但一旦我单击它,我就使用setVisibility(View.go)将其隐藏,并更新适配器 现在,当我单击sendmail图标时,我立即使用reportitems.get(position).setStatus(“emailsent”)将图标隐藏在该位置。现在,如果在search操作之前,第二个项目的ImageView可见,而第一个项目不可见,那么在搜索之

我有一个
RecyclerView
,其中每个项目都有一个
ImageView
,以
sendmail
图标的形式显示。最初,
ImageView
是可见的,但一旦我单击它,我就使用
setVisibility(View.go)
将其隐藏,并更新
适配器

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

搜索后,即使SQ 322应该有
sendmail
图标,它也不会显示出来

活动代码

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;
    }
}
适配器代码

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;
    }
}
公共类ReportAdapter扩展了RecyclerView.Adapter{ 私有ArrayList报告列表; 私人监听者; 私有上下文; 公共报告适配器(ArrayList报告列表,上下文){ this.reportlist=reportlist; this.mContext=上下文; } 公共接口侦听器{ 在SendeMailClick上无效(内部位置); } 公共void setOnItemClickListener(OnItemClickListener侦听器){ mListener=监听器; } 公共静态类ReportViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图发布日期; 公共文本视图航班号; 公共图像视图emailView; public ReportViewHolder(@NonNull View itemView,OnItemClickListener侦听器,上下文){ 超级(项目视图); departureDate=itemView.findViewById(R.id.departureDaterecyclerview); flightNumber=itemView.findViewById(R.id.flightNumber-RecyclerView); emailView=itemView.findViewById(R.id.sendemailIcon); emailView.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ if(侦听器!=null){ int position=getAdapterPosition(); 如果(位置!=RecyclerView.无位置){ listener.onSendEmailClick(位置); } } } }); } } @非空 @凌驾 public ReportViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ 视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.report\u listing\u item,parent,false); ReportViewHolder rvh=新的ReportViewHolder(v、mListener、mContext); 返回rvh; } @SuppressLint(“资源色”) @凌驾 公共无效onBindViewHolder(@NonNull ReportViewHolder holder,int位置){ ReportItem currentItem=reportlist.get(位置); //在这里,我将imageview的可见性设置为gone if(currentItem.getStatus().contentEquals(“emailsent”)){ holder.emailView.setVisibility(View.GONE); } holder.flightNumber.setText(currentItem.getFlightNumber()); holder.departureDate.setText((currentItem.getDepartureDate()); } 公共列表getList(){ 返回报告列表; } }
将您的
onBindViewHolder
替换为以下内容,基本上回收商会在可用时使用池中的项目,并且一旦项目可见性消失
,并且除非您这样做,否则不会再次将其设置为可见

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


    }

当我在RecyclerView中搜索一个项目时,ImageView的位置会随着搜索而改变,这在搜索中是永远不会发生的。仅当您更改适配器中的项目时。请重新格式化。@blackapps Reformed
当我在RecyclerView中搜索一个项目时,我观察到各个项目的ImageView被重新排列
这是不可能的。我以前说过。搜索不会改变任何东西。仅当您在适配器中筛选数据列表时。请重新格式化。如果你旋转你的设备,那么同一个图标是否不可见?@blackapps我重新格式化了。我正在emulator上进行测试,而且我没有旋转设备太多,这很有效!:)