繁体   English   中英

在“搜索”或“过滤”之后,Recyclerview不是“排序”

[英]Recyclerview is not “Sorting” after “Searching” or “Filtering”

我正在开发一个使用“ Recyclerview”的应用程序,并且已经成功实现了Search(在工具栏中使用SearchView),Filtering(在过滤器输入中使用自定义对话框)和Sorting(价格从低到高以及从高到低)。

现在,我遇到的问题是,每当我在搜索某些内容或进行过滤之前对列表进行排序时,排序就可以正常工作。 但是在搜索内容或进行过滤后,排序不起作用。 我已经搜索了很多,但是找不到解决方案。

这是与我的问题有关的唯一SO问题,但我无法通过提供的答案解决我的问题: Recyclerview-搜索“ Arraylist”后排序不起作用

PS:我删除了代码,仅包含相关代码。

Recyclerview适配器:

public class TripListRecyclerViewAdapter extends RecyclerView.Adapter<TripListRecyclerViewAdapter.ViewHolder> implements Filterable {
    private static final String TAG = TripListRecyclerViewAdapter.class.getSimpleName();

    private Context mContext;
    private ArrayList<Trip> mTrips = new ArrayList<>();
    private ArrayList<Trip> mTripsFiltered = new ArrayList<>();

    public TripListRecyclerViewAdapter(Context mContext, ArrayList<Trip> mTrips) {
        this.mContext = mContext;
        this.mTrips = mTrips;
        this.mTripsFiltered = mTrips;
    }

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

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();
                if (charString.isEmpty()) {
                    mTripsFiltered = mTrips;
                } else if (charString.contains("Min") && charString.contains("Max")) {
                    String minPrice = charString.substring(3, charString.indexOf("Max"));
                    String maxPrice = charString.substring(charString.indexOf("Max") + 3);

                    ArrayList<Trip> filteredList = new ArrayList<>();
                    for (Trip trip : mTrips) {
                        if (trip.getTrip_rate() >= Integer.parseInt(minPrice) && trip.getTrip_rate() <= Integer.parseInt(maxPrice)) {
                            filteredList.add(trip);
                        }
                    }

                    mTripsFiltered = filteredList;
                } else if (charString.contains("Min")) {
                    String minPrice = charString.substring(3);

                    ArrayList<Trip> filteredList = new ArrayList<>();
                    for (Trip trip : mTrips) {
                        if (trip.getTrip_rate() >= Integer.parseInt(minPrice)) {
                            filteredList.add(trip);
                        }
                    }

                    mTripsFiltered = filteredList;
                } else if (charString.contains("Max")) {
                    String maxPrice = charString.substring(3);

                    ArrayList<Trip> filteredList = new ArrayList<>();
                    for (Trip trip : mTrips) {
                        if (trip.getTrip_rate() <= Integer.parseInt(maxPrice)) {
                            filteredList.add(trip);
                        }
                    }

                    mTripsFiltered = filteredList;
                } else {
                    ArrayList<Trip> filteredList = new ArrayList<>();
                    for (Trip trip : mTrips) {
                        if (trip.getTrip_name().toLowerCase().contains(charString.toLowerCase()) || trip.getTrip_destination().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(trip);
                        }
                    }

                    mTripsFiltered = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mTripsFiltered;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mTripsFiltered = (ArrayList<Trip>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }
}

分类模型:

public class Trip implements Serializable {

    public static final Comparator<Trip> PRICE_LOW_TO_HIGH = new Comparator<Trip>() {
        @Override
        public int compare(Trip tripOne, Trip tripTwo) {
            Float tripRateOne = new Float(tripOne.trip_rate);
            Float tripRateTwo = new Float(tripTwo.trip_rate);
            return tripRateOne.compareTo(tripRateTwo);
        }
    };
    public static final Comparator<Trip> PRICE_HIGH_TO_LOW = new Comparator<Trip>() {
        @Override
        public int compare(Trip tripOne, Trip tripTwo) {
            Float tripRateOne = new Float(tripOne.trip_rate);
            Float tripRateTwo = new Float(tripTwo.trip_rate);
            return tripRateTwo.compareTo(tripRateOne);
        }
    };
    public static final Comparator<Trip> DATE_NEW_TO_OLD = new Comparator<Trip>() {
        @Override
        public int compare(Trip tripOne, Trip tripTwo) {
            Integer tripRateOne = new Integer(tripOne.trip_id);
            Integer tripRateTwo = new Integer(tripTwo.trip_id);
            return tripRateTwo.compareTo(tripRateOne);
        }
    };
    @SerializedName("booking_id")
    @Expose
    private int booking_id;
    @SerializedName("trip_rate")
    @Expose
    private float trip_rate;

    public Trip(int booking_id) {
        this.booking_id = booking_id;
    }

    public int getBooking_id() {
        return booking_id;
    }

    public void setBooking_id(int booking_id) {
        this.booking_id = booking_id;
    }
}

Recyclerview的活动:

mSortingTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Creating A Popup Menu
                PopupMenu popupMenu = new PopupMenu(TripsActivity.this, mSortingTextView);
                // Inflating Menu From XML Resource
                popupMenu.inflate(R.menu.trip_sorting_menu);
                // Adding Click Listener
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.latest:
                                // Handle Latest Click
                                mSortingTextView.setText("Latest");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.DATE_NEW_TO_OLD);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.price_low_to_high:
                                // Handle Price (Low to High) Click
                                mSortingTextView.setText("Price (Low to High)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.PRICE_LOW_TO_HIGH);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.price_high_to_low:
                                // Handle Price (High to Low) Click
                                mSortingTextView.setText("Price (High to Low)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.PRICE_HIGH_TO_LOW);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.date_new_to_old:
                                // Handle Date (New to Old) Click
                                mSortingTextView.setText("Date (New to Old)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.DATE_NEW_TO_OLD);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            default:
                                return false;
                        }
                    }
                });
                // Displaying The Popup Menu
                popupMenu.show();
            }
        });
        mFilterTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(TripsActivity.this);
                dialogBuilder.setTitle("Filters");
                dialogBuilder.setCancelable(false);
                LayoutInflater layoutInflater = TripsActivity.this.getLayoutInflater();
                View dialogView = layoutInflater.inflate(R.layout.filter_dialog, null);
                dialogBuilder.setView(dialogView);
                TextInputLayout minPriceTextInputLayout = (TextInputLayout) dialogView.findViewById(R.id.minimum_price_text_input_layout);
                TextInputLayout maxPriceTextInputLayout = (TextInputLayout) dialogView.findViewById(R.id.maximum_price_text_input_layout);
                dialogBuilder.setPositiveButton("DONE", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                });
                dialogBuilder.setNegativeButton("RESET", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        String reset = "";
                        if (mTripListRecyclerViewAdapter != null) {
                            mTripListRecyclerViewAdapter.getFilter().filter(reset);
                        }
                    }
                });
                AlertDialog alertDialog = dialogBuilder.create();
                alertDialog.show();
                alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String minPrice = minPriceTextInputLayout.getEditText().getText().toString().trim();
                        String maxPrice = maxPriceTextInputLayout.getEditText().getText().toString().trim();
                        if (minPrice.equals("") && maxPrice.equals("")) {
                            alertDialog.dismiss();
                        } else {
                            String price = "";
                            if (minPrice.length() > 0 && maxPrice.length() > 0) {
                                if (Integer.parseInt(minPrice) > Integer.parseInt(maxPrice)) {
                                    minPriceTextInputLayout.setError("Minimum Price should be less than Maximum Price");
                                } else {
                                    price = "Min" + minPrice + "Max" + maxPrice;
                                    alertDialog.dismiss();
                                }
                            } else if (minPrice.length() > 0) {
                                price = "Min" + minPrice;
                                alertDialog.dismiss();
                            } else if (maxPrice.length() > 0) {
                                price = "Max" + maxPrice;
                                alertDialog.dismiss();
                            }

                            if (mTripListRecyclerViewAdapter != null) {
                                mTripListRecyclerViewAdapter.getFilter().filter(price);
                            }
                        }
                    }
                });
            }
        });

我通过对ArrayList Original和Filtered进行排序解决了以上发布的问题。

这是我所做的更改:

Recyclerview适配器:

public ArrayList<Trip> mTripsFiltered = new ArrayList<>();

Recyclerview的活动:

// Adding Click Listener
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.latest:
                                // Handle Latest Click
                                mSortingTextView.setText("Latest");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.DATE_NEW_TO_OLD);
                                    Collections.sort(mTripListRecyclerViewAdapter.mTripsFiltered, Trip.DATE_NEW_TO_OLD);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.price_low_to_high:
                                // Handle Price (Low to High) Click
                                mSortingTextView.setText("Price (Low to High)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.PRICE_LOW_TO_HIGH);
                                    Collections.sort(mTripListRecyclerViewAdapter.mTripsFiltered, Trip.PRICE_LOW_TO_HIGH);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.price_high_to_low:
                                // Handle Price (High to Low) Click
                                mSortingTextView.setText("Price (High to Low)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.PRICE_HIGH_TO_LOW);
                                    Collections.sort(mTripListRecyclerViewAdapter.mTripsFiltered, Trip.PRICE_HIGH_TO_LOW);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            case R.id.date_new_to_old:
                                // Handle Date (New to Old) Click
                                mSortingTextView.setText("Date (New to Old)");
                                if (mTrips.size() > 0) {
                                    Collections.sort(mTrips, Trip.DATE_NEW_TO_OLD);
                                    Collections.sort(mTripListRecyclerViewAdapter.mTripsFiltered, Trip.DATE_NEW_TO_OLD);
                                }
                                mTripListRecyclerViewAdapter.notifyDataSetChanged();
                                return true;
                            default:
                                return false;
                        }
                    }
                });

暂无
暂无

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

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