在ViewPager中动态更改片段内容

时间:2015-05-08 16:28:43

标签: android android-fragments android-asynctask android-viewpager

我有:

  • ViewPager开启FragmentPagerAdapter(或FragmentStatePagerAdapter,并不能解决我的问题。)
  • 固定数量的碎片。它们都共享相同的布局,但需要以不同的方式设置TextView;
  • 查询我的数据库并检索要设置到TextView中的内容的AsyncTask

所以我的代码是:

public class StatsPagerAdapter extends FragmentPagerAdapter {
    static final int FRAGMENT_COUNT = 5;
    private Parameters[] sectionData;

    public StatsPagerAdapter(FragmentManager manager) {
        super(manager);
        this.sectionData = new Parameters[FRAGMENT_COUNT];
    }

    @Override
    public Fragment getItem(int position) {
        return StatsSectionFragment.getInstance(this.sectionData[position]);
    }

    @Override
    public int getCount() {
        return FRAGMENT_COUNT;
    }

    public void setSectionData(int position, Parameters sectionData) {
        this.sectionData[position] = sectionData;
        notifyDataSetChanged();
    }
}

所以我将sectionData[position]传递给我的通用子片段的getInstance()方法。该数据应区分加载到ViewPager的片段的每个实例。

首先,我将传递一个空引用,但随后在我的异步类中传递:

    @Override
    protected void onProgressUpdate(Parameters... sectionValues) {
        super.onProgressUpdate(sectionValues);
        mPagerAdapter.setSectionData(sectionId, sectionValues[0]);
    }

这应该调用上面的setSectionData(),更新sectionData[position]并生成对notifiyDataSetChanged()的调用。我希望这样做会使适配器再次检索所有项目,从而再次调用getItem(),并加载新的片段。

可悲的是,它没有。所以现在:

  • 如果在我的异步任务结果发布之前创建了片段(即getItem()),那么该项将保持为空(即可见片段,但由于我从未调用{{1 }}。 片段0&&amp ;;片段1。

  • 如果在我的异步任务结束后创建了片段(片段2到结束,因为只有当你通过滑动到达那个片段时才调用getInstance(non-null stuff)),那么第一次也是唯一一次调用{{1产生一个getItem(),没关系。

如何将内容重新加载到已存在的片段中,或强制适配器调用getItem()并更新其视图?

1 个答案:

答案 0 :(得分:1)

将此添加到您的适配器:

@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

当您拨打getItem

时,这会让您的适配器再次呼叫notifyDataSetChanged();