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等,但我沒有清楚我需要使用什麼,其中的任何一個都可以實現我想要的!

僅供參考我使用的是單聲道Android和兼容性包,以支持V2.3 +,但希望把任何Java示例等

提前非常感謝! 羅賓

回答

0

我不知道這將如何與monodroid工作,但我猜它應該是大致相同的。使用AsyncTaskLoader,因爲它們通過LoaderManager綁定到活動生命週期。你應該讓你的片段實現LoaderCallbacks接口並在那裏調用loaderManager.init(...)(例如,在onActivityCreated)。加載程序任務完成後,您將在onLoadFinished中收到有關數據的通知,您可以將其加載到適配器中並執行進度條和列表視圖轉換。您可以在文檔頁面here或更詳細的here上找到有關如何實現AsyncTaskLoader的示例。至於過渡,請使用類似this這給你的應用程序提供一些波蘭語。