我最近一直在关注几个指南,其中一个来自 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());
}
});
就目前情况而言,我收到错误:
我哪里出错了?
更新了 @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));
}
});
这会返回值,但不会返回它们本身的名称,正如您在此图中看到的那样,但这是进步。
最佳答案
您需要创建另一个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/