首次访问mvvm时从mvvm中获取的数据不会更新

如何解决首次访问mvvm时从mvvm中获取的数据不会更新

PreAdmissionList.java

public class PreAdmissionList extends Fragment implements View.OnClickListener,AdapterApprovalList.OnItemClickListener {

    private BasicInfoViewModel basicInfoViewModel;
    private AdapterApprovalList adapterApprovalList;
    private RecyclerView rvApprovalList;

    public PreAdmissionList() {
        // Required empty public constructor
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        // Inflate the layout for this fragment


        return inflater.inflate(R.layout.fragment_pre_admission_list,container,false);

    }

    @Override
    public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
        super.onViewCreated(view,savedInstanceState);
        view.findViewById(R.id.fab_add_new_admission).setOnClickListener(this);

        rvApprovalList = view.findViewById(R.id.rv_approval_list);


        basicInfoViewModel = new ViewModelProvider(requireActivity()).get(BasicInfoViewModel.class);
        basicInfoViewModel.init();
        basicInfoViewModel.getApprovalList().observe(getViewLifecycleOwner(),new Observer<List<ModelBasicInfo>>() {
            @Override
            public void onChanged(List<ModelBasicInfo> modelBasicInfos) {
                adapterApprovalList.notifyDataSetChanged();
            }
        });
        initRecyclerView();

    }

    private void initRecyclerView() {
        adapterApprovalList = new AdapterApprovalList(this,basicInfoViewModel.getApprovalList().getValue());
        rvApprovalList.setHasFixedSize(true);
        rvApprovalList.setLayoutManager(new LinearLayoutManager(getContext()));
        rvApprovalList.setAdapter(adapterApprovalList);
    }


}

AdapterApprovalList.java

public class AdapterApprovalList extends RecyclerView.Adapter<AdapterApprovalList.ALViewHolder>{

    private Context context;
    private OnItemClickListener onItemClickListener;

    private List<ModelBasicInfo> modelBasicInfoList;

    public AdapterApprovalList(OnItemClickListener onItemClickListener,List<ModelBasicInfo> modelBasicInfoList) {

        this.onItemClickListener = onItemClickListener;
        this.modelBasicInfoList=modelBasicInfoList;
    }

    @NonNull
    @Override
    public ALViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        context = parent.getContext();
        View view = LayoutInflater.from(context).inflate(R.layout.template_approval_list_item,parent,false);
        return new ALViewHolder(view,onItemClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull ALViewHolder holder,int position) {
        ModelBasicInfo basicInfo = modelBasicInfoList.get(position);
        StringBuilder fullName = new StringBuilder();
        fullName.append(basicInfo.getFirstName()).append(" ");
        fullName.append(basicInfo.getMiddleName()).append(" ");
        fullName.append(basicInfo.getLastName()).append(" ");

        holder.fullName.setText(fullName);

        holder.id.setText("RKC00"+String.valueOf(basicInfo.getId()));
    }

    @Override
    public int getItemCount() {
        return modelBasicInfoList.size();
    }

    static class ALViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        OnItemClickListener mOnItemClickListener;
        TextView fullName,id;
        public ALViewHolder(@NonNull View itemView,OnItemClickListener mOnItemClickListener) {
            super(itemView);
            this.mOnItemClickListener = mOnItemClickListener;
            fullName = itemView.findViewById(R.id.tv_text_full_name);
            id = itemView.findViewById(R.id.tv_text_approval_id);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            mOnItemClickListener.onApprovalItemClick(getAbsoluteAdapterPosition());
        }
    }

    public interface OnItemClickListener{
        void onApprovalItemClick(int position);
    }


}

BasicInfoViewModel.java

public class BasicInfoViewModel extends ViewModel {

    private BasicInfoRepo basicInfoRepo;
    private MutableLiveData<List<ModelBasicInfo>> approvalList;

    public void init(){
        if(approvalList != null){
            return;
        }
        basicInfoRepo = BasicInfoRepo.getInstance();
        approvalList = basicInfoRepo.getApprovalList();
    }

    public LiveData<List<ModelBasicInfo>> getApprovalList(){
        return approvalList;
    }

    public void insertBasicInfo(ModelBasicInfo modelBasicInfo){
        basicInfoRepo.insertData(modelBasicInfo);
    }

    public void updateApprovalStatus(int id){
        basicInfoRepo.updateStatus(id);
    }


}

BasicInfoRepo.java

public class BasicInfoRepo {

    private static BasicInfoRepo instance;

    static ConnectionClass connectionClass = new ConnectionClass();
    private List<ModelBasicInfo> approvalList = new ArrayList<>();


    public static BasicInfoRepo getInstance(){
        if(instance== null){
            instance = new BasicInfoRepo();
        }
        return instance;
    }

    public MutableLiveData<List<ModelBasicInfo>> getApprovalList(){
        loadApprovalList();
        MutableLiveData<List<ModelBasicInfo>> mList = new MutableLiveData<>();
        mList.setValue(approvalList);
        return mList;
    }

    private void loadApprovalList() {
        LoadApprovalList loadApprovalList = new LoadApprovalList();
        loadApprovalList.execute();

    }

    public void insertData(ModelBasicInfo modelBasicInfo){
        InsertBasicInfo insertBasicInfo = new InsertBasicInfo();
        insertBasicInfo.execute(modelBasicInfo);

    }

    public void updateStatus(int id){
        UpdateBasicInfo updateBasicInfo = new UpdateBasicInfo();
        updateBasicInfo.execute(id);
    }



    private static class InsertBasicInfo extends AsyncTask<ModelBasicInfo,Integer,String>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(ModelBasicInfo... model) {
            String result = null;

//            Log.i("Testing db",lists[0].get(0).getFirstName());
            try{
                Connection connection = connectionClass.CONN();
                if(connection==null){
                    result = "Error in connection !!!";
                }else{

                    //Date object
                    Date date= new Date();
                    //getTime() returns current time in milliseconds
                    long time = date.getTime();
                    //Passed the milliseconds to constructor of Timestamp class
                    Timestamp ts = new Timestamp(time);

                    PreparedStatement ps = connection.prepareStatement("insert into PreAdmissionDetails values(?,?,?)");
                    ps.setString(1,model[0].getFirstName());
                    ps.setString(2,model[0].getMiddleName());
                    ps.setString(3,model[0].getLastName());
                    ps.setString(4,model[0].getMotherName());
                    ps.setDate(5,java.sql.Date.valueOf(model[0].getDateOfBirth()));
                    ps.setString(6,model[0].getMobileNo());
                    ps.setInt(7,0);
                    ps.setInt(8,0);
                    ps.setBoolean(9,false);
                    ps.setTimestamp(10,ts);
                    ps.executeUpdate();
                    result = "Submitted Successfully !!!";

                }

            }catch (Exception ex){
                Log.e("sqlerror",ex.toString());
                result=ex.getMessage();
            }
            Log.e("sqlerror","result : "+result);
            return result;
        }


        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

    }

    private static class UpdateBasicInfo extends AsyncTask<Integer,String>{


        @Override
        protected String doInBackground(Integer... integers) {

            String result = null;

            try{
                Connection connection = connectionClass.CONN();
                if(connection==null){
                    result = "Error in connection !!!";
                }else{

                    PreparedStatement ps = connection.prepareStatement("UPDATE PreAdmissionDetails SET STATUS=? WHERE id=?");
                    ps.setInt(1,0);
                    ps.setInt(2,integers[0]);

                    ps.executeUpdate();
                    result = "Updated Successfully !!!";

                }

            }catch (Exception ex){
                Log.e("sqlerror","result : "+result.toString());
            return result;

        }
    }

    private class LoadApprovalList extends AsyncTask<Void,Void,Void>{
        @Override
        protected Void doInBackground(Void... voids) {
            String result = null;
            try{
                Connection connection = connectionClass.CONN();
                if(connection==null){
                    result = "Error in connection !!!";
                }else{

                    PreparedStatement ps = connection.prepareStatement("select * from preadmissiondetails");
                    ResultSet rs = ps.executeQuery();
                    approvalList.clear();
                    while (rs.next()) {
                    approvalList.add(new ModelBasicInfo(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7),rs.getInt(8),rs.getInt(9),rs.getBoolean(10)));}

                    result = "Fetched Successfully !!!";

                }

            }catch (Exception ex){
                Log.e("sqlerror","result : "+result.toString());

            return null;
        }
    }
}

问题出在这里,当我打开应用程序时,在回收站视图中没有任何项目,首先,我认为互联网速度可能很慢,它会在一段时间后获取数据,但不会显示数据。但是,当我导航到其他片段并返回到预录入列表时,它会显示数据。

解决方法

您的问题在这里:

display:none

public MutableLiveData<List<ModelBasicInfo>> getApprovalList(){ loadApprovalList(); MutableLiveData<List<ModelBasicInfo>> mList = new MutableLiveData<>(); mList.setValue(approvalList); return mList; } 启动一个AsyncTask,这是一个异步操作(换句话说,要花一些时间才能产生结果)。 loadApprovalList()方法不仅会停在那里并等待getApprovalList()完成。它会一直继续,并在第一次执行时返回一个空列表。但是到第二次执行时,loadApprovalList()现在有了一个值,因为AsyncTask已完成。因此,它将在第二次执行时返回正确的数据。当您返回到Fragment时,它会第二次执行,因为ViewModel中的approvalList块此时正在第二次执行。

解决方案是使init成为LiveData。这样,当AsyncTask更新ApprovalList时,您的ViewModel可以观察到更改。您的ViewModel应该在存储库中观察approvalList,就像您的片段在ViewModel中观察approvalList方法一样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-