S.T*_*ane 8 tabs android android-viewpager fragmentstatepageradapter
我正在尝试使用与view pager + tabs
PlayStore 5.1.x 相同的设计.这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_tabs" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的适配器:
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FakeFragment> fragments;
public MainPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragments = new ArrayList<FakeFragment>();
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
if(position < getCount()) {
FakeFragment fragment = FakeFragment.newInstance(position);
fragments.add(fragment);
}
return fragments.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Category.values().length;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return Category.values()[position].getTitle();
}
@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
}
Run Code Online (Sandbox Code Playgroud)
我的标签和寻呼机显示正确!但我注意到视图寻呼机中显示的第一个片段始终与第二个片段相同.然后当我滑动一次,两次并向后滑动到第一页时,我发现现在显示了正确的片段!
我无法理解为什么会出现这种行为,请我解释一下.
解
问题是由于我的FakeFragment.newInstance()
方法定义.
private static int position;
public static FakeFragment newInstance(int position) {
// TODO Auto-generated method stub
FakeFragment.position = position;
return new FakeFragment();
}
Run Code Online (Sandbox Code Playgroud)
我通过使用setArguments(args)
我的FakeFragment
实例更改它,然后在onCreate
方法中检索它.现在一切都很好!
有人可以解释一下为什么吗?
我认为,通过这种方式,位置的价值将依赖于片段的生命周期,因此将始终是预期的位置,对吧?
1)getItemPosition(Object)
如果不处理,请不要执行.您不需要实现它,并且可能通过错误地实现它来破坏其他功能.
2)重点getItem(int)
是返回一个新片段.抛弃片段数组,因为它没有任何意义.
3)创建adpater类static
(它提升了可重用性,适配器不应该依赖于父类来获取它的数据集,对吗?)并将Category
s作为构造函数参数传递.将其存储在变量中,并根据此数据集创建新的片段.您可能还希望将Category[position]
一个参数作为参数传递给片段构造函数而不是仅仅position
.
归档时间: |
|
查看次数: |
5141 次 |
最近记录: |