1

我对 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 示例等。

提前谢谢了!罗宾

4

1 回答 1

0

我不确定这将如何与 monodroid 一起使用,但我猜它应该大致相同。使用 AsyncTaskLoader,因为它们通过 LoaderManager 与活动生命周期相关联。您应该让您的片段实现 LoaderCallbacks 接口并loaderManager.init(...)在其中的某处调用(例如, in onActivityCreated)。加载器任务完成后,您将收到onLoadFinished数据通知,您可以在那里将其加载到适配器中并进行进度条和列表视图转换。您可以在此处的文档页面上找到有关如何实现 AsyncTaskLoader 的示例,或者在此处获得更多详细信息。至于过渡,请使用类似这样的东西,它可以为您的应用程序提供一些润色。

于 2013-02-22T17:16:36.797 回答