繁体   English   中英

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

[英]How to retrieve users from a LiveData List to display in a Spinner using Room Database

我最近一直在遵循CodeLabs 的几个指南来尝试为我的应用程序创建 Room 数据库。 我一直在使用的所有指南都使用 Recycler View。 我试图弄清楚如何使用这些数据并在不同类型的组件中实现它,但现在使用 Spinner 来显示用户。

我已经创建了我的实体、dao、数据库、存储库和视图模型,我认为正确放置。

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

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 (我认为)。 但是我的 UserListAdapter 中确实有一个 getItemCount 方法,所以我使用了它,然后在包含实体或表的用户类中使用了 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));
        }
    });

这将返回值,而不是它们本身的名称,如您在此图像中所见,但这是进步。

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM