Android 如何创建圆形viewpager?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11465815/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to create circular viewpager?
提问by Venkat
Possible Duplicate:
ViewPager as a circular queue / wrapping
可能的重复:
ViewPager 作为循环队列/包装
I have three fragment classes in my code. FirstActivity,SecondActivity,ThirdActivity i want to swipe these three activities.. these three are extend from Fragment class
我的代码中有三个片段类。FirstActivity,SecondActivity,ThirdActivity 我想刷这三个活动..这三个是从 Fragment 类扩展的
public class ViewPagerFragmentActivity extends FragmentActivity {
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
super.setContentView(R.layout.viewpager_layout);
initialisePaging();
}
/**
* Initialize the fragments to be paged
*/
List<Fragment> fragments = new Vector<Fragment>();
ViewPager pager;
private void initialisePaging() {
fragments.add(Fragment.instantiate(this, FirstActivity.class.getName()));
fragments.add(Fragment.instantiate(this, SecondActivity.class.getName()));
fragments.add(Fragment.instantiate(this, ThirdActivity.class.getName()));
this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
pager = (ViewPager) super.findViewById(R.id.viewpager);
pager.setAdapter(this.mPagerAdapter);
}
}
}
and here is my FragmentPageAdapter class
这是我的 FragmentPageAdapter 类
public class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
System.out.println("position"+position);
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
}
my code is working in this way A<->B<->c
but my requirement is to run like this wayC<->A<->B<->C<-A->
that is in circular fragments are swipable...
我的代码正在以这种方式工作, A<->B<->c
但我的要求是像这样运行C<->A<->B<->C<-A->
,圆形片段是可滑动的...
回答by Zombie
Circular ViewPager is possible. With the help of ViewPager as a circular queue / wrappingthis link have coded like this. Hope it helps what you needed.
圆形 ViewPager 是可能的。借助ViewPager 作为循环队列/包装此链接已编码为这样。希望它能帮助你所需要的。
The CircluarPagerAdapter class:
CircluarPagerAdapter 类:
>
>
public class CircularPagerAdapter extends PagerAdapter{
private int[] pageIDsArray;
private int count;
public CircularPagerAdapter(final ViewPager pager, int... pageIDs) {
super();
int actualNoOfIDs = pageIDs.length;
count = actualNoOfIDs + 2;
pageIDsArray = new int[count];
for (int i = 0; i < actualNoOfIDs; i++) {
pageIDsArray[i + 1] = pageIDs[i];
}
pageIDsArray[0] = pageIDs[actualNoOfIDs - 1];
pageIDsArray[count - 1] = pageIDs[0];
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int position) {
int pageCount = getCount();
if (position == 0){
pager.setCurrentItem(pageCount-2,false);
} else if (position == pageCount-1){
pager.setCurrentItem(1,false);
}
}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
});
}
public int getCount() {
return count;
}
public Object instantiateItem(View container, int position) {
LayoutInflater inflater = (LayoutInflater) container.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int pageId = pageIDsArray[position];
View view = inflater.inflate(pageId, null);
((ViewPager) container).addView(view, 0);
return view;
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
@Override
public void finishUpdate(View container) {
// TODO Auto-generated method stub
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((View) object);
}
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
// TODO Auto-generated method stub
}
@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
return null;
}
@Override
public void startUpdate(View container) {
// TODO Auto-generated method stub
}
}
and this is your main class:
这是你的主要课程:
>
>
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager myPager = (ViewPager) findViewById(R.id.conpageslider);
PagerAdapter adapter = new CircularPagerAdapter(myPager, new int[]{R.layout.first_activity, R.layout.second_activity, R.layout.third_activity});
myPager.setAdapter(adapter);
myPager.setCurrentItem(3);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
回答by Furzel
You can try something like this :
你可以尝试这样的事情:
1) Make getCount()
return a huge value ( a number of swipe way higher than what your user might use )
1)getCount()
返回一个巨大的价值(比你的用户可能使用的更多的滑动方式)
2) Make getItem
return something like this.fragments.get(position % fragments.size())
2)getItem
返回这样的东西。fragments.get(position % fragments.size())
3) Make your pager start somewhere in the middle of the range defined by getCount()
( To allow swiping from A to C at the beginning ), make sure to choose a value which will give you the first fragment % 3
3) 让你的寻呼机在由getCount()
( 允许在开始时从 A 滑动到 C )定义的范围中间的某个地方开始,确保选择一个值,它会给你第一个片段 % 3
I'm aware this solution seems a bit dirty but I cant find a better one at the moment
我知道这个解决方案看起来有点脏,但我目前找不到更好的解决方案