2016-10-04 119 views
-2

重新加載一個ListView後重新加載一個ListView從數據庫中加載一個ListView的片段,它是一個用戶之前選擇的收藏列表,當您單擊列表項時,它會啓動一個活動並且用戶將能夠看到細節和不適當的項目問題是當用戶不滿意一個項目,並按回到fave列表片段的視圖仍然顯示第一個列表列表視圖不是更新的。我想知道如何當你開始一個活動回來片段的生命週期將努力再次知道在哪裏使用GoogleApiClient獲得的用戶,所以我用它來裝載位置,以實現我在從活動0123回到活動

adapter.notifyDataSetChanged()

林在我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 
      && 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()'是不是魔法棒刷新 – Selvin

+0

我uptadet我的問題有m個y代碼 – Blacksword

+0

After Unfavorite後,再做3件事1:從列表中刪除該項目。 2:從數據庫中刪除該數據。 3:在需要時重新載入列表上的項目。 –

回答

0

好吧,我解決了這個問題,我是notifyDataSetChanged,但實際上一切都被從數據庫加載所以之後我做出改變,我應該從數據庫重新加載列表併發送更改通知,所以我實現內部OnResume

的follwing代碼
@Override 
public void onResume() { 
    super.onResume(); 
    storedfavoritesitem = FavoriteModel.getAllFavorites(); 
    if (adapter!=null && 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(); 
    } 
    } 
} 

,它工作正常,現在每感謝一個

+2

將失敗,當位置= null – Neji

+0

ahhhh是啊謝謝,我會添加控制器 – Blacksword

0

移動你的代碼,加載DataList和餵它適配器從onCreate()onResume()

這將ENS當你的片段經過暫停 - 恢復階段時,你的列表將被重新加載。

並儘可能生命週期而言,也閱讀[片段生命週期] [** 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(); 
    } 
+0

裏面我已經試過了@ @Override public void onResume(){ super.onResume ();如果(適配器!=空){ adapter.notifyDataSetChanged(); }'它對我來說不起作用 – Blacksword

+1

,您的數據集必須更新,但事實並非如此。數據集沒有任何變化,這就是爲什麼沒有更改UI – Neji

0

adapter.notifyDataSetChanged()肯定會起作用。 您必須在調用活動完成之前使用startActivityForResult方法調用活動並傳遞resultCode。基於這個resultCode,你可以調用adapter.notifyDataSetChanged()。 這裏是示例代碼。請相應更換。

startActivityForResult(intent, requestCode); 

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