Как отсортировать заголовки и элементы RecyclerView по дате - PullRequest
0 голосов
/ 16 января 2020

Я не могу отсортировать RecyclerView по убыванию order by date. Есть headers и items. Я могу только отсортировать items, но не headers.

Я пытался отсортировать SQL Database в порядке убывания (" DESC"), но безуспешно.

enter image description here

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();
}

}

Не могли бы вы помочь мне найти решение или дать совет?

1 Ответ

1 голос
/ 16 января 2020

keySet() утверждения документации метода:

Итератор набора возвращает ключи в порядке возрастания.

И это только поведение у вас есть.

Нет необходимости использовать Map для подготовки списка элементов с заголовками. Лучше просто выполнить итерацию отсортированного списка событий и сохранить последнюю дату для сравнения на следующем шаге. Вот пример кода:

List<EventModel> events = loadEvents();
List<ListEvent> items = new ArrayList<>();
long date = -1L;
for (EventModel event : events) {
    if (event.getDate() != date) {
        date = event.getDate();
        items.add(new HeaderEvent(date));
    }
    items.add(new EventItem(event));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...