正确的异步ListFragment方法

时间:2013-02-21 10:14:12

标签: android android-asynctask android-fragments xamarin.android android-loader

我对Android很陌生,我发现很难找到完成以下内容的正确/最佳方法:

我正在使用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等的内容,但我并不清楚我需要使用什么,而且这些实际上都可以达到我的目的!

仅供参考我使用mono for android和兼容包来支持v2.3 +,但可以希望翻译任何java示例等。

非常感谢提前! 罗宾

1 个答案:

答案 0 :(得分:0)

我不确定这对monodroid有什么用处,但我猜它应该差不多。使用AsyncTaskLoader,因为它们通过LoaderManager与活动生命周期相关联。您应该让您的片段实现LoaderCallbacks接口并在其中的某处调用loaderManager.init(...)(例如,在onActivityCreated中)。当加载程序任务完成后,您将在onLoadFinished中通知数据,然后您可以将其加载到适配器中并执行进度条和列表视图转换。您可以在文档页面here上找到有关如何实现AsyncTaskLoader的示例,或者更详细地了解here。至于转换,请使用类似this的内容,以便为您的应用提供一些润色。