Android ViewPager无法按预期工作
我尝试制作一个包含三个视图的无限ViewPager:Android ViewPager无法按预期工作,android,android-viewpager,Android,Android Viewpager,我尝试制作一个包含三个视图的无限ViewPager: int lastPos; pager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int pos, float v, int i2) { Log.d("page", "scoll:" + pos); }
int lastPos;
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int pos, float v, int i2) {
Log.d("page", "scoll:" + pos);
}
@Override
public void onPageSelected(int pos) {
Log.d("page", "selected:" + pos);
}
@Override
public void onPageScrollStateChanged(int state) {
Log.d("page", "state:" + state);
if (state == ViewPager.SCROLL_STATE_DRAGGING) {
lastPos = getCurrentItem();
}
if (state == ViewPager.SCROLL_STATE_IDLE) {
Log.d("page", "idle");
int npos = getCurrentItem();
if (npos != lastPos) {
setCurrentItem(1, false);
//resetPageContent(npos - lastPos); //npos - lastPos ==> Negative means left, positive means right.
}
}
}
});
如图所示,我会将当前项重置为1,使寻呼机可以滑动,然后我会相应地更改页面内容
不过,我现在有一些问题:
1 OnPageChangeListener:
mViewPage.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position) {
}
});
我添加了一些日志,以确保在OnPageChangeListener阶段发生了什么,结果如下:
page﹕ scoll:1
page﹕ state:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ state:2
page﹕ selected:2
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:1
page﹕ scoll:2
page﹕ state:0
page﹕ idle
page﹕ selected:1
page﹕ scoll:1
我无法理解,在页面滚动状态变为空闲后,onPageScrolled将被称为事件
和onPageSelected被调用两次
为什么?
2“无限”无法按预期工作
一旦我正常滚动ViewPager,它就会工作,但是一旦我快速滚动它,ViewPager会在某个时候结束
我不确定是什么问题。我希望有人能给我一些帮助
更新:整个viewpager代码:
public class CustomViewPager extends ViewPager {
private MyPagerAdapter myPagerAdapter;
private int lastPos = 1;
private int globalIndex = 1;
private SinglePageView[] mPages = new SinglePageView[3];
public CustomViewPager(Context context) {
this(context, null);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
myPagerAdapter = new MyPagerAdapter();
setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageScrolled(int pos, float v, int i2) {
}
@Override
public void onPageSelected(int pos) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int npos = getCurrentItem();
if (npos != lastPos) {
resetPageContent(npos - lastPos);
}
}
}
});
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
int w = r - l, h = b - t;
for (int i = 0; i < 3; i++) {
mPages[i] = new SinglePageView(getContext());
mPages[i].setMinimumWidth(w);
mPages[i].setMinimumHeight(h);
}
setAdapter(myPagerAdapter);
resetPageContent(0);
}
}
private void resetPageContent(int dir) {
if (dir > 0) {
globalIndex++;
} else if (dir < 0)
globalIndex--;
mPages[1].setContent(String.valueOf(globalIndex));
globalIndex--;
mPages[0].setContent(String.valueOf(globalIndex));
globalIndex++;
globalIndex++;
mPages[2].setContent(String.valueOf(globalIndex));
globalIndex--;
setCurrentItem(1, false);
globalIndex++;
}
class MyPagerAdapter extends PagerAdapter {
private MyPagerAdapter() {
}
@Override
public int getCount() {
return mPages.length;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
SinglePageView spv = mPages[position];
container.addView(spv, 0);
return spv;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == (View) o;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
class SinglePageView extends View {
private String mContent = "Unassigned";
private Paint mPaint;
public SinglePageView(Context context) {
super(context);
mPaint = new Paint();
mPaint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.drawText(mContent, 100, 100, mPaint);
canvas.restore();
}
public void setContent(String content) {
mContent = content;
}
}
}
虽然目前内容计算不正确,但它是无限的,除非您快速滑动,演示:如果您使用ViewPager包含片段,您可以使用mViewPage.setAdapternew PagerAdapter;
您不需要实现侦听器。如果您使用Fragment,您可以这样做: 第一: 在布局xml中:
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
第三:
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return MyFragment.getInstanceFragment(position);
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return "First Fragment";
case 1:
return "Second Fragment";
case 2:
return "Second Fragment";
default:
return "First Fragment";
}
}
}
然后:
ViewPager mViewPage = (ViewPager) findViewById(R.id.pager);
SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPage.setAdapter(mSectionsPagerAdapter);;
如果要实现ViewPaper的侦听器:
mViewPage.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position) {
}
});
对于infine ViewPager,我已经编写了自己的代码,如,因为我知道您的ViewPager只有3个视图,所以您可以解释无限是什么意思吗?只有3个视图,但我将继续将当前项重置为1,并更新视图的内容。还有,您的适配器是什么?FragmentStatePagerAdapter或FragmantPagerAdapter@mmlooo:我更新了我的帖子。我下载了你的代码并在eclipse中创建了新的prj,之后我更改了3个视图的背景,使页面[0]为红色,页面[1]为绿色,[2]为蓝色。我正在滚动它和它的工作,我正在快速滚动它和它的工作,我不明白你到底想要实现什么?