Java Viewmodel没有';无法从Android Room更新数据,但已成功插入其中
我试图用它来理解Room持久性库,但是,我坚持更新RecyclerView并用Room中的数据填充它。对不起,这个样板代码。 正如Android数据库检查器向我展示的那样,数据成功地传递到房间并保存在那里,但同时,Rycyclerview是空的。这是我的代码:Java Viewmodel没有';无法从Android Room更新数据,但已成功插入其中,java,android,mvvm,android-recyclerview,android-room,Java,Android,Mvvm,Android Recyclerview,Android Room,我试图用它来理解Room持久性库,但是,我坚持更新RecyclerView并用Room中的数据填充它。对不起,这个样板代码。 正如Android数据库检查器向我展示的那样,数据成功地传递到房间并保存在那里,但同时,Rycyclerview是空的。这是我的代码: 项目: 刀 存储库类 public class Dashboard_Repository { private Dashboard_DAO mDashboardDao; private LiveData<List<
项目: 刀 存储库类
public class Dashboard_Repository {
private Dashboard_DAO mDashboardDao;
private LiveData<List<Dashboard_Account>> mAllAccounts;
Dashboard_Repository(Application application) {
Dashboard_Database db = Dashboard_Database.getDatabase(application);
mDashboardDao = db.dashboard_dao();
mAllAccounts = mDashboardDao.getAllAccounts();
}
LiveData<List<Dashboard_Account>> getAllAcounts(){
return mAllAccounts;
}
public void insert (Dashboard_Account account) {
new insertAsyncTask(mDashboardDao).execute(account);
}
private static class insertAsyncTask extends AsyncTask<Dashboard_Account, Void, Void> {
private Dashboard_DAO mAsyncTaskDao;
insertAsyncTask(Dashboard_DAO mDashboardDao) {
mAsyncTaskDao = mDashboardDao;
}
@Override
protected Void doInBackground(final Dashboard_Account... params) {
mAsyncTaskDao.insert(params[0]);
return null;
}
}
以及recyclerview设置的代码:
private void setRecyclerView(){
binding.accountView.setLayoutManager(new LinearLayoutManager(requireContext()));
adapter = new Dashboard_RecyclevrViewAdapter(AccountItemList);
dashboardViewModel.getmAllAccounts().observe(requireActivity(), accounts -> {
adapter.setListContent(AccountItemList);
});
binding.accountView.setAdapter(adapter);
}
RecycleServiceAdapter是典型的,在BindViewHolder和setListcontent上:
public class Dashboard_RecyclevrViewAdapter extends RecyclerView.Adapter<Dashboard_RecyclevrViewAdapter.MyViewHolder> {
....
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
if(pad_list!=null){
final Dashboard_Account account = pad_list.get(position);
holder.binding.accountType.setText(account.getAccountName());
holder.binding.acountemail.setText(account.getAccountValue()));
}
}
…
public void setListContent(List <Dashboard_Account> pad_list) {
this.pad_list = pad_list;
notifyItemChanged(getItemCount());
}
….
}
public class Dashboard\u RecyclevrViewAdapter扩展了RecyclerView.Adapter{
....
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
if(pad_list!=null){
最终仪表板\帐户=pad\ u list.get(位置);
holder.binding.accountType.setText(account.getAccountName());
holder.binding.acountmail.setText(account.getAccountValue());
}
}
…
公共作废setListContent(列表栏){
this.pad_list=pad_list;
notifyItemChanged(getItemCount());
}
….
}
我真的不明白为什么在我将项目添加到ViewModel后,recycler视图不显示数据,理论上应该可以处理这个问题。我会提供额外的代码,如果需要的话。提前感谢。除了@a_local\u nobody指出的
notifyDataSetChanged()
之外,您需要将更新的列表发送到RecyclerView
适配器,而不是原始列表
public void setListContent(List <Dashboard_Account> pad_list) {
this.pad_list = pad_list;
notifyItemChanged(getItemCount());
}
为此,请替换dapter.setListContent(AccountItemList)代码>带有dapter.setListContent(帐户)代码>在setRecyclerView()中
private void setRecyclerView(){
binding.accountView.setLayoutManager(新的LinearLayoutManager(requireContext());
适配器=新仪表板\u RecyclevrViewAdapter(AccountItemList);
dashboardViewModel.getmAllAccounts().observe(Requiresponsibility(),accounts->{
adapter.setListContent(帐户)//
public class Dashboard_ViewModel extends AndroidViewModel {
private Dashboard_Repository mRepo;
private LiveData<List<Dashboard_Account>> mAllAccounts;
public Dashboard_ViewModel(@NonNull Application application) {
super(application);
mRepo = new Dashboard_Repository(application);
mAllAccounts = mRepo.getAllAcounts();
}
LiveData<List<Dashboard_Account>> getmAllAccounts() { return mAllAccounts; }
public void insert(Dashboard_Account account) { mRepo.insert(account); }
}
public class Dashboard_Fragment extends Fragment {
…
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
setRecyclerView();
getParentFragmentManager().setFragmentResultListener("fragmentKey", getViewLifecycleOwner(), (requestKey, result) -> {
String name = result.getString("nameResult");
String email = result.getString ("email");
Dashboard_Account account = new Dashboard_Account(name,email);
dashboardViewModel.insert(account);
});
}
private void setRecyclerView(){
binding.accountView.setLayoutManager(new LinearLayoutManager(requireContext()));
adapter = new Dashboard_RecyclevrViewAdapter(AccountItemList);
dashboardViewModel.getmAllAccounts().observe(requireActivity(), accounts -> {
adapter.setListContent(AccountItemList);
});
binding.accountView.setAdapter(adapter);
}
public class Dashboard_RecyclevrViewAdapter extends RecyclerView.Adapter<Dashboard_RecyclevrViewAdapter.MyViewHolder> {
....
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
if(pad_list!=null){
final Dashboard_Account account = pad_list.get(position);
holder.binding.accountType.setText(account.getAccountName());
holder.binding.acountemail.setText(account.getAccountValue()));
}
}
…
public void setListContent(List <Dashboard_Account> pad_list) {
this.pad_list = pad_list;
notifyItemChanged(getItemCount());
}
….
}
public void setListContent(List <Dashboard_Account> pad_list) {
this.pad_list = pad_list;
notifyItemChanged(getItemCount());
}
void setWords(List<Word> words){
mWords = words;
notifyDataSetChanged(); <-- notifyDataSetChanged, not itemChanged
}
private void setRecyclerView(){
binding.accountView.setLayoutManager(new LinearLayoutManager(requireContext()));
adapter = new Dashboard_RecyclevrViewAdapter(AccountItemList);
dashboardViewModel.getmAllAccounts().observe(requireActivity(), accounts -> {
adapter.setListContent(accounts); // <<< Change here
});
binding.accountView.setAdapter(adapter);
}