Я не могу отсортировать RecyclerView
по убыванию order by date
. Есть headers
и items
. Я могу только отсортировать items
, но не headers
.
Я пытался отсортировать SQL Database
в порядке убывания (" DESC")
, но безуспешно.
private static final String EVENTS_CREATE_TABLE =
"create table "
+ EVENTS.TABLE + " ("
+ EVENTS.EVENTS_ID + " integer primary key, "
+ EVENTS.COL_TITLE + " text, "
+ EVENTS.COL_DATE + " long" + ");";
``
public List<EventModel> getAllEvents() {
List<EventModel> eventModelList = new ArrayList<>();
openToRead();
String orderBy = DBHelper.EVENTS.COL_DATE + " DESC";
Cursor cursor = database.query(DBHelper.EVENTS.TABLE,
null, null, null, null, null, orderBy);
if (cursor.moveToFirst()) {
do {
String title = cursor.getString(cursor.getColumnIndex(DBHelper.EVENTS.COL_TITLE));
long date = cursor.getLong(cursor.getColumnIndex(DBHelper.EVENTS.COL_DATE));
EventModel eventModel = new EventModel(title, date);
eventModelList.add(eventModel);
} while (cursor.moveToNext());
}
cursor.close();
return eventModelList;
}
Это мой fragment
:
private void getList() {
List<ListEvent> items = new ArrayList<>();
Map<Long, List<EventModel>> events = toMap(loadEvents());
for (long date : events.keySet()) {
HeaderEvent header = new HeaderEvent(date);
items.add(header);
for (EventModel eventModel : events.get(date)) {
EventItem item = new EventItem(itemModel);
items.add(item);
}
}
adapterEvent = new EventRVAdapter(getContext(), items);
mRecyclerView.setAdapter(adapterEvent);
}
private List<EventModel> loadEvents() {
List<EventModel> events = new ArrayList<>(mDBAdapter.getAllEvents());
return events;
}
private Map<Long, List<EventModel>> toMap(List<EventModel> events) {
Map<Long, List<EventModel>> map = new TreeMap<>();
for (EventModel eventModel : events) {
List<EventModel> value = map.get(eventModel.getDate());
if (value == null) {
value = new ArrayList<>();
map.put(eventModel.getDate(), value);
}
value.add(eventModel);
}
return map;
}
Это ListEvent
класс:
public abstract class ListEvent {
public static final int TYPE_HEADER = 0;
public static final int TYPE_ITEM = 1;
abstract public int getType();
}
Это EventItem.class
public class EventItem extends ListEvent{
private EventModel eventModel;
public EventItem(EventModel eventModel) {
this.eventModel = eventModel;
}
public EventModel getEventModel() {
return eventModel;
}
@Override
public int getType() {
return TYPE_ITEM;
}
}
Это HeaderEvent
класс:
public class HeaderEvent extends ListEvent {
private long date;
public HeaderEvent(long date) {
this.date = date;
}
public long getDate() {
return date;
}
@Override
public int getType() {
return TYPE_HEADER;
}
}
Это моя модель - EventModel
класс:
public class EventModel {
private String title;
private long date;
public EventModel(String title, long date) {
this.title = title;
this.date = date;
}
public String getTitle(){
return title;
}
public long getDate(){
return date;
}
}
И мой RecyclerView
адаптер:
public class EventRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<ListEvent> items;
public EventRVAdapter(List<ListEvent> items) {
this.items = items;
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
private TextView tvName, tvDate;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
tvName = itemView.findViewById(R.id.tvTitle);
tvDate = itemView.findViewById(R.id.tvDate);
}
}
public class HeaderViewHolder extends RecyclerView.ViewHolder {
private TextView tvHeaderDate;
public HeaderViewHolder(@NonNull View itemView) {
super(itemView);
tvHeaderDate = itemView.findViewById(R.id.tvHeader);
}
}
@Override
public int getItemCount() {
return items.size();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case ListEvent.TYPE_HEADER: {
View itemView = inflater.inflate(R.layout.row_header, parent, false);
return new HeaderViewHolder(itemView);
}
case ListEvent.TYPE_ITEM: {
View itemView = inflater.inflate(R.layout.row_item, parent, false);
return new ItemViewHolder(itemView);
}
default:
throw new IllegalStateException("unsupported item type");
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case ListEvent.TYPE_HEADER: {
HeaderEvent header = (HeaderEvent) items.get(position);
HeaderViewHolder headerHolder = (HeaderViewHolder) holder;
headerHolder.tvHeaderDate.setText(Utils.getDayAndTime(header.getDate()));
break;
}
case ListEvent.TYPE_ITEM: {
EventItem event = (EventItem) items.get(position);
ItemViewHolder itemHolder = (ItemViewHolder) holder;
itemHolder.tvName.setText(event.getEventModel().getTitle());
itemHolder.tvDate.setText(Utils.getDateWithoutTime(event.getEventModel().getDate()));
break;
}
default:
throw new IllegalStateException("unsupported item type");
}
}
@Override
public int getItemViewType(int position) {
return items.get(position).getType();
}
}
Не могли бы вы помочь мне найти решение или дать совет?