1

我有一个应用程序可以下载数据,这些数据必须显示在viewpager. 我不知道如何在数据下载中ListFragment adaptername.notifyDataSetChanged()调用AsyncTask

例如,假设我正在下载未来 7 天的气温预报:

我的应用程序具有以下结构:

  • MainActivity:开始AsyncTask下载数据onCreate()并让用户选择(button)查看哪一天。单击按钮启动SecondActivity并将日期索引传递给ViewPager(以设置当前视图)。

MainActivity 用户选择

  • SecondActivity:包含一个ViewPager包含 7 个相同ListFragments的(列表显示 5 小时内的温度,因此列表有 5 个条目)。

  • MyListFragment:当这个加载它设置adapter显示每个温度(如果数据已下载),否则它将温度设置为"loading..."

现在我的问题是,如果用户等待MainActivity数据下载,他们可以继续ViewPager查看ListFragment温度,没有问题。但是如果他们尝试点击一天并 ViewPager 在下载完成之前加载片段将永远只是说 "loading..."

我需要一种可以在我的 in 中重新加载ListFragment适配器onPostExecute()AsyncTask方法MainActivity。要做到这一点,虽然我需要能够实际访问正在显示ListFragment的内容。ViewPager如何更新适配器onPostExecute()


主要活动:

protected void onCreate(Bundle savedInstanceState) {
    ...
    new LoadData().execute();
}

protected class LoadData extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... params) {
        //Download happens here
    }
    protected void onPostExecute(String result) {
        //I need to tell the viewpager in SecondActivity to reload the ListFragment it is currently showing here
    }
}

第二活动

private ViewPager mPager;
private PagerAdapter mPagerAdapter;
private int[] temperatureArray;
public void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = getIntent();
    int[] defaultTemps = {0, 0, 0, 0, 0};
    temperatureArray = getIntArrayExtra("temps", defaultTemps);
    mPager = (ViewPager) findViewById(R.id.pagerID);
    mPager.setCurrentItem(intent.getIntExtra("page", 0));
    mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    ...
    public Fragment getItem(int position) {
        MyListFragment lf = new MyListFragment();
        lf.setTemperatures(temperatureArray);
        return lf;
    }
}

当我在 AsyncTask 中完成下载时,我需要一种方法来刷新当前显示的片段。

4

2 回答 2

2

我可以建议做两件事之一,不确定这些是否是最佳实践。

您可以让 AsyncTask 在完成加载信息后发送具有唯一操作的广播。这当然必须从 OnPostExecute 完成:

@Override
protected void onPostExecute(Void result) {     
        super.onPostExecute(result);
        if (result != null) {
            //_Do whatever action you normally do, like storing result to database.
            //fire up the broadcast
            Intent intent = new Intent(Home.ACTION_FEED_LOADING_FINISHED);
            mContext.sendBroadcast(intent);
        }
}

然后通过 Fragment 代码上的 BroadcastReceiver 拦截它。

private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(ACTION_FEED_LOADING_FINISHED)) {
            //The AsyncTask Finished loading data
        }
    }
};

收到事件后,由于 BroadcastReceiver 位于加载视图的 Fragment 中,因此您可以相应地刷新 UI。

或者,

您可以将要刷新的视图作为 AsyncTask 的参数传递。

想象你的 AsyncTask 类是这样的:

private static class getInternetStuffTask extends AsyncTask<String, Void, Void> {

然后您可以创建一个自定义构造函数来接收视图作为参数:

public getInternetStuffTask (final Context context, final ListView list) {
        this.mContext = context;
        this.mListView= list;           
    }

然后,在 onPostExecute 期间,加载数据时,您可以简单地将适配器设置为 ListView,直接形成 AsyncTask。

于 2013-09-02T15:50:42.807 回答
1

你涉及到两个不同的问题。首先,使用服务进行下载。服务用于在 Activity 生命周期之外的长期运行操作(如下载)。

其次,要在活动和片段之间进行通信,您需要使用回调接口。提供的链接指向在解释和提供示例方面做得很好的文档。

于 2013-09-02T15:49:55.887 回答