1

我刚刚进入 Android 架构,并在 mitch 遵循本教程后遇到了一个问题:
ViewModel 不显示来自互联网的任何数据-我正在使用 volley-on first run
UI 保持空白,仅在 onChange 视图上显示数据。即屏幕旋转/刷新

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

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

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

我已经尝试检查我的存储库是否可以在第一次运行时返回一个空列表,但是存储库中附加的 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();
                    }
                }
            }
        });
    }
}

我的视图模型

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

我的观点 - 片段

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

1 回答 1

0

在彻底检查视图模型后,我发现问题出在存储库中,而不是视图模型。我没有正确调用 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();
                    }
                }
            }
        });
    }
于 2019-06-18T16:36:00.107 回答