java - 如何使用房间数据库从 LiveData 列表中检索用户以显示在 Spinner 中

标签 java android database android-room

我最近一直在关注几个指南,其中一个来自 CodeLabs尝试为我的应用程序创建一个房间数据库。我使用过的所有指南都使用回收器 View 。我正在尝试弄清楚如何使用这些数据并在不同类型的组件中实现它,但现在使用 Spinner 来显示用户。

我已经创建了我的实体、dao、数据库、存储库和 View 模型,并且我认为位置正确。

我的适配器与指南不同,因为它们使用用于回收器 View 的代码。我希望我的数据出现在微调器中。

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 adapter.我刚刚删除了与回收器 View 相关的所有内容,并将剩余的代码用于我的适配器。

我在数据库类中的构建过程中预先填充了数据库的默认值“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());
        }
    });

就目前情况而言,我收到错误:

error

我哪里出错了?

更新了 @JohnJoe 的回复:

我尝试了你的方法,但 getAllUsers 没有 .Size 方法,因为它是 LiveData (我认为)。但我的 UserListAdapter 中有一个 getItemCount 方法,所以我使用了它,然后在包含实体或表的 Users 类中使用了 get name 方法,留下如下代码:

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));
        }
    });

这会返回值,但不会返回它们本身的名称,正如您在此图中看到的那样,但这是进步。

enter image description here

最佳答案

您需要创建另一个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 类内。

关于java - 如何使用房间数据库从 LiveData 列表中检索用户以显示在 Spinner 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55724250/

相关文章:

android - 我可以在伴生对象中共享 ViewModel 吗?

java - 如何获取点后的值

php - 使用 MySQL + PHP 更新多个变量

Java 正则表达式在空格上拆分/未在前面

java - Swing 单选按钮小程序故障排除

android - pubnub.subscribe 没有响应

JavaDB连接错误(网络协议(protocol))

mysql - MySql 中的虚拟文件夹系统,带有 "templates"

java - SQLite - Bukkit 插件中的奇怪 NPE

java - 如何使用带有用户、组和权限的简单权限系统的 JPA?