#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