Совсем недавно я следовал нескольким руководствам из CodeLabs , чтобы попытаться создать базу данных комнат для своего приложения. Все руководства, которые я использовал, используют Recycler View. Я пытаюсь выяснить, как использовать эти данные и реализовать их в компонентах другого типа, но пока Spinner для отображения пользователей.
Я создал свою сущность, дао, базу данных, репозиторий и модель представления, и я думаю, что сидел правильно.
Мой адаптер отличается от руководства тем, что в нем используется код, предназначенный для представления recyler. Где, как я хочу, чтобы мои данные появлялись в счетчике.
class UserListAdapter {
private List<Users> mUser = Collections.emptyList(); // Cached copy of words
void setUser(List<Users> user){
mUser = user;
}
// getItemCount() is called many times, and when it is first called,
// mWords has not been updated (means initially, it's null, and we can't return null).
public int getItemCount() {
if (mUser != null)
return mUser.size();
else return 0;
}}
Где, как здесь, находится адаптер CodeLabs . Я просто удалил все, что касается представления recyler, и использовал оставшийся код для моего адаптера.
У меня есть значения по умолчанию "Hello", "World", которые предварительно заполняют базу данных во время сборки в классе базы данных, вот этот метод:
private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {
private final UsersDao mDao;
PopulateDbAsync(AppDatabase db) {
mDao = db.usersDao();
}
@Override
protected Void doInBackground(final Void... params) {
mDao.deleteAll();
Users user = new Users("Hello");
mDao.insertNewUser(user);
user = new Users("World");
mDao.insertNewUser(user);
return null;
}
}
}
У меня есть метод, который вставляет данные в счетчик:
private void createSpinners(ArrayList<String> listToUse) {
ArrayAdapter<String> adp1 = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, listToUse);
spin_PlayerSelection.setAdapter(adp1);
}
В блоке кода onCreate я хочу получить список пользователей и передать его вышеуказанному методу.
final UserListAdapter adapter = new UserListAdapter();
mUsersViewModel = ViewModelProviders.of(this).get(UsersViewModel.class);
mUsersViewModel.getAllUsers().observe(this, new Observer<List<Users>>() {
@Override
public void onChanged(@Nullable final List<Users> user) {
// Update the cached copy of the words in the adapter.
// Update scroll view here
adapter.setUser(user);
createSpinners(mUsersViewModel.getAllUsers());
}
});
В нынешнем виде я получаю сообщение об ошибке:
Куда я иду не так?
Обновлен повторный ответ @ JohnJoe:
Я попробовал ваш путь, но getAllUsers не имеет метода .Size, потому что это LiveData (я думаю). Но у меня есть метод getItemCount в моем UserListAdapter, поэтому я использовал его, а затем использовал метод get name в классе Users, который содержит Entity или таблицу, чтобы оставить код следующим образом:
mUsersViewModel.getAllUsers().observe(this, new Observer<List<Users>>() {
@Override
public void onChanged(@Nullable final List<Users> user) {
// Update the cached copy of the words in the adapter.
// Update scroll view here
adapter.setUser(user);
for (int i = 0; i < adapter.getItemCount(); i++) {
playerNames.add(String.valueOf(user.get(i)));
}
createSpinners(sortListAlphabetically(playerNames));
}
});
Возвращает значения, а не имена, как вы можете видеть на этом рисунке, но это прогресс.