Как получить пользователей из списка LiveData для отображения в Spinner с использованием базы данных комнат

1

Совсем недавно я следовал нескольким руководствам от 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());
        }
    });

В настоящее время я получаю сообщение об ошибке:

Изображение 174551

Куда я иду не так?

Обновлен повторный ответ @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));
        }
    });

Это возвращает значения, но не имена сами по себе, как вы можете видеть на этом изображении, но это прогресс.

Изображение 174551

Теги:
database
android-room

1 ответ

1
Лучший ответ

Вам нужно создать еще один 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.

  • 0
    Я вернул некоторые данные, но немного по-другому, я обновлю вопрос, чтобы показать вам
  • 0
    Обновлено. @JohnJoe
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню