我不熟悉使用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;
}
}
答案 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
时加载页面0
(ListingFragment
)和下一个(右侧,因为我们没有任何地方可以左转))页面1
(DetailsFragment
的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
)根本不显示。