很多时候需要ViewPager可以动态的加载图片,数据分页拉取,这个时候不能notifyDateSetChanged,会回到第0个Item的位置,一种实现思路是建立一个非常大的空数组(元素为null)容量很大,拉取的数据可以填充到里面,这样实现动态的拉取,自己实现了一个。代码如下,首先是Activity
package com.xue.qin.mygallery.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import com.xue.qin.mygallery.R;
import com.xue.qin.mygallery.adapter.UnlimitedAdapter;
import com.xue.qin.mygallery.interfaces.DataProvider;
import com.xue.qin.mygallery.views.UnlimitedViewPager;
import java.util.ArrayList;
/**
* Created by xue.qin on 2018/4/21.
*/
public class UnlimitedActivity extends Activity implements DataProvider {
private UnlimitedViewPager mUnlimitViewPager;
private UnlimitedAdapter mUnlimitAdapter;
private ArrayList<String> mData;
private int left;
private int right;
private int current;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mData = intent.getStringArrayListExtra(GridActivity.DATA);
current = intent.getIntExtra(GridActivity.CURRENT, 0);
left = current - 1;
right = current + 1;
String initUri = mData.get(current);
setContentView(R.layout.pager_unlimited_acitvity_layout);
mUnlimitViewPager = (UnlimitedViewPager) findViewById(R.id.viewPager);
mUnlimitAdapter = new UnlimitedAdapter(this, mUnlimitViewPager, initUri, this);
mUnlimitViewPager.setAdapter(mUnlimitAdapter);
mUnlimitAdapter.scrolltoCurrent();
}
@Override
public String getLeft() {
if (left < 0) {
return null;
}
String uri = mData.get(left);
left--;
return uri;
}
@Override
public String getRight() {
if (right > mData.size() - 1) {
return null;
}
String uri = mData.get(right);
right++;
return uri;
}
@Override
public ArrayList<String> getLeftArray() {
return null;
}
@Override
public ArrayList<String> getRightArrAy() {
return null;
}
}
ViewPager
package com.xue.qin.mygallery.views;
/**
* Created by xue.qin on 2018/4/21.
*/
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* Created by qinxue on 2018/1/15.
*/
public class UnlimitedViewPager extends HackyViewPager {
private int mLeftPosition;
private int mRightPosition;
private int mWidth;
private float mLastX = -1;
public UnlimitedViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = getClientWidth();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
float x = ev.getX();
float dx = x - mLastX;
mLastX = x;
if (getCurrentItem() == mRightPosition && dx < 0 || getCurrentItem() == mLeftPosition && dx > 0) {
return false;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float dx = x - mLastX;
mLastX = x;
if (getCurrentItem() == mRightPosition && dx < 0 || getCurrentItem() == mLeftPosition && dx > 0) {
return true;
}
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mLastX = ev.getX();
}
return super.dispatchTouchEvent(ev);
}
public void setRealLeftPosition(int leftPosition) {
mLeftPosition = leftPosition;
}
public void setRealRightPosition(int rightPosition) {
mRightPosition = rightPosition;
}
private int getClientWidth() {
return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
}
}
Adapter
package com.xue.qin.mygallery.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.xue.qin.mygallery.R;
import com.xue.qin.mygallery.interfaces.DataProvider;
import com.xue.qin.mygallery.views.UnlimitedViewPager;
import java.util.ArrayList;
/**
* Created by xue.qin on 2018/4/21.
*/
public class UnlimitedAdapter extends android.support.v4.view.PagerAdapter {
private static final int MAX_CAPACITY = 10000;
private Context mContext;
private String[] mData = new String[MAX_CAPACITY];
private LayoutInflater mInflater;
private UnlimitedViewPager mViewPager;
private int initCursot = MAX_CAPACITY / 2;
private int leftCursor = MAX_CAPACITY / 2 - 1;
private int rightCursor = MAX_CAPACITY / 2 + 1;
private DataProvider mDataProvider;
public UnlimitedAdapter(Context context, UnlimitedViewPager viewPager, String initUri, DataProvider dataProvider) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mDataProvider = dataProvider;
mViewPager = viewPager;
init(initUri);
}
private void init(String initUri) {
mData[initCursot] = initUri;
addLeft(mDataProvider.getLeft());
addRight(mDataProvider.getRight());
}
public void scrolltoCurrent() {
mViewPager.setCurrentItem(initCursot);
}
@Override
public int getCount() {
return mData.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
updateData(position);
if (mData[position] != null) {
View view = mInflater.inflate(R.layout.pager_adapter_item, null, false);
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
Glide.with(mContext)
.load(mData[position])
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(imageView);
container.addView(view);
return view;
} else {
return null;
}
}
private void updateData(int position) {
String uri = null;
if (position == leftCursor + 1) {
uri = mDataProvider.getLeft();
if (uri != null) {
addLeft(uri);
} else {
mViewPager.setRealLeftPosition(position);
}
} else if (position == rightCursor - 1) {
uri = mDataProvider.getRight();
if (uri != null) {
addRight(uri);
} else {
mViewPager.setRealRightPosition(position);
}
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
public void addLeft(String uri) {
if (leftCursor == 0 || uri == null) {
mViewPager.setRealLeftPosition(leftCursor + 1);
return;
}
mData[leftCursor] = uri;
leftCursor--;
}
public void addRight(String uri) {
if (rightCursor == MAX_CAPACITY - 1 || uri == null) {
mViewPager.setRealRightPosition(rightCursor - 1);
}
mData[rightCursor] = uri;
rightCursor++;
}
public void addLeft(ArrayList<String> uris) {
for (String uri : uris) {
mData[leftCursor] = uri;
leftCursor--;
if (leftCursor < 0) {
mViewPager.setRealLeftPosition(leftCursor);
break;
}
}
}
public void addRight(ArrayList<String> uris) {
for (String uri : uris) {
mData[rightCursor] = uri;
rightCursor++;
if (rightCursor > MAX_CAPACITY - 1) {
mViewPager.setRealRightPosition(rightCursor);
break;
}
}
}
}
Demo地址:https://github.com/xueqin123/viewpageroom