Java 如何使ViewModel在首次运行时显示网络数据
我刚刚进入Android架构,在以下内容之后遇到了一个问题: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”)//将数据添加到可变列表中
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();
}
}
}
});
}