Сортировка в 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 шт):
Вообще я бы предложил сделать просто перезагрузку данных в списке по результатам фильтрации. Вот пример сортировки обычного 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.