方法有两种
- 第一种
1.在数据首尾添加数据
private void initData() {
mList = new ArrayList<>();
mList.add(new MyData(5));
for (int i = 0; i < 5; i++) {
MyData myData = new MyData();
myData.setIndex(i+1);
mList.add(myData);
}
mList.add(new MyData(1));
}
- 当滑动话第一个item,就setCurrentItem为倒数第二个。
- 当滑动到最后一个事,就设置 setCurrentItem为第二个。
@Override
public void onPageScrollStateChanged(int state) {
if(state == ViewPager.SCROLL_STATE_SETTLING){
//结束
Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_SETTLING ");
}else if(state == ViewPager.SCROLL_STATE_DRAGGING){
//滑动中
Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_DRAGGING" );
}else if(state == ViewPager.SCROLL_STATE_IDLE){
//静止状态
Log.e(TAG, "onPageScrollStateChanged: state = ViewPager.SCROLL_STATE_IDLE" );
//有的博文会监听positionOffset = 0,测试发现这里监听最稳定
if(mViewPager.getCurrentItem() == 0){
mViewPager.setCurrentItem(mList.size() - 2,false);
}else if(mViewPager.getCurrentItem() == mList.size() -1){
mViewPager.setCurrentItem(1,false);
}
}
}
缺点:不适用于一屏显示多个item 并且有缩放、渐变等动画的item。
- 第二种
1.设置adapter getCount()返回Integer.MAX_VALUE
2.getItem设置对应的View或数据
package com.noah.testviewpager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import java.util.List;
public class MyMaxPageAdapter extends FragmentStatePagerAdapter {
private List<MyData> mList;
public MyMaxPageAdapter(FragmentManager fm , List<MyData> mList) {
super(fm);
this.mList = mList;
}
@Override
public Fragment getItem(int i) {
return MyFragment.getInstance(mList.get(i % mList.size()));
}
@Override
public int getCount() {
return mList != null && mList.size() > 0 ? Integer.MAX_VALUE : 0;
}
}
直接设置adapter
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
mViewPager = findViewById(R.id.viewpager);
MyMaxPageAdapter myMaxPageAdapter = new MyMaxPageAdapter(getSupportFragmentManager(),mList);
mViewPager.setAdapter(myMaxPageAdapter);
mViewPager.setCurrentItem(mList != null ? mList.size() * 50 : 0,false);
}
优点:这个再有动画的时候,无限循环也可以正常显示。
网友评论