2016-09-17 5 views
5

в изменении предпочтений слушателя я установить его для загрузки новых данных с помощью Loader, а затем заполнить ListView, но только функцию onCreateLoader() вызывается при изменении предпочтений, функция onLoadFinished() обратного вызова остается невостребованной, следовательно, мой ListView не обновлен новыми данными, у меня также есть кнопка обновления, которая делает то же самое, то есть загружает данные и заполняет список новыми данными, но здесь onLoadFinished() называется, следовательно, обновляя список.погрузчик onLoadFinished() не вызывается

Кнопка Обновить код

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; 

Код SharedPreference Слушатель:

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

погрузчик Реализация

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; 
} 
} 

погрузчик:

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

В функции makelist класса Getlist новые данные загружаются и сохраняются в таблице. Я могу подтвердить это, но его просто прекратить там вызов onLoadFinished dosnt и функцию maklst, которая обновляет список новыми данными, никогда не вызывается, но когда я вызываю тот же загрузчик из обновления, на который называется onLoadFinished –

ответ

0

Вы не используете и не используете Loader. Однако это трудно сделать.

Из приведенного выше кода я вижу, что вы используете метод forceload(), но вы его не внедрили в свой Loader. Если вы проверите исходный код для Loaders, этот метод просто вызывает событие onForceload(), которое ничего не делает. Согласно документации «Подклассы должны осуществить это, чтобы заботиться о запросах к forceLoad(). Это всегда будет вызываться из главного потока процесса. »

Вы должны прочитать this учебник и начать оттуда.

Общая концепция заключается в том, что после того, как вы закончите свою реализацию AsyncTaskLoader, ваши фрагменты/действия не свяжутся непосредственно с вашим погрузчиком. Если вы это сделаете, у вас возникнут проблемы с жизненным циклом активности/фрагмента. LoaderManager отвечает за что, используя эти методы

  1. initLoader
  2. restartLoader
  3. destroyLoader

После этого Loader будет использовать интерфейс LoaderManager.LoaderCallbacks сообщить о результатах обратно к фрагменту/активности.

Смежные вопросы