重新排序并将片段添加到FragmentStatePagerAdapter而无需清除项目列表

时间:2014-10-14 16:31:10

标签: android android-fragments fragmentpageradapter fragmentstatepageradapter

我在一年多前问了这个问题并得到了一些关于如何实施它的好反馈,但该项目被放弃了。它现在重新浮出水面,我正在重燃这场火灾。

我得到的最接近的答案是:Android ViewPager: Move any page to end programatically?

基本上我正在尝试做的是根据我从Web服务检索的数据重新排序视图片段(并添加新的视图片段)。我发布上面链接的解决方案使用FragmentPagerAdapter,但似乎不能使用FragmentStatePagerAdapter。当我在重建我的数据集后调用notifyDataSetChanged()时,在使用FragmentStatePagerAdapter时,我得到了outofbounds异常,因为我的Array的大小不够大。如果我将所有内容更改为使用FragmentPagerAdapter,我不会得到该异常,但我也没有看到正确排序的片段。

这是我的fragmentstatepageradapter:

public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public int getItemId(int position) {
        //
        return Entries.contestEntries.get(position).entry_id;
    }

    @Override
    public int getItemPosition(Object object) {
        android.support.v4.app.Fragment f = (android.support.v4.app.Fragment)object;
        for(int i = 0; i < getCount(); i++){

            android.support.v4.app.Fragment fragment = getItem(i);
            if(f.equals(fragment)){
                return i;
            }
        }
        return POSITION_NONE;
    }



    @Override
    public android.support.v4.app.Fragment getItem(int position) {

        int entryId = getItemId(position);

        if(Entries.mItems.get(entryId) != null) {
            return Entries.mItems.get(entryId);
        }
        Fragment f = ScreenSlidePageFragment.create(position);
        Entries.mItems.put(entryId, f);
        return f;
    }

    @Override
    public int getCount() {
        return Entries.contestEntries.size();
    }
}

正如您所看到的,我只是在我的活动(条目)上引用静态属性,因为当我尝试将它们推送到适配器的成员时,它根本不起作用。

以下是该活动的相关属性:

public static ViewPager mPager;
public static PagerAdapter mPagerAdapter;
public static HashMap<Integer, android.support.v4.app.Fragment> mItems = new HashMap<Integer, android.support.v4.app.Fragment>();
public static int CurrentEntryId;
public static ArrayList<ContestEntryModel> contestEntries;

当活动收到新订单时,我目前只是在调用notifyDataSetChanged()之前执行mItems.clear()。这工作正常,但我有两个问题:1)它导致屏幕闪存,因为它重建当前片段和2)这是使用更多的资源,我可能需要使用,因为我应该能够只使用片段已经建成了。

我重置contestEntries的方式是从Web服务接收一个JSON字符串,然后将其转换为我的模型,然后将contestEntries ArrayList重置为该新值。

我也尝试在调用notifyDataSetChanged()之前重新排序HashMap,但这不起作用。

我没有问题更改此解决方案以使用FragmentStatePagerAdapter()中的FragmentPagerAdapter(),如果这是使这项工作所需要的,但正如我上面所说,在我昨天做的测试中,它没有使用解决方案重新排序片段张贴在上面。

任何建议都将不胜感激。

TIA

0 个答案:

没有答案