Java Viewmodel没有';无法从Android Room更新数据,但已成功插入其中

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<

我试图用它来理解Room持久性库,但是,我坚持更新RecyclerView并用Room中的数据填充它。对不起,这个样板代码。 正如Android数据库检查器向我展示的那样,数据成功地传递到房间并保存在那里,但同时,Rycyclerview是空的。这是我的代码:
项目:

存储库类

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