AndroidViewPager无限滑动

对于ViewPager的无限滑动,这个用到最多的地方就是banner的滚动这个地方了,今天闲来无事,进行了重构分享出来大家学习一下



核心方法就是依据ViewPager的滑动动画,在滑动到边缘的时候跳回第一条,在跳转到第一条的时候不适用动画,核心代码如下


private void infiniteCarousel() {
if (viewPager == null) {
return;
}
currenItem = viewPager.getCurrentItem();
count = viewPager.getAdapter().getCount();
if (count <= 3 * 2) {
return;
}
if (left == -1 || right == -1 || left > right || right + 1 > count || left - 1 < 0) {
left = (count / 3) - 1;
right = (count / 3) * 2;
}
if (right == currenItem) {
viewPager.setCurrentItem(left + 1, false);
}
if (left == currenItem) {
viewPager.setCurrentItem(right - 1, false);
}
if (currenItem >= 0 && currenItem < left) {
viewPager.setCurrentItem(left + currenItem + 1, false);
}
if (currenItem > right) {
viewPager.setCurrentItem(currenItem - left - 1, false);
}
}








具体的代码如下:

首先定义适配器的父类

/**
 * 
 */
package com.adapter;


import java.util.ArrayList;
import java.util.List;


import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;


/**
 * @date 2016年11月29日
 */
public abstract class PageFragmentAdapter<T> extends FragmentPagerAdapter {
private List<AdapterFragment<T>> listFragments;
private List<T> datas;
private boolean isRotation = false;
private RotationHelper rotationHelper;


/**
* 设置无限滚动

* @param isRotation
*            the isRotation to set
*/
public void setRotation(ViewPager viewPager) {
this.isRotation = true;
rotationHelper = new RotationHelper(viewPager);
checkRotation();
}


/**
* 掉用该方法传入时间间隔time将进行自动轮播

* @param time
*            void
*/
public void setTimerRotation(long time) {
if (rotationHelper != null) {
rotationHelper.setTimerRotation(time);
}
}


/**
* 设置指示器选择回调

* @param indictorSelectInterface
*            void
*/
public void setIndictorSelect(IndictorSelectInterface indictorSelectInterface) {
if (rotationHelper != null) {
rotationHelper.setIndictorSelectInterface(indictorSelectInterface);
}
}


/**
* @param fm
*/
public PageFragmentAdapter(FragmentManager fm, List<T> datas) {
super(fm);
this.datas = datas;
listFragments = new ArrayList<AdapterFragment<T>>();
checkRotation();
}


/**
* 更新适配器数据

* @param datas
*            void
*/
public void refreshData(List<T> datas) {
this.datas = datas;
checkRotation();
}


/**
* @param datas
*            void
*/
private void checkRotation() {
listFragments.removeAll(listFragments);
int size = datas.size() * (isRotation ? 3 : 1);
for (int i = 0; i < size; i++) {
listFragments.add(getAdapterFragment(i));
}
}


public abstract AdapterFragment<T> getAdapterFragment(int index);


@Override
public Fragment getItem(int position) {

 


AdapterFragment<T> tAdapterFragment = listFragments.get(position);
tAdapterFragment.refreshData(datas.get(position % datas.size()));
return tAdapterFragment;
}


@Override
public int getCount() {
return listFragments.size();
}


@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}



定义一个自己的Fragment集成系统的Fragment

/**
 * 
 */
package com.adapter;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


/**
 * @date 2016年11月29日
 */
public abstract class AdapterFragment<T> extends Fragment {
private T t;


public void refreshData(T t) {
this.t = t;
}


/**
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
refreshUI(t);
}
}


public abstract void refreshUI(T t);


private View mRootView;
private String frgName;


public AdapterFragment(String frgName) {
this.frgName = frgName;
}


/**
* @return the frgName
*/
public String getFrgName() {
return frgName;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
String FRAGMENTS_TAG = "Android:support:fragments";
savedInstanceState.remove(FRAGMENTS_TAG);
}
mRootView = inflater.inflate(getLayout(), container, false);
initView();
if (getUserVisibleHint())
refreshUI(t);
return mRootView;
}


public View getmRootView() {
return mRootView;
}


/**
* 初始化Fragment的Layout

* @return
*/
protected abstract int getLayout();


/**
* 初始化View
*/
protected abstract void initView();


/**
* 通过ID获取相应的View

* @param id
* @return
*/
protected View findViewById(int id) {
if (mRootView == null) {
return null;
}
return mRootView.findViewById(id);
}
}


最后就是自己的核心无限滚动类了

/**
 * 
 */
package com.adapter;


import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;


/**
 * @date 2016年11月29日
 */
public class RotationHelper implements OnPageChangeListener, Callback, OnTouchListener {
private int currenItem = 0;
private int count = 0;
private int left = -1, right = -1;
private ViewPager viewPager;
private Handler handler;
private PagerAdapter pagerAdapter;
private IndictorSelectInterface indictorSelectInterface;
private final static int ROTATION_FLAG = 10;
private final static int OBSCURED = 11;
private long delayMillis;
private int mSelectPostion = 0;
private boolean isUserOperating = false;


@SuppressWarnings("deprecation")
public RotationHelper(ViewPager viewPager) {
this.viewPager = viewPager;
this.viewPager.setOnPageChangeListener(this);
handler = new Handler(viewPager.getContext().getMainLooper(), this);
pagerAdapter = viewPager.getAdapter();
viewPager.setOnTouchListener(this);
}


/**
* 掉用该方法传入时间间隔time将进行自动轮播

* @param time
*            void
*/
public void setTimerRotation(long time) {
if (!viewPager.isFocusable()) {
handler.sendEmptyMessageDelayed(OBSCURED, 500);
return;
}
delayMillis = time;
handler.sendEmptyMessageDelayed(ROTATION_FLAG, delayMillis);
}


/**
* 设置指示器选择
* @param indictorSelectInterface
*            the indictorSelectInterface to set
*/
public void setIndictorSelectInterface(IndictorSelectInterface indictorSelectInterface) {
this.indictorSelectInterface = indictorSelectInterface;
}


private void infiniteCarousel() {
if (viewPager == null) {
return;
}
currenItem = viewPager.getCurrentItem();
count = viewPager.getAdapter().getCount();
if (count <= 3 * 2) {
return;
}
if (left == -1 || right == -1 || left > right || right + 1 > count || left - 1 < 0) {
left = (count / 3) - 1;
right = (count / 3) * 2;
}
if (right == currenItem) {
viewPager.setCurrentItem(left + 1, false);
}
if (left == currenItem) {
viewPager.setCurrentItem(right - 1, false);
}
if (currenItem >= 0 && currenItem < left) {
viewPager.setCurrentItem(left + currenItem + 1, false);
}
if (currenItem > right) {
viewPager.setCurrentItem(currenItem - left - 1, false);
}
}


/**
* @param arg0
*/
@Override
public void onPageScrollStateChanged(int arg0) {


}


/**
* @param arg0
* @param arg1
* @param arg2
*/
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
if (arg1 == 0)
infiniteCarousel();
}


/**
* @param arg0
*/
@Override
public void onPageSelected(int arg0) {
mSelectPostion = arg0;
if (!checkPagerAdapter()) {
return;
}
if (indictorSelectInterface != null) {
indictorSelectInterface.selectPosition(arg0 % (pagerAdapter.getCount() / 3));
}
}


private boolean checkPagerAdapter() {
if (pagerAdapter == null) {
pagerAdapter = viewPager.getAdapter();
}
if (pagerAdapter == null) {
return false;
}
return true;
}


@Override
public boolean handleMessage(Message msg) {// time定时器调用,进行轮播
if (msg.what == ROTATION_FLAG) {
setTimerRotation(delayMillis);
} else if (msg.what == OBSCURED) {
setTimerRotation(delayMillis);
return false;
}
if (!checkPagerAdapter()) {
return false;
}
if (isUserOperating) {
isUserOperating = false;
return false;
}
mSelectPostion++;
if (mSelectPostion >= pagerAdapter.getCount()) {
mSelectPostion = pagerAdapter.getCount() / 2;
}
if ((viewPager.getCurrentItem() - mSelectPostion) * (viewPager.getCurrentItem() - mSelectPostion) != 1) {
viewPager.setCurrentItem(mSelectPostion, false);
} else {
viewPager.setCurrentItem(mSelectPostion);
}
return false;
}


@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {// 记录用户点击ViewPager的事件
isUserOperating = true;
return false;
}
}


适用方法很简单,在Activity的onCreate方法里面这样设置适配器

List<String> list = new ArrayList<String>();
list.add("sssssssss===>0");
list.add("sssssssss===>1");
list.add("sssssssss===>2");
list.add("sssssssss===>3");
list.add("sssssssss===>4");
list.add("sssssssss===>5");
list.add("sssssssss===>6");
list.add("sssssssss===>7");
list.add("sssssssss===>8");
list.add("sssssssss===>9");
MyPagerFrgAdapter myPagerFrgAdapter = new MyPagerFrgAdapter(getSupportFragmentManager(), list);
myPagerFrgAdapter.setRotation(viewPager);
myPagerFrgAdapter.setTimerRotation(3000);
myPagerFrgAdapter.setIndictorSelect(this);
viewPager.setAdapter(myPagerFrgAdapter);

其中的MyPagerFrgAdapter 为集成与PageFragmentAdapter<String>的子类

/**
 * 
 */
package com.adapter.iml;

import java.util.List;
import com.adapter.AdapterFragment;
import com.adapter.PageFragmentAdapter;
import android.support.v4.app.FragmentManager;
/**
 * @date 2016年11月29日
 */
public class MyPagerFrgAdapter extends PageFragmentAdapter<String>{
/**
* @param fm
* @param datas
*/
public MyPagerFrgAdapter(FragmentManager fm, List<String> datas) {
super(fm, datas);
}
/** 
* @param index
* @return
*/
@Override
public AdapterFragment<String> getAdapterFragment(int index) {
return new MyAdapterFrg("frg" + index);
}
}

MyAdapterFrg代码为:

/**
 * 
 */
package com.adapter.iml;


import com.adapter.AdapterFragment;
import com.example.testdb.R;


import android.widget.TextView;


/**
 * @date 2016年11月29日
 */
public class MyAdapterFrg extends AdapterFragment<String> {
public MyAdapterFrg(String frgName) {
super(frgName);
}


private TextView textView;


/**
* @param t
*/
@Override
public void refreshUI(String t) {
if (textView != null)
textView.setText("==>" + t);
}


/**
* @return
*/
@Override
protected int getLayout() {
return R.layout.frg_vp_layout;
}


/** 

*/
@Override
protected void initView() {
textView = (TextView) findViewById(R.id.textView);
textView.setText(getFrgName());
}
}

这样就能实现自动无限轮播了,希望提出建议进行改进

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值