#java #android #database #android-room
#java #Android #База данных #android-room
Вопрос:
Я следовал нескольким руководствам, совсем недавно это из CodeLabs, чтобы попытаться создать базу данных Room для моего приложения. Во всех руководствах, которые я использовал, используется представление Recycler. Я пытаюсь выяснить, как использовать эти данные и реализовать их в компонентах другого типа, но пока для отображения пользователей используется счетчик.
У меня есть моя сущность, dao, база данных, репозиторий и модель представления, и я думаю, что все работает правильно.
Мой адаптер отличается от руководства, поскольку они используют код, предназначенный для просмотра 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», предварительно заполняющие базу данных во время сборки в классе database, вот этот метод:
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, который содержит объект или таблицу, чтобы оставить код таким:
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));
}
});
Это возвращает значения, но не имена самих себя, как вы можете видеть на этом изображении, но это прогресс.
Комментарии:
1.
mUsersViewModel.getAllUsers
вернетсяArrayList
?2. @JohnJoe Он возвращает
LiveData<List<Users>>
3. вы получаете значение списка. Вы должны извлекать переменные внутри пользовательского класса. Пример: user.get(i).name где name находится внутри класса User.
Ответ №1:
Вам нужно создать другой ArrayList
, используемый для хранения данных mUsersViewModel.getAllUsers()
.
Для примера:
for(i<0;i<mUsersViewModel.getAllUsers().size; i ){
list.add(user.xxx) // get user info here
}
Тогда только вы можете передать список в createSpinner
function.
createSpinners(list);
Основываясь на вашем отредактированном сообщении, вы получаете значение списка. Вы должны извлекать переменные внутри пользовательского класса. Пример: user.get(i).name
где имя находится внутри User
класса.
Комментарии:
1. Я получил некоторые данные обратно, но немного по-другому, я обновлю вопрос, чтобы показать вам
2. Обновлено. @JohnJoe
3. ДжонДжо, это работает с момента вашего последнего комментария к вопросу! Я предлагаю вам обновить свой ответ, спасибо!