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这给你的应用程序提供一些波兰语。