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

Java 如何使ViewModel在首次运行时显示网络数据,java,android,android-volley,android-mvvm,Java,Android,Android Volley,Android Mvvm,我刚刚进入Android架构,在以下内容之后遇到了一个问题: ViewModel在第一次运行时未显示来自互联网的任何数据(我正在使用截击) UI保持空白,仅在更改时显示视图上的数据。i、 e屏幕旋转/刷新 如果我手动设置此数据,它会根据需要在第一次运行时显示这些数据 i、 edataSet.add(新的DecodeHouseDetails(1,1,1,“H2345”,“treutue.jpg”,“House 1”,“4345423232312”,“322434232”)//将数据添加到可变列表中

我刚刚进入Android架构,在以下内容之后遇到了一个问题:
ViewModel在第一次运行时未显示来自互联网的任何数据(我正在使用截击)
UI保持空白,仅在更改时显示视图上的数据。i、 e屏幕旋转/刷新

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

i、 edataSet.add(新的DecodeHouseDetails(1,1,1,“H2345”,“treutue.jpg”,“House 1”,“4345423232312”,“322434232”)//将数据添加到可变列表中

但一旦我包含了网络数据,它就会出现错误

我曾尝试检查我的存储库在第一次运行时是否返回空列表,但存储库中附加的toast显示数据接收良好,只是我不明白为什么在屏幕旋转或刷新之前数据不会显示

我的存储库

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();
                    }
                }
            }
        });
    }
}
公共类GetHouseDetailsRepository{
私有上下文;
私有静态最终字符串URL\u initializeDashboard=CustomFunctions.root\u house\u admin\u URL+“initialize\u dashboard”;
CustomFunctions func=新的CustomFunctions();
私有静态GetHouseDetails存储实例;
私有ArrayList数据集=新ArrayList();
私有JSONObject JSONObject;
公共静态GetHouseDetails存储getInstance(){
if(实例==null){
instance=new gethousedtailsrepository();
}
返回实例;
}
//为我们将从数据库中获取的数据制作一个可变列表
公共可变LiveData getHouseDetails(上下文mContext){
this.mContext=mContext;
getDatabaseHouseDetails();
MutableLiveData myData=新的MutableLiveData();
如果(数据集==null){
getDatabaseHouseDetails();
}
设置值(数据集);
返回myData;
}
//方法从数据库中实际获取数据
public void getDatabaseHouseDetails(){
//添加(新的DecodeHouseDetails(1,1,1,“H2345”,“treutue.jpg”,“Keja Mkononi”,“1”,“一个漂亮的房子”,“水,电”,“其他便利设施”,“5”,“1”,“Embu”,“1”,“1”,“1”,“1”,“1”,“4345423232”,“322434232”);//将数据添加到可变列表中
jsonObject=新的jsonObject();
试一试{
jsonObject.put(“me”,“funct.getSharedUserID(mContext));//已登录用户
}捕获(JSONException e){
e(“这里的JSONObject”,e.toString());
}
getResponse(mContext、Request.Method.GET、URL_initializeDashboard、jsonObject、新的VolleyNetworkRequestInterfaceSingleton.VolleyCallback(){
@凌驾
公共void onSuccessResponse(字符串响应){
if(响应!=null){
试一试{
JSONObject json=新的JSONObject(响应);
//成功获取
String sarray=json.getString(“house_details”);
Toast.makeText(mContext、sarray、Toast.LENGTH_SHORT).show();
JSONArray JSONArray=新JSONArray(sarray);
//清除列表以刷新每个选择中的列表
for(int i=0;i
我的ViewModel

public class GetHouseDetailsViewModel extends AndroidViewModel {
    //The data we fetch from asynchronously
    private MutableLiveData<List<DecodeHouseDetails>> mHouseDetailsList;
    private GetHouseDetailsRepository mHouseDetailsRepository;

    public GetHouseDetailsViewModel(@NonNull Application application) {
        super(application);
    }

    public void init(){
        if(mHouseDetailsList != null){
            mHouseDetailsList= new MutableLiveData<>();
        }
        mHouseDetailsRepository = GetHouseDetailsRepository.getInstance(); //Initialize the repository
        mHouseDetailsList = mHouseDetailsRepository.getHouseDetails(this.getApplication());
    }

    public LiveData<List<DecodeHouseDetails>> getHouseInfo() {
        if(mHouseDetailsList == null){
            mHouseDetailsList = new MutableLiveData<>();
        }
        return mHouseDetailsList;
    }
}
公共类GetHouseDetailsViewModel扩展了AndroidViewModel{
//我们异步获取的数据
私有可变LiveData mHouseDetailsList;
私人gethouse details住宅details住宅details住宅details住宅;
公共GetHouseDetailsViewModel(@NonNull应用程序){
超级(应用);
}
公共void init(){
如果(mHouseDetailsList!=null){
mHouseDetailsList=新的可变LiveData();
}
mHouseDetailsRepository=GetHouseDetailsRepository.getInstance();//初始化存储库
mHouseDetailsList=mHouseDetailsRepository.getHouseDetails(this.getApplication());
}
公共LiveData getHouseInfo(){
if(mHouseDetailsList==null){
mHouseDetailsList=新的可变LiveData();
}
返回mHouseDetailsList;
}
}
我的观点-片段

public class AdmManageHouses extends Fragment {
    private ProgressBar progressloader,progressloader_large;
    SwipeRefreshLayout refreshLayout;
    private TextView house_number_text,house_title_text,house_name_text;
    private GetHouseDetailsViewModel mHouseDetailsViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1_manage_houses, container, false);
        mHouseDetailsViewModel = ViewModelProviders.of(getActivity()).get(GetHouseDetailsViewModel.class);

        //Innitialize objects
        house_title_text= rootView.findViewById(R.id.house_title);
        house_number_text= rootView.findViewById(R.id.house_number);
        house_name_text= rootView.findViewById(R.id.house_name);

        //Initialize the view model
        mHouseDetailsViewModel.init();
        mHouseDetailsViewModel.getHouseInfo().observe(getViewLifecycleOwner(), new Observer<List<DecodeHouseDetails>>() {
            @Override
            public void onChanged(List<DecodeHouseDetails> decodeHouseDetails) {
                for(int i=0; i<decodeHouseDetails.size(); i++) {
                    house_number_text.setText(String.valueOf(decodeHouseDetails.get(i).getHouse_number()));
                    house_title_text.setText(decodeHouseDetails.get(i).getHouse_name());
                    house_name_text.setText(decodeHouseDetails.get(i).getHouse_name());
                }
            }
        });

        //Refresh on swipe
       refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                initializeDashboard();
                refreshLayout.setRefreshing(false);
            }
        });

        initializeDashboard();
        return rootView;
    }

    private void initializeDashboard() {
        for(int i=0; i<mHouseDetailsViewModel.getHouseInfo().getValue().size(); i++) {

            house_number_text.setText(String.valueOf(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_number()));
            house_title_text.setText(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_name());
            house_name_text.setText(mHouseDetailsViewModel.getHouseInfo().getValue().get(i).getHouse_name());
        }
    }
}
公共类admmanagehouse扩展片段{
private ProgressBar progressloader,progressloader_large;
SwipeRefreshLayout刷新布局;
私人文本查看房屋编号文本、房屋名称文本、房屋名称文本;
私人GetHouseDetailsViewModel mHouseDetailsViewModel;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.tab1\u manage\u house,container,false);
mHouseDetailsViewModel=ViewModelProviders.of(getActivity()).get(GetHouseDetailsViewModel.class);
//初始化对象
house\u title\u text=rootView.fin
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();
                    }
                }
            }
        });
    }