2016-09-17 15 views
5

w zmianie preferencji słuchacza mam ustawić go pobrać nowe dane za pomocą Loader a następnie wypełnić ListView, ale tylko funkcja onCreateLoader() nazywa kiedy zmienić preferencje, funkcja onLoadFinished() zwrotna pozostaje bezsensowne zachowanie, stąd moja ListView w nie aktualizowany o nowe dane, ja też zdarzy się, że przycisk odświeżania, który robi to samo, to znaczy pobiera przyrost danych i wypełnia listę z nowymi danymi, ale tutaj w onLoadFinished() nazywa stąd poprzez aktualizację wykazu.Loader onLoadFinished() nie nazywa

Kod przycisk odświeżania

case R.id.menu_refresh : 
      ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
      if(isConnected) 
      { 
       getSupportLoaderManager().initLoader(0,null,this).forceLoad(); 
      } 
      else { 
       Toast.makeText(this,"No Internet",Toast.LENGTH_SHORT).show(); 
      } 
      break; 

Kod SharedPreference słuchacz:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { 
    ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
    if(isConnected) 
    { 
     //delfromold(); 
     getSupportLoaderManager().initLoader(0,null,this).forceLoad(); 
     Log.v("Prefrences Changed",s); 
    } 
} 

EDIT

Loader Realizacja

public class Loade extends AsyncTaskLoader<ArrayList<CustomL>>{ 

Context mCon; 

public Loade(Context context) { 
    super(context); 
    mCon = context; 
} 

@Override 
public ArrayList<CustomL> loadInBackground() { 
    ArrayList<CustomL> maList = null; 
    try { 
     Log.v("Loader","Called"); 
     maList = GetList.makelist(mCon); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return maList; 
} 
} 

Ładowarka:

public Loader<ArrayList<CustomL>> onCreateLoader(int id, Bundle args) { 
    return new Loade(this); 
} 

public void onLoadFinished(Loader<ArrayList<CustomL>> loader, ArrayList<CustomL> data) { 
    Log.v("Load","Finished"); 
    maklst(data); 
} 
+0

W makelist funkcji klasy getlist nowe dane zostaną pobrane i zapisane w tabeli i może potwierdzić, że, ale jej po prostu nie zatrzymać onLoadFinished dosnt sprawdzony i maklst funkcja, która aktualizuje listę z nowymi danymi nie nazywa, ale kiedy Wywołuję ten sam program ładujący z odświeżania wywołania onLoadFinished –

Odpowiedz

0

Nie można poprawnie wdrożyć i używać urządzenia Loader. Jednak ciężko jest to zrobić.

Z powyższego kodu widzę, że używasz metody forceload(), ale nie zaimplementowałeś jej w swoim Loader. Jeśli zaznaczysz kod źródłowy dla programu ładującego, ta metoda po prostu wywoła zdarzenie onForceload(), które nie robi nic. Zgodnie z docs „podklasy musi wdrożyć to, aby dbać o dopuszczenie do forceLoad(). To zawsze będzie wywoływana z głównego wątku procesu wywołującego tę funkcję. ”

Należy przeczytać this samouczek i zacząć stamtąd.

Ogólna koncepcja polega na tym, że po zakończeniu realizacji AsyncTaskLoader twoje fragmenty/czynności nie będą bezpośrednio kontaktować się z ładowarką. Jeśli to zrobisz, będziesz miał problemy z cyklem życia aktywności/fragmentu. LoaderManager jest odpowiedzialny za to przy użyciu tych metod

  1. initLoader
  2. restartLoader
  3. destroyLoader

Następnie Loader będzie korzystać z interfejsu LoaderManager.LoaderCallbacks zgłosić żadnych wyników z powrotem do fragmentu/aktywności.

Powiązane problemy