如何使ViewModel首次运行时显示网络数据

时间:2019-06-17 15:42:22

标签: java android android-volley android-mvvm

我刚刚进入Android体系结构,并且在遵循this tutorial by mitch之后遇到了一个问题:
ViewModel在第一次运行时没有显示来自互联网的任何数据-我正在使用排球
用户界面保持空白,仅在onChange的视图上显示数据。即屏幕旋转/刷新

如果我手动设置此数据,它将根据需要在第一次运行时显示它们

dataSet.add(new DecodeHouseDetails(1,1,1,“ H2345”,“ treutue.jpg”,“房屋1”,“ 4345423232312”,“ 3224342434232”))); //将数据添加到可变列表

但是,一旦我包含了网络数据,它就会出现异常。

我尝试检查我的存储库在第一次运行时是否可以返回空列表,但是存储库中附带的烤面包显示数据很好地被接收,只是我不理解为什么直到屏幕旋转发生变化时才显示数据或刷新

我的存储库

{
   "users":["User 1","User 2","User 3"]
}

我的ViewModel

@GetMapping(value = "/user/",produces = "application/JSON")
public Map<String,Object> getUser(){
    Map<String,Object> result = new HashMap<String,Object>();
    List<String> newUsers = new ArrayList<String>();
    newUsers.add("User 1");
    newUsers.add("User 2");
    newUsers.add("User 3");
    result.put("users" , newUsers);
    return result;
}

我的视图-片段

public class GetHouseDetailsRepository {
    private Context mContext;
    private static final String URL_initializeDashboard= CustomFunctions.root_house_admin_url+"initialize_dashboard";
    CustomFunctions func= new CustomFunctions();

    private static GetHouseDetailsRepository instance;
    private ArrayList<DecodeHouseDetails> dataSet= new ArrayList<>();
    private JSONObject jsonObject;

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

    //Make a mutable list of the data that we will be getting from the database
    public MutableLiveData<List<DecodeHouseDetails>> getHouseDetails(Context mContext){
        this.mContext=mContext;
        getDatabaseHouseDetails();

        MutableLiveData<List<DecodeHouseDetails>> myData= new MutableLiveData<>();
        if(dataSet ==null){
            getDatabaseHouseDetails();
        }
        myData.setValue(dataSet);
        return myData;
    }

    //Method to actually get the data from the database
    public void getDatabaseHouseDetails(){
        //dataSet.add(new DecodeHouseDetails(1,1,1,"H2345","treutue.jpg","Keja Mkononi","1","A nice house","Water,electrivit","Other amenities","5","1","Embu","1","1","1","1","4345423232312","3224342434232") ); //Add data to the mutatable list
        jsonObject= new JSONObject();
        try {
            jsonObject.put("me",""+func.getSharedUserID(mContext) );//Logged in user
        } catch (JSONException e) {
            Log.e("JSONObject Here", e.toString());
        }
        VolleyNetworkRequestInterfaceSingleton.getResponse(mContext,Request.Method.GET, URL_initializeDashboard, jsonObject,new VolleyNetworkRequestInterfaceSingleton.VolleyCallback(){
            @Override
            public void onSuccessResponse(String response) {
                if(response!=null) {
                    try {
                        JSONObject json = new JSONObject(response);
                        //Successfully fetched
                        String sarray = json.getString("house_details");
                        Toast.makeText(mContext, sarray, Toast.LENGTH_SHORT).show();
                        JSONArray jsonArray = new JSONArray(sarray);

                        //Clear list to refresh list in every selection
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject json_list = jsonArray.getJSONObject(i);
                            DecodeHouseDetails houses_array = new DecodeHouseDetails(
                                    json_list.getInt("active_identifier"),
                                    json_list.getInt("house_id"),
                                    json_list.getInt("house_status"),
                                    json_list.getString("house_number"),
                                    json_list.getString("house_cover"),
                                    json_list.getString("house_name"),
                                    json_list.getString("longitude"),
                                    json_list.getString("latitude")
                            );
                            dataSet.add(houses_array);
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

彻底检查了viewmodel之后,我发现问题出在存储库中,而不是viewModel。我没有正确调用setValue()。 第一次运行-当列表为空时-直到onChange都无法填充UI。
我对存储库进行了以下更改

即 声明myData变量

Private MutableLiveData<List<DecodeHouseDetails>> myData= new MutableLiveData<>();

//Make a mutable list of the data that we will be getting from the database
    public MutableLiveData<List<DecodeHouseDetails>> getHouseDetails(Context mContext){
        this.mContext=mContext;
        getDatabaseHouseDetails();

        return myData;
    }

    //Method to actually get the data from the database
    public void getDatabaseHouseDetails(){
        //dataSet.add(new DecodeHouseDetails(1,1,1,"H2345","treutue.jpg","Keja Mkononi","1","A nice house","Water,electrivit","Other amenities","5","1","Embu","1","1","1","1","4345423232312","3224342434232") ); //Add data to the mutatable list
        jsonObject= new JSONObject();
        try {
            jsonObject.put("me",""+func.getSharedUserID(mContext) );//Logged in user
        } catch (JSONException e) {
            Log.e("JSONObject Here", e.toString());
        }
        VolleyNetworkRequestInterfaceSingleton.getResponse(mContext,Request.Method.GET, URL_initializeDashboard, jsonObject,new VolleyNetworkRequestInterfaceSingleton.VolleyCallback(){
            @Override
            public void onSuccessResponse(String response) {
                if(response!=null) {
                    try {
                        JSONObject json = new JSONObject(response);
                        //Successfully fetched
                        String sarray = json.getString("house_details");
                        Toast.makeText(mContext, sarray, Toast.LENGTH_SHORT).show();
                        JSONArray jsonArray = new JSONArray(sarray);

                        //Clear list to refresh list in every selection
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject json_list = jsonArray.getJSONObject(i);
                            DecodeHouseDetails houses_array = new DecodeHouseDetails(
                                    json_list.getInt("active_identifier"),
                                    json_list.getInt("house_id"),
                                    json_list.getInt("house_status"),
                                    json_list.getString("house_number"),
                                    json_list.getString("house_cover"),
                                    json_list.getString("house_name"),
                                    json_list.getString("longitude"),
                                    json_list.getString("latitude")
                            );
                            dataSet.add(houses_array);
                        }

                        myData.setValue(dataSet);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }