1

Я довольно новый для Android, и я нахожу, что это трудно понять, правильный/лучший способ выполнить следующие действия:Правильный подход к асинхронному ListFragment

Я использую ActionBarSherlock иметь набор вкладок что каждая загрузка фрагмента. Одним из них является ListFragment (на самом деле SherlockListFragment). Я начал с простого использования нового потока, чтобы загрузить список, и все казалось прекрасным, пока вы не переключитесь на другую вкладку перед загрузкой списка. Тогда он не работает в SetListShown (true), потому что я думаю, что фрагмент неактивен.

public override void OnActivityCreated(Bundle savedInstanceState) 
{ 
    base.OnActivityCreated(savedInstanceState); 

    SetListShown(false); 

    var listView = (ListView) Activity.FindViewById(Android.Resource.Id.List); 

    Button loadMore = new Button(Activity); 
    loadMore.SetText("Load more articles", TextView.BufferType.Normal); 
    loadMore.Click += LoadMoreArticles; 
    listView.AddFooterView(loadMore); 

    ThreadPool.QueueUserWorkItem((obj) => { 

     var articles = _articleService.GetArticles(0, 10, DateTime.UtcNow); 
     _items = articles.Select(x => new ArticleSummaryModel(x)).ToList(); 

     Activity.RunOnUiThread(() => { 

      _adapter = new ArticleList_Adapter(Activity, _items); 
      ListAdapter = _adapter; 

      SetListShown(true); 
     }); 
    }); 
} 

То, что я хотел бы случиться, что, когда вкладка открыта в первый раз он начинает загрузку данных, показывая стандартный индикатор прогресса, то тогда он завершает список отображается и индикатор прогресса удален , Если вкладка изменяется во время загрузки данных, она должна быть видна, когда эта вкладка снова открывается.

Если есть простой способ достичь этого, что я пропустил, отлично! Это просто невозможно с Android, я бы тоже хотел это узнать, поэтому я могу перестать пытаться ;-)

Я много читал о AsyncTask, AsyncTaskLoader, IntentService и т. Д., Но я совсем не знаю ясно, что мне нужно использовать, и любой из них действительно достигнет того, чего я хочу!

FYI Я использую моно для андроид и совместимости пакета для поддержки v2.3 +, но можем надеяться перевести любые Java примеры и т.д.

Большое спасибо заранее! Robin

ответ

0

Я не уверен, как это будет работать с monodroid, но я предполагаю, что он должен быть примерно таким же. Используйте AsyncTaskLoader, поскольку они привязаны к жизненному циклу активности через LoaderManager. Вам необходимо, чтобы ваши фрагменты реализовали интерфейс LoaderCallbacks и вызывали loaderManager.init(...) где-то там (например, в onActivityCreated). Когда задача загрузчика будет завершена, вы получите уведомление в onLoadFinished с данными, и там вы можете загрузить его в адаптер, а также перейти к переходу progressbar и listview. Вы можете найти примеры того, как реализовать AsyncTaskLoader на странице документации here или немного подробнее here. Что касается перехода, используйте что-то вроде this, которое дает немного пользы вашему приложению.