мой список не отображается, когда я нажимаю на кнопку

#java #android #android-fragments #viewmodel

#java #Android #android-фрагменты #viewmodel

Вопрос:

На самом деле я не смог найти здесь никакой ошибки. Я думаю, что я что-то здесь упускаю. эта кнопка filtersbutton не работает. Ваша помощь будет оценена. Спасибо

Это мой 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;
}
  

Ответ №1:

Что вы имеете в виду, что он не отображается? Это не отображается в пользовательском интерфейсе или в журналах? Потому что, когда вы вызываете getFilteredRooms, вы ничего не делаете с результатом. Я бы предложил переместить вызов репозитория в ViewModel, чтобы вместо вызова getFilteredRooms во фрагменте вы вызывали что-то вроде ViewModel.getFilteredRooms, а затем в viewmodel вы вызываете репозиторий и используете результат для установки значения livedata. Затем во фрагменте вам просто нужно просмотреть эту переменную и на основе этого обновить пользовательский интерфейс. Поступая таким образом, вы отделяете логику (viewmodel и репозиторий) от части пользовательского интерфейса (фрагмента).

Вот хороший учебник о том, как кодировать с использованием шаблона mvvm:https://medium.com/@er.ankitbisht/mvvm-model-view-viewmodel-kotlin-google-jetpack-f02ec7754854

Комментарии:

1. Не могли бы вы, пожалуйста, сделать это для меня? Я буду вам благодарен. Потому что я новичок здесь.

2. Я добавил ссылку в ответе к руководству. Для новичка я бы посоветовал сначала прочитать о mvvm: как отделить ваш пользовательский интерфейс от логики приложения, как работать с сопрограммами и т.д.

3. сэр, я обновил свою viewmodel. теперь он показывает мне эту ошибку. Вызвано: java.lang.RuntimeException: Не удается создать экземпляр class .viewmodel. FilterRoomsViewModel в этой строке mViewModel.getSortBy().observe(this, Observer -> { Log.i("Viewmodel", "Viewmodel ,sortby: " mViewModel.sortBy.getValue()); });

4. Пожалуйста, создайте другой вопрос, потому что это другой вопрос. Кроме того, не забудьте проголосовать за ответ, если я помог;)