Перезагрузите ListView внутри фрагмента после нажатия кнопки «Назад» из Activity

#android #listview #android-fragments

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

Вопрос:

у меня есть фрагмент, который загружает ListView из базы данных, и это список избранных, который пользователь выбирал раньше, когда вы нажимаете на элемент списка, он запускает действие, и пользователь сможет увидеть детали и оценить элемент проблема заключается в том, что пользователь оценивает элемент и нажимает спина к спинедля фрагмента списка фаворитов в представлении по-прежнему отображается первый lodaded listview, а не обновленный. я хочу знать, как будет работать жизненный цикл фрагмента, когда вы начнете действие и вернетесь снова, чтобы узнать, где реализовать мой

adapter.notifyDataSetChanged()

Я использую GoogleApiClient для получения местоположения пользователя, поэтому я использую для загрузки базы данных в моем методе OnConnected:

     @Override
public void onConnected(@Nullable Bundle bundle) {

    LocationServices.FusedLocationApi.requestLocationUpdates(
            mLocationClient, mLocationRequest, this);

    if (    ContextCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            amp;amp; ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // You need to ask the user to enable the permissions
    } else {
        LocationTracker tracker = new LocationTracker(getContext()) {
            @Override
            public void onLocationFound(@NonNull Location location) {
                currentLocation = location;
            }
            @Override
            public void onTimeout() {
            }
        };
        tracker.startListening();
    }
    if (currentLocation ==null) {
        currentLocation = LocationServices.FusedLocationApi.getLastLocation(mLocationClient);
    }

    if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION},
                PERMISSION_ACCESS_COARSE_LOCATION);
    }
    if (currentLocation != null) {
        //Loading LAT LOng of //arkers on map
        for(int i=0; i<storedfavoritesitem.size(); i  ) {
            FavoriteModel Faveitem = storedfavoritesitem.get(i);
            String locality = Faveitem.name;
            int id = Faveitem.id;
            double lat = Faveitem.lat;
            double lon =  Faveitem.lon;
            Location location = new Location("Beach");
            location.setLatitude(lat);
            location.setLongitude(lon);
            float distance = currentLocation.distanceTo(location);
            mResualt.add(new SearchResualtClass(id, distance / 1000, locality));
        }
        Comparator<SearchResualtClass > comperator = new Comparator<SearchResualtClass>()
        {
            @Override
            public int compare(SearchResualtClass  object1, SearchResualtClass  object2) {
                float First = object1.getDistance();
                float Second = object2.getDistance();
                return (First < Second ? -1 : (First == Second ? 0 : 1));
            }
        };
        Collections.sort(mResualt, comperator);
        adapter = new CustomAdapterSearch(getActivity().getApplicationContext(),mResualt);
        exList.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

    exList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            Intent intent = new Intent(view.getContext(), FragmentBeach.class);
            intent.putExtra("array", jsonArray.toString());
            SearchResualtClass item = (SearchResualtClass) parent.getItemAtPosition(position);
            intent.putExtra("id", item.getId());
            startActivity(intent);
        }
    });
}
  

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

1. Это зависит от того, когда вы загружаете данные… также adapter.notifyDataSetChanged() не является волшебной палочкой для обновления

2. я уточняю свой вопрос своими кодами

3. После неблагоприятного результата просто сделайте еще 3 вещи — 1: удалите этот элемент из своего списка. 2. Удалите эти данные из своей базы данных. 3: Перезагрузите элементы списка, когда вам нужно.

4. @DeepanshuHarbola конечно, но как и где? я пробовал некоторые методы, но это не сработало

5. где вы выполняете операцию для неблагоприятных

Ответ №1:

adapter.notifyDataSetChanged() обязательно сработает. Вы должны вызвать activity с помощью метода startActivityForResult и передать resultCode до завершения вызываемой активности. На основе этого результирующего кода вы можете вызвать adapter.notifyDataSetChanged() . Вот пример кода. Пожалуйста, замените соответствующим образом.

 startActivityForResult(intent, requestCode);

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 1) {
        adapter.notifyDataSetChanged();
    }
}
  

Ответ №2:

Переместите свой код, который загрузил список данных, и передайте его адаптеру из onCreate() в onResume()

Это гарантирует, что ваш список будет перезагружаться всякий раз, когда ваш фрагмент проходит фазу приостановки-возобновления.

И что касается жизненного цикла, прочитайте [Жизненные циклы фрагментов] [**1]

Обновление: вам нужно будет обновить storedfavoritesitem , а затем запустить следующий фрагмент кода

 if (currentLocation != null) {
        //Loading LAT LOng of //arkers on map
        for(int i=0; i<storedfavoritesitem.size(); i  ) {
            FavoriteModel Faveitem = storedfavoritesitem.get(i);
            String locality = Faveitem.name;
            int id = Faveitem.id;
            double lat = Faveitem.lat;
            double lon =  Faveitem.lon;
            Location location = new Location("Beach");
            location.setLatitude(lat);
            location.setLongitude(lon);
            float distance = currentLocation.distanceTo(location);
            mResualt.add(new SearchResualtClass(id, distance / 1000, locality));
        }
        Comparator<SearchResualtClass > comperator = new Comparator<SearchResualtClass>()
        {
            @Override
            public int compare(SearchResualtClass  object1, SearchResualtClass  object2) {
                float First = object1.getDistance();
                float Second = object2.getDistance();
                return (First < Second ? -1 : (First == Second ? 0 : 1));
            }
        };
        Collections.sort(mResualt, comperator);
     if(adapter == null){
        adapter = new CustomAdapterSearch(getActivity().getApplicationContext(),mResualt);
        exList.setAdapter(adapter);
    }else{
        adapter.notifyDataSetChanged();
    }
  

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

1. я уже пробовал @Override public void onResume() { super.onResume(); if (adapter != null) { adapter.notifyDataSetChanged(); } , у меня это не работает

2. чтобы это сработало, ваш набор данных должен быть обновлен, но это не так. В вашем наборе данных нет изменений, поэтому в пользовательском интерфейсе нет изменений

Ответ №3:

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

  @Override
public void onResume() {
    super.onResume();
    storedfavoritesitem = FavoriteModel.getAllFavorites();
    if (adapter!=null amp;amp; currentLocation!=null) {
        mResualt.clear();
        for (int i = 0; i < storedfavoritesitem.size(); i  ) {
            FavoriteModel Faveitem = storedfavoritesitem.get(i);
            String locality = Faveitem.name;
            int id = Faveitem.id;
            double lat = Faveitem.lat;
            double lon = Faveitem.lon;
            Location location = new Location("Beach");
            location.setLatitude(lat);
            location.setLongitude(lon);
            float distance = currentLocation.distanceTo(location);
            mResualt.add(new SearchResualtClass(id, distance / 1000, locality));
        }
        adapter.notifyDataSetChanged();
    }
  }
}
  

и теперь все работает нормально, спасибо всем

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

1. произойдет сбой, если location = null