Android ViewPager真正的实现无限循环滚动
在存放View的集合中的第一个位置放入真正的最后一个View,而在最后一个放入第一个。具体请参照下图以及代码!
package com.xinye.ui;
import java.util.ArrayList;
import java.util.HashMap;
import net.tsz.afinal.FinalBitmap;
import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.http.AjaxCallBack;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.graphics.Color;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;
import android.widget.Toast;
import com.xinye.R;
import com.xinye.domain.Bargain;
import com.xinye.domain.Screen;
import com.xinye.domain.ViewFrame;
import com.xinye.util.ApplicationUtils;
import com.xinye.util.ConstantsUtils;
import com.xinye.util.FileUtils;
import com.xinye.util.ImagePathUtils;
import com.xinye.util.LogUtils;
import com.xinye.util.StringUtils;
import com.xinye.view.SlidingView;
/**
* Fragment
*
*
*
*/
public class BannerFragment extends BaseFragment implements OnPageChangeListener {
// 当前Fragment的RootView
private View mRootView = null;
// 当前Fragment中的ViewPager
private ViewPager mViewPager = null;
// 展示当前页面标识的TextView
private TextView mTextView = null;
// 布局填充器对象
private LayoutInflater mLayoutInflater = null;
// 保存Bargain信息的ArrayList
private ArrayList<Bargain> mBargainList = new ArrayList<Bargain>();
// 保存所有的ViewPager的View
private ArrayList<ImageView> mViewList = new ArrayList<ImageView>();
// Bitmap载入工具类
private FinalBitmap mFinalBitmap;
// 切换到左边的ImageView
private ImageView mToLeftImageView = null;
// 切换到右侧的ImageView
private ImageView mToRightImageView = null;
// 图片URL列表
private static ArrayList<String> mImageUrlList = new ArrayList<String>();
@Override
protected void initContent() {
mFinalBitmap = FinalBitmap.create(mActivity, FileUtils.getCacheDirectory(mActivity));
mTopbarTextView.setText(R.string.popup_banner);
mPopupBannerTextView.setTextColor(Color.argb(0xff, 0xa1, 0x01, 0x01));
mTopbarLeftImageView.setImageResource(R.drawable.topbar_banner);
mLayoutInflater = mActivity.getLayoutInflater();
mRootView = mLayoutInflater.inflate(R.layout.fragment_banner, null);
mbaseLinearLayout.addView(mRootView);
mViewPager = (ViewPager) mRootView.findViewById(R.id.bannerFragmentViewPager);
mTextView = (TextView) mRootView.findViewById(R.id.countBannerFragmentTextView);
mToLeftImageView = (ImageView) mRootView.findViewById(R.id.toLeftBannerFragmentImageView);
mToLeftImageView.setOnClickListener(BannerFragment.this);
mToRightImageView = (ImageView) mRootView.findViewById(R.id.toRightBannerFragmentImageView);
mToRightImageView.setOnClickListener(BannerFragment.this);
try {
if(mImageUrlList != null && mImageUrlList.size() > 0){
initViewPager();
}else{
initData();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 初始化数据
private void initData() throws Exception {
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("loginUserId", UserLoginActivity.userID);
data.put("checkStr", UserLoginActivity.token);
data.put("isMember", UserLoginActivity.isMember);
String url = StringUtils.composeUrl(ConstantsUtils.BANNER_LIST_URL, data);
LogUtils.printLog(Log.INFO, LogUtils.LOG_TAG, "BannerFragment initData url = " + url);
new FinalHttp().get(url, new AjaxCallBack<String>() {
@Override
public void onSuccess(String t) {
LogUtils.printLog(Log.INFO, LogUtils.LOG_TAG, "banner list JSON:" + t);
parseJSON(t);
super.onSuccess(t);
}
@Override
public void onFailure(Throwable t, String strMsg) {
if(t != null){
mImageUrlList = FileUtils.readListFromFile(mActivity, FileUtils.LIST_BANNER_FILE_NAME);
if(mImageUrlList != null){
initViewPager();
}
}
super.onFailure(t, strMsg);
}
});
}
// 解析JSON
private void parseJSON(String t) {
if (t == null) {
return;
}
try {
JSONObject tObj = new JSONObject(t);
int status = tObj.getInt("status");
// String message = tObj.getString("message");
if (status == 0) {
String dataString = tObj.getString("data");
if (dataString != null && !dataString.equalsIgnoreCase("null")) {
JSONObject dataObj = new JSONObject(dataString);
String partnerBargainFormListString = dataObj.getString("partnerBargainFormList");
if (partnerBargainFormListString != null && !partnerBargainFormListString.equalsIgnoreCase("null")) {
JSONArray array = new JSONArray(partnerBargainFormListString);
Screen screen = ApplicationUtils.getScreen(mActivity);
if (array != null) {
int len = array.length();
for (int i = 0; i < len; i++) {
JSONObject obj = array.getJSONObject(i);
String bargainString = obj.getString("partnerBargain");
Bargain bargain = new Bargain();
if (bargainString != null && !bargainString.equalsIgnoreCase("null")) {
JSONObject bargainObj = new JSONObject(bargainString);
bargain.partnerCategoryId = bargainObj.getLong("partnerCategoryId");
bargain.partnerId = bargainObj.getLong("partnerId");
bargain.pictureId = bargainObj.getLong("pictureId");
bargain.title = bargainObj.getString("title");
bargain.displayOrder = bargainObj.getLong("displayOrder");
bargain.dailySpecialsId = bargainObj.getLong("dailySpecialsId");
bargain.bargainId = bargainObj.getLong("bargainId");
}
String pic = obj.getString("pic");
pic = ImagePathUtils.getBannerRealPath(pic,screen);
bargain.pic = pic;
mBargainList.add(bargain);
mImageUrlList.add(bargain.pic);
}
FileUtils.writeListToFile(mActivity, FileUtils.LIST_BANNER_FILE_NAME, mImageUrlList);
initViewPager();
}
} else {
return;
}
} else {
return;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
// 初始化ViewPager
private void initViewPager() {
if(!(mImageUrlList != null && mImageUrlList.size() > 0)){
return;
}
int length = mImageUrlList.size() + 2;
for (int i = 0; i < length; i++) {
ImageView mViewPagerImageView = new ImageView(mActivity);
ViewGroup.LayoutParams viewPagerImageViewParams =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
mViewPagerImageView.setLayoutParams(viewPagerImageViewParams);
mViewPagerImageView.setScaleType(ScaleType.FIT_XY);
mViewPagerImageView.setOnClickListener(BannerFragment.this);
mViewList.add(mViewPagerImageView);
}
if (mViewList != null && mViewList.size() > 0) {
mViewPager.setAdapter(new ViewpagerAdapter());
}
mViewPager.setOnPageChangeListener(BannerFragment.this);
if (mImageUrlList.size() == 0) {
mTextView.setText(String.format("0 / %s", mImageUrlList.size()));
} else {
mTextView.setText(String.format("1 / %s", mImageUrlList.size()));
}
mViewPager.setCurrentItem(1);
if (mActivity.getSlidingMenu() != null && mActivity.getSlidingMenu().getSlidingView() != null) {
SlidingView sv = mActivity.getSlidingMenu().getSlidingView();
sv.setOnInterceptListener(new SlidingView.OnInterceptListener() {
@Override
public ViewFrame getInterceptViewFrame() {
ViewFrame frame = new ViewFrame(0, 50, mViewPager.getWidth(), mViewPager.getHeight());
return frame;
}
});
}
}
@Override
protected void init() {
}
/**
* PagerAdapter
* @author
*
*/
class ViewpagerAdapter extends PagerAdapter {
@Override
public void destroyItem(View container, int position, Object object) {
ImageView view = mViewList.get(position % mViewList.size());
((ViewPager) container).removeView(view);
view.setImageBitmap(null);
}
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(mViewList.get(position));
return mViewList.get(position);
}
@Override
public int getCount() {
return mViewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if(position == 0){
mFinalBitmap.display(mViewList.get(position), mImageUrlList.get(mImageUrlList.size() - 1));
}else if(position == mViewList.size() - 1){
mFinalBitmap.display(mViewList.get(position), mImageUrlList.get(0));
}else{
mFinalBitmap.display(mViewList.get(position), mImageUrlList.get(position - 1));
}
int pageIndex = position;
if(position == 0){
pageIndex = mImageUrlList.size();
}else if(position == mImageUrlList.size() + 1){
pageIndex = 1;
}
if(position != pageIndex){
mViewPager.setCurrentItem(pageIndex, false);
return;
}
int count = mViewList.size() - 2;
if(mViewList != null && count > 0){
int index = (position);
String text = index + "/" + count;
mTextView.setText(text);
}else{
String text = 0 + " / " + 0;
mTextView.setText(text);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
// 切换到左边的ImageView
case R.id.toLeftBannerFragmentImageView: {
if (mViewPager != null && mViewPager.getCurrentItem() > 0) {
mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1, true);
} else {
Toast.makeText(mActivity, R.string.banner_is_first, Toast.LENGTH_SHORT).show();
}
}
break;
// 切换到右边的ImageView
case R.id.toRightBannerFragmentImageView: {
if (mViewPager != null && mViewList != null && mViewPager.getCurrentItem() < Integer.MAX_VALUE - 1) {
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);
} else {
Toast.makeText(mActivity, R.string.banner_is_last, Toast.LENGTH_SHORT).show();
}
}
break;
}
super.onClick(v);
}
@Override
public void onPause() {
if (mFinalBitmap != null) {
mFinalBitmap.onPause();
}
super.onPause();
}
@Override
public void onResume() {
if (mFinalBitmap != null) {
mFinalBitmap.onResume();
}
super.onResume();
}
@Override
public void onDestroy() {
if (mFinalBitmap != null) {
mFinalBitmap.onDestroy();
}
super.onDestroy();
}
}