Сортировка в RecyclerView

Имеется RecyclerView который выводит информацию о товаре с сервера. Товар не является списком, это объект, внутри которого List. Так же есть Spinner с 3 значениями: сначала дешевые, сначала дорогие, сначала популярные. Как отсортировать? ПробовалCollection.sort(), но так и не разобрался.

Это цена (сортировка по цене)

newPrice.setText(String.valueOf(mainModel.getItems().get(position).getPrices().getNew()));

Это количество отзывов (сортировка по популярности)

rating.setText(String.valueOf(mainModel.getItems().get(position).getNumberOfReviews()));

Spinner

spinner = findViewById(R.id.spinner);
ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this, R.array.spinner_items, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);

Модель

public class MainModel {

@SerializedName("totalCount")
@Expose
private int totalCount;
@SerializedName("plashka")
@Expose
private Object plashka;
@SerializedName("items")
@Expose
private List<Item> items = null;
@SerializedName("relatedCategories")
@Expose
private List<RelatedCategory> relatedCategories = null;
@SerializedName("categoryName")
@Expose
private String categoryName;

public int getTotalCount() {
    return totalCount;
}

public void setTotalCount(int totalCount) {
    this.totalCount = totalCount;
}

public Object getPlashka() {
    return plashka;
}

public void setPlashka(Object plashka) {
    this.plashka = plashka;
}

public List<Item> getItems() {
    return items;
}

public void setItems(List<Item> items) {
    this.items = items;
}

public List<RelatedCategory> getRelatedCategories() {
    return relatedCategories;
}

public void setRelatedCategories(List<RelatedCategory> relatedCategories) {
    this.relatedCategories = relatedCategories;
}

public String getCategoryName() {
    return categoryName;
}

public void setCategoryName(String categoryName) {
    this.categoryName = categoryName;
}

}

Список, который нужно отсортировать (находится внутри модели)

public class Item {

@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("image")
@Expose
private String image;
@SerializedName("isFavorite")
@Expose
private boolean isFavorite;
@SerializedName("prices")
@Expose
private Prices prices;
@SerializedName("full_set_prices")
@Expose
private Object fullSetPrices;
@SerializedName("isBestPrice")
@Expose
private boolean isBestPrice;
@SerializedName("tag")
@Expose
private Object tag;
@SerializedName("articul")
@Expose
private String articul;
@SerializedName("rating")
@Expose
private double rating;
@SerializedName("numberOfReviews")
@Expose
private int numberOfReviews;
@SerializedName("statusText")
@Expose
private String statusText;
@SerializedName("isAvailable")
@Expose
private boolean isAvailable;
@SerializedName("images")
@Expose
private List<String> images = null;
@SerializedName("categoryId")
@Expose
private String categoryId;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

public boolean isIsFavorite() {
    return isFavorite;
}

public void setIsFavorite(boolean isFavorite) {
    this.isFavorite = isFavorite;
}

public Prices getPrices() {
    return prices;
}

public void setPrices(Prices prices) {
    this.prices = prices;
}

public Object getFullSetPrices() {
    return fullSetPrices;
}

public void setFullSetPrices(Object fullSetPrices) {
    this.fullSetPrices = fullSetPrices;
}

public boolean isIsBestPrice() {
    return isBestPrice;
}

public void setIsBestPrice(boolean isBestPrice) {
    this.isBestPrice = isBestPrice;
}

public Object getTag() {
    return tag;
}

public void setTag(Object tag) {
    this.tag = tag;
}

public String getArticul() {
    return articul;
}

public void setArticul(String articul) {
    this.articul = articul;
}

public double getRating() {
    return rating;
}

public void setRating(double rating) {
    this.rating = rating;
}

public int getNumberOfReviews() {
    return numberOfReviews;
}

public void setNumberOfReviews(int numberOfReviews) {
    this.numberOfReviews = numberOfReviews;
}

public String getStatusText() {
    return statusText;
}

public void setStatusText(String statusText) {
    this.statusText = statusText;
}

public boolean isIsAvailable() {
    return isAvailable;
}

public void setIsAvailable(boolean isAvailable) {
    this.isAvailable = isAvailable;
}

public List<String> getImages() {
    return images;
}

public void setImages(List<String> images) {
    this.images = images;
}

public String getCategoryId() {
    return categoryId;
}

public void setCategoryId(String categoryId) {
    this.categoryId = categoryId;
}

}

Ответы (1 шт):

Автор решения: Andrew

Вообще я бы предложил сделать просто перезагрузку данных в списке по результатам фильтрации. Вот пример сортировки обычного List:

List<String> list = new ArrayList<String>();
list.add("How are you");
list.add("How you doing");
list.add("Joe");
list.add("Mike");

Collection<String> filtered = Collections2.filter(list,
    Predicates.containsPattern("How"));
print(filtered);

в вашем случае нужно будет что-то сочинять для вашей модели, будет что-то типа такого:

List<Person> beerDrinkers = persons.stream()
    .filter(p -> p.getAge() > 16).collect(Collectors.toList());

И так же я бы советовал использовать ArrayList так как он более гибкий и простой в использовании. И дальше уже посылаете данные в адаптер - либо заново пересоздаете адаптер либо notifyDatasetChanged(). Вот примеры фильтрации ArrayList

UPDATE

Как было указано @SergeiBuvaka для ваших целей подойдут так же DiffUtil. С их помощью вы сможете отфильтровать необходимые вам элементы списка и вывести все в виджете. Вот есть пример использования возможностей DiffUtil.

→ Ссылка