С android библиотекой подкачки данных действительно легко загружать данные из базы данных кусками, а ViewModel обеспечивает автоматическое обновление c пользовательского интерфейса и выживание данных. Все эти модули фреймворков помогают нам создать отличное приложение на платформе android.
Типичное приложение android должно отображать список элементов и позволяет пользователю выполнять поиск в этом списке. И это то, чего я хочу достичь с помощью моего приложения. Таким образом, я реализовал реализацию, прочитав множество документов, учебных пособий и даже ответов на стекопотоки. Но я не уверен, правильно ли я это делаю или как я должен это делать. Итак, ниже я показал свой способ реализации библиотеки подкачки с ViewModel и RecyclerView.
Пожалуйста , просмотрите мою реализацию и исправьте меня, если я ошибаюсь, или покажите, как я должен это сделать. Я думаю, что многие новые android разработчики, подобные мне, все еще не понимают, как это сделать правильно, поскольку нет единого источника, чтобы получить ответы на все ваши вопросы о такой реализации.
Я показываю только то, что думаю важно показать. Я использую комнату. Вот моя сущность, с которой я работаю.
@Entity(tableName = "event")
public class Event {
@PrimaryKey(autoGenerate = true)
public int id;
public String title;
}
Вот DAO для сущности события.
@Dao
public interface EventDao {
@Query("SELECT * FROM event WHERE event.title LIKE :searchTerm")
DataSource.Factory<Integer, Event> getFilteredEvent(String searchTerm);
}
Вот ViewModel extends AndroidViewModel , который позволяет читать и искать, предоставляя LiveData > всех событий или отфильтрованных событий в соответствии с текстом поиска. Я действительно борюсь с идеей, что каждый раз, когда происходит изменение в 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;
}