1

我是使用 a 的新手ViewPager,但我的应用程序上的初始屏幕是ListView用户可以添加/删除新项目的,然后单击其中一个项目会将它们带到基于传递的 id 的“详细信息”片段。我希望用户也能够从列表中滑动到每个详细信息。

我有ViewPager工作,除了 id 总是关闭一个。这可能是我ViewPagersonCreateView. 因此,假设 id 为 1、2、3、4,当应用程序加载时,应用程序启动时的 idonCreateView为 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;
    }
}
4

1 回答 1

0

我有 ViewPager 工作,除了 id 总是关闭一个。这可能是我对ViewPagers的理解不够,但是如果我在detailsfragment的onCreateView中放了一个断点,那么这个断点就会在app加载的时候被命中,传递的id就是第一个id。因此,假设 id 为 1、2、3、4,当应用程序加载时,onCreateView 中应用程序启动时的 id 为 1。当我从列表执行初始滑动到第一个详细信息片段时,id 为 2 (当我期望它是 1 时)。

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

您所看到的很可能是由于ViewPager工作方式造成的,这可能会产生误导。首次启动应用程序时,您会看到ListingFragment. 现在,ViewPager为了给用户提供流畅的滑动,还将在当前可见片段的每一侧加载(默认情况下)一个额外的片段(所以当应用程序启动时,ViewPager将加载页面0ListingFragment)和下一个(到对,因为我们没有地方可以去左边))页面,1DetailsFragment带有 id 1)。当您从第一个滑动ListingFragment到第一个DetailsFragment(具有 id 1)时,ViewPager将自动提前创建第二个DetailsFragment(具有 id 2)(再次,以便能够立即滑动到它)。现在,如果你有一个LogonCreateViewDetailsFragment(查看)中的语句,当您从第一个滑动到第一个id时,您看到第二个 id 是正常的,因为它不会从第一个(已创建的 id )出现,它会出现是因为第二个(带有 id )是提前创建的。ListingFragmentDetailsFragmentLogDetailsFragment1DetailsFragment2

另外,修改你的代码,因为你引入了一个微妙的错误。您设置了 NUMBER_OF_PAGES初始化的适配器的大小,ids.size()但随后添加了ListingFragment将使DetailsFragment最后一个 id(from ids) 的适配器根本不出现。

于 2013-01-19T08:27:51.987 回答