动态生成ViewPager的片段

时间:2013-01-19 03:27:20

标签: android android-fragments android-viewpager

我不熟悉使用ViewPager,但我的应用中的初始屏幕是ListView,用户可以添加/删除新项目,然后点击其中一个项目将其带到基于传递的id的“详细信息”片段。我希望用户也可以从列表中滑动到每个细节。

我有ViewPager工作,除了id总是一个人关闭。这可能是我对ViewPagers的理解不足,但是如果我在详细信息片段的onCreateView中放置一个断点,那么当应用加载并且传递的id是第一个id时,会触发断点。所以,比如ids是1,2,3,4,当应用加载时,onCreateView中应用启动时的ID是1.当我从列表执行初始滑动到第一个细节片段时, id为2(当我希望它为1时)。

这是我到目前为止所做的:

Main.class(应用启动时的初始活动)

public class Main extends SherlockFragmentActivity
{
    private static int NUMBER_OF_PAGES;  
    private ViewPager mViewPager;  
    private MyFragmentPagerAdapter mMyFragmentPagerAdapter; 
    private static List<Fragment> fragments;

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.main);

        mViewPager = (ViewPager)findViewById(R.id.viewpager);  
        mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());  
        mViewPager.setAdapter(mMyFragmentPagerAdapter);

        final List<Integer> ids = GetIds(); //loads ids to popular the viewpager

        NUMBER_OF_PAGES = ids.size();

        fragments = new ArrayList<Fragment>();

        fragments.add(new ListingFragment()); //initial screen

        for(Integer id : ids)
            fragments.add(DetailsFragment.newInstance(id));
    }

    private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter  {            

        public MyFragmentPagerAdapter(FragmentManager fm) {  
             super(fm);  
        }

        @Override  
        public Fragment getItem(int index) {

            return fragments.get(index);
        }

        @Override  
        public int getCount() {  

             return NUMBER_OF_PAGES;  
        }
   }
}

DetailsFragment.class

public class DetailsFragment extends SherlockFragmentActivity
{
    private int detailId;
    private List<Integer> items;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);         
    }

    @Override
    public void onActivityCreated(final Bundle icicle)
    {    
        super.onActivityCreated(icicle);
    }

    public static DetailsFragment newInstance(int id) {

        DetailsFragment lf = new DetailsFragment();
        Bundle bundle = new Bundle();
        bundle.putInt("id", id);
        lf.setArguments(bundle);
        return lf;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.details, container, false);

        detailId = getArguments().getInt("id"); //this id is always off

        items = GetItems();

        return view;
    }
}

1 个答案:

答案 0 :(得分:0)

  

我让ViewPager工作,除了id总是一个一个。   这可能是我对ViewPagers缺乏了解,但如果我放了一个   onCreateView中断点的详细信息片段,断点   应用程序加载时被点击,传递的ID是第一个ID。   所以,当应用程序加载时,ids是1,2,3,4,app上的id   onCreateView中的启动是1.当我执行初始滑动时   列出第一个细节片段,id是2(当我愿意   期待它是1)。

也许我不明白你所遇到的问题,但是你发布的代码(再次,如果这是你使用的完整代码(目前它不会编译为DetailsFragments扩展SherlockFragmentActivity (?!)))不能做你说的。设置片段的方式将使它们具有适当的ID。

你所看到的最有可能是由于ViewPager的工作方式,这可能会产生误导。首次启动应用时,您会看到ListingFragment。现在,ViewPager,为了为用户提供平滑的滑动,还会在当前可见片段的每一侧加载(默认情况下)一个额外的片段(因此,当应用启动ViewPager时加载页面0ListingFragment)和下一个(右侧,因为我们没有任何地方可以左转))页面1DetailsFragment的ID 1)。当您从ListingFragment滑动到第一个DetailsFragment(标识为1)时,ViewPager会自动创建第二个DetailsFragment(其ID为{提前2)(再次,为了能够立即滑动它)。现在,如果您在Log的{​​{1}}中有onCreateView声明(要查看DetailsFragment),那么当您从{滑动id时看到第二个ID是正常的。 {1}}到第一个ListingFragment,因为DetailsFragment不会显示在创建的第一个Log(已创建的身份DetailsFragment)中,它会出现因为第二个1(标识为DetailsFragment)是事先创建的。

另外,修改你的代码,因为你引入了一个微妙的bug。您将适配器的大小设置为 使用2初始化的NUMBER_OF_PAGES,但随后添加ids.size(),这将使ListingFragment的最后一个ID(来自DetailsFragment)根本不显示。