Как заставить ViewModel отображать данные сети при первом запуске - PullRequest
0 голосов
/ 17 июня 2019

Я только начинаю изучать архитектуру Android и столкнулся с проблемой после изучения этого урока mitch :ViewModel не показывает никаких данных из Интернета - я использую залп - при первом запуске .Пользовательский интерфейс остается пустым и отображает данные только в представлениях onChange.т.е. поворот экрана / обновление

Если я вручную установлю эти данные, они будут отображаться при первом запуске, как требуетсят.е. dataSet.add (новые DecodeHouseDetails (1,1,1, "H2345", "treutue.jpg", "Дом 1", "4345423232312", "3224342434232"));// Добавить данные в список с возможностью изменения Но как только я включаю сетевые данные, они плохо себя ведут.

Я попытался проверить, может ли мой репозиторий возвращать нулевой список при первом запуске, но тост, прикрепленный внутри репозитория, показывает, что данные были приняты хорошо, только то, чтоЯ не понимаю, почему он не будет отображаться до изменения поворота экрана или обновления

Мой репозиторий

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

Моя 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;
    }
}

Мой взгляд - фрагмент

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

1 Ответ

0 голосов
/ 18 июня 2019

После тщательной проверки модели представления я обнаружил, что проблема была в хранилище, а не в модели представления. Я не вызывал setValue () должным образом. Это привело к тому, что при первом запуске (когда список пуст), пользовательский интерфейс не заполнялся до onChange.
Я сделал следующие изменения в хранилище

т.е. Объявите переменную 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();
                    }
                }
            }
        });
    }
...