Совсем недавно я следовал нескольким руководствам от CodeLabs, чтобы попытаться создать базу данных Room для своего приложения. Все руководства, которые я использовал, используют 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 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));
}
});
Это возвращает значения, но не имена сами по себе, как вы можете видеть на этом изображении, но это прогресс.
Вам нужно создать еще один ArrayList
используемый для хранения данных из mUsersViewModel.getAllUsers()
.
Для примера:
for(i<0;i<mUsersViewModel.getAllUsers().size; i++){
list.add(user.xxx) // get user info here
}
Только тогда вы можете передать список функции createSpinner
.
createSpinners(list);
На основании вашего отредактированного поста вы получаете список значений. Вы должны получить переменные внутри класса User. Пример: user.get(i).name
где name находится внутри класса User
.