![](/img/trans.png)
[英]MVVM with Room and LiveData - How to get List from LiveData
[英]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.