java - 当我单击按钮时,我的列表没有显示
问题描述
实际上我在这里找不到任何错误。我想我在这里错过了一些东西。此过滤器按钮不起作用。您的帮助将不胜感激。谢谢
这是我的 fragment.class
sortByLeastExpensive = rootView.findViewById(R.id.sort_by_least_expensive);
sortByMostExpensive = rootView.findViewById(R.id.sort_by_most_expensive);
sortByMostRecent = rootView.findViewById(R.id.sort_by_most_recent);
applyFiltersBtn = rootView.findViewById(R.id.apply_filters_btn);
sortByLeastExpensive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//set the filter; or call the viewmodel to set the filter?
mViewModel.sortBy.setValue(getResources().getString(R.string.sort_rooms_ascending));
}
});
sortByMostExpensive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewModel.sortBy.setValue(getResources().getString(R.string.sort_rooms_descending));
}
});
sortByMostRecent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mViewModel.sortBy.setValue("sort_most_recent");
}
});
return rootView;
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(getActivity()).get(FilterRoomsViewModel.class);
mViewModel.getSortBy().observe(this, Observer -> {
Log.i("Viewmodel", "Viewmodel ,sortby: " + mViewModel.sortBy.getValue());
});
applyFiltersBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FilterRoomsRepository roomsRepository = new FilterRoomsRepository();
roomsRepository.getFilteredRooms(mViewModel.sortBy.getValue());
}
});
}
这是 viewmodel.class
我已经更新了我的 viewmodel.class。现在它向我展示了 fragment.class 上的另一个错误
public FilterRoomsViewModel(Application application){
super();
FilterRoomsRepository filterRoomsRepository = new FilterRoomsRepository(application);
}
public MutableLiveData<String> getRooms(){
if (rooms==null){
rooms = new MutableLiveData<String>();
}
return rooms;
}
public LiveData<String> getSortBy() {
if (sortBy == null){
sortBy = new MutableLiveData<String>();
}
return sortBy;
}
这是repository.class
if(sortyBy.equals("ascending")){
Log.i("Sort by", "Rooms sorted in ascending order");
filterQuery.orderByAscending("roomRentalAmount");
}else if (sortyBy.equals("descending")){
Log.i("Sort by", "Rooms sorted in descending order");
filterQuery.orderByDescending("roomRentalAmount");
}else {
filterQuery.orderByDescending("updatedAt");
}
filterQuery.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if(e == null){
//success
Log.i("Rooms", "Filtered rooms, " + objects.get(0).getObjectId());
rooms.setValue(objects);
}else{
//error, handle accordingly
Log.e("Error", "Error filtering, " + e.getMessage());
}
}
});
Log.i("Rooms", "Live data rooms, " + rooms.getValue());
return rooms;
}
解决方案
你的意思是它没有显示?它没有显示在用户界面或日志中?因为当您调用 getFilteredRooms 时,您不会对结果做任何事情。我建议将存储库调用移动到 viewModel,这样您就可以调用 viewModel.getFilteredRooms 之类的东西,而不是在片段中调用 getFilteredRooms,然后在视图模型中调用存储库并使用结果进行设置实时数据的价值。然后,在片段中,您只需要观察此变量并基于此更新 ui。通过这样做,您将逻辑(视图模型和存储库)与 ui 部分(片段)分开。
这是一个关于如何使用 mvvm 模式进行编码的好教程:https ://medium.com/@er.ankitbisht/mvvm-model-view-viewmodel-kotlin-google-jetpack-f02ec7754854
推荐阅读
- tensorflow - Tensorflow:从多项分布中生成样本[空间有效方式?]
- sql - 表中的唯一字段变体是什么
- laravel - Laravel QR 阅读器不使用 .vue 文件
- python - 最适合存储交叉引用的文件格式
- replace - 如何在以另一个字符串开头的行中查找和替换字符串的所有实例?记事本++
- sql - Oracle SQL 时间格式
- javascript - 如何使用 js 更改 jquery 滑块值
- ruby-on-rails-5 - 更新与 ActiveRecord 关联的哈希中的信息 rails 5
- css - avoid redundant sass imports in webpack3 client bundle's
- javascript - Angular ngx-infinite-scroll is not working