在搜索栏上搜索元素后,如何在 RecyclerView 中获取元素的正确位置?

问题描述

我的 Android 应用程序中有一个显示航班的回收站视图,我想通过输入航班号使用顶部的搜索搜索特定航班。当我搜索航班时,我在回收站视图中得到了想要的结果,但是当我在回收站视图中单击特定的航班元素时,该元素的位置被错误地捕获。例如如果我在搜索后单击第一个飞行元素,它会在我搜索任何内容之前向我显示一个飞行元素的详细信息,因此回收器视图不会在适配器上正确地动态加载位置。我该如何解决这个问题?

飞行适配器


public class FlightAdapter extends RecyclerView.Adapter<FlightAdapter.FlightViewHolder> {

    private ArrayList<FlightItem> flightlist;
    private OnItemClickListener mListener;
    private Context mContext;

    public FlightAdapter(ArrayList<FlightItem> flightlist,Context context) {
        this.flightlist = flightlist;
        this.mContext = context;
    }

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

    public void setonItemClickListener(OnItemClickListener listener) {
        mListener =  listener;
    }
    
    public static class FlightViewHolder extends RecyclerView.ViewHolder {

        public TextView departureDate;
        public TextView flightNumber;

        public FlightViewHolder(@NonNull View itemView,OnItemClickListener listener,Context context) {
            super(itemView);

            departureDate = itemView.findViewById(R.id.departureDate);
            flightNumber =  itemView.findViewById(R.id.flightNumber);

            itemView.setonClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null) {
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(position);


                        }
                    }

                }
            });


        }
    }

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

    @Override
    public void onBindViewHolder(@NonNull FlightViewHolder holder,int position) {

        FlightItem currentItem =  flightlist.get(position);

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

    }

    @Override
    public int getItemCount() {
        return flightlist.size();
    }

    //SEARCH FILTERING
    public void filterList(ArrayList<FlightItem> filteredList) {
        flightlist = filteredList;
        notifyDataSetChanged();
    }
}

活动

searchText.addTextChangedListener(new TextWatcher() {
     @Override
     public void beforeTextChanged(CharSequence s,int start,int count,int after) {

     }

     @Override
     public void onTextChanged(CharSequence s,int before,int count) {

     }

     @Override
     public void afterTextChanged(Editable s) {

          filter(s.toString());

      }
   });


private void filter(String text) {
      ArrayList<FlightItem> filteredList = new ArrayList<>();

      for(FlightItem item : flightItems) {

//         String myitem = item.getFlightNumber().replaceAll(" ","");
            if(item.getFlightNumber().toLowerCase().contains(text.toLowerCase())){

            filteredList.add(item);
          }
     }

     mAdapter.filterList(filteredList);
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)