С помощью библиотеки Android Paging действительно легко загружать данные из базы данных по частям, а ViewModel обеспечивает автоматическое обновление пользовательского интерфейса и сохранение данных. Все эти модули фреймворков помогают нам создать отличное приложение на платформе Android.
Типичное приложение для Android должно отображать список элементов и позволять пользователю выполнять поиск в этом списке. И это то, чего я хочу достичь с помощью своего приложения. Итак, я выполнил реализацию, прочитав множество документации, руководств и даже ответов на stackoverflow. Но я не уверен, правильно ли я делаю это или как я должен это делать. Итак, ниже я показал свой способ реализации библиотеки подкачки с помощью ViewModel и RecyclerView.
Пожалуйста, просмотрите мою реализацию и исправьте меня, где я ошибаюсь, или покажите мне, как я должен это делать. Я думаю, что многие новые разработчики Android, такие как я, все еще не понимают, как это сделать правильно, поскольку нет единого источника, который мог бы получить ответы на все ваши вопросы по такой реализации.
Я показываю только то, что считаю важным показать. Я использую Room. Вот моя сущность, с которой я работаю.
@Entity(tableName = "event")
public class Event {
@PrimaryKey(autoGenerate = true)
public int id;
public String title;
}
Вот DAO для объекта Event.
@Dao
public interface EventDao {
@Query("SELECT * FROM event WHERE event.title LIKE :searchTerm")
DataSource.Factory<Integer, Event> getFilteredEvent(String searchTerm);
}
Вот ViewModel расширяет AndroidViewModel, который позволяет читать и искать, предоставляя LiveData ‹PagedList‹ Event >> либо всех событий, либо отфильтрованных событий в соответствии с поиском. текст. Я действительно борюсь с мыслью, что каждый раз, когда происходит изменение в filterEvent, я создаю новые LiveData, которые могут быть избыточными или плохими.
private MutableLiveData<Event> filterEvent = new MutableLiveData<>();
private LiveData<PagedList<Event>> data;
private MeDB meDB;
public EventViewModel(Application application) {
super(application);
meDB = MeDB.getInstance(application);
data = Transformations.switchMap(filterEvent, new Function<Event, LiveData<PagedList<Event>>>() {
@Override
public LiveData<PagedList<Event>> apply(Event event) {
if (event == null) {
// get all the events
return new LivePagedListBuilder<>(meDB.getEventDao().getAllEvent(), 5).build();
} else {
// get events that match the title
return new LivePagedListBuilder<>(meDB.getEventDao()
.getFilteredEvent("%" + event.title + "%"), 5).build();
}
}
});
}
public LiveData<PagedList<Event>> getEvent(Event event) {
filterEvent.setValue(event);
return data;
}
Для поиска по событию я использую SearchView. В onQueryTextChange я написал следующий код для поиска или отображения всех событий, когда не указаны условия поиска, что означает, что поиск выполнен или отменен.
Event dumpEvent;
@Override
public boolean onQueryTextChange(String newText) {
if (newText.equals("") || newText.length() == 0) {
// show all the events
viewModel.getEvent(null).observe(this, events -> adapter.submitList(events));
}
// don't create more than one object of event; reuse it every time this methods gets called
if (dumpEvent == null) {
dumpEvent = new Event(newText, "", -1, -1);
}
dumpEvent.title = newText;
// get event that match search terms
viewModel.getEvent(dumpEvent).observe(this, events -> adapter.submitList(events));
return true;
}