Android uses ViewPager to realize left and right infinite sliding
- 2021-09-11 21:16:14
- OfStack
Preface
There are a lot of data about using ViewPager to realize the effect of sliding left and right on the Internet. Most of these data set the return value of getCount () method in PagerAdapter to Integer. MAX_VALUE so that users can't see the boundary, and then get the corresponding data set in instantiateItem () method by position% (the length of the data set to be displayed cyclically). Although this can achieve infinite loop, but there will be two drawbacks: first, it will create a large number of objects, which will easily cause memory overflow (loop loading pictures) and affect performance; Secondly, when you slide to the right from page 1, you can't slide.
What I want to share with you today is another implementation method: Create three picture views and put them into ViewPager to select Page 2 by default. After each slide in the next slide, set the current page number to Page 2, and then set the data set in the view by judging whether it is sliding left to right, so that an infinite loop can be realized, and only three picture view objects will be created.
Sample source code
package com.viewpager;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.app.Activity;
public class MainActivity01 extends Activity implements OnPageChangeListener {
private ViewPager viewPager;
static final int arrays[] = { R.drawable.guide1, R.drawable.guide2,
R.drawable.guide3, R.drawable.guide4, R.drawable.guide5 };
private List<ImageView> views;
private int currentPage = 0;
private ImageView imageView;
private MyViewPagerAdapter viewPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget();
}
private void initWidget() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
views = new ArrayList<ImageView>();
for (int i = 0; i < 3; i++) {
imageView = new ImageView(this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
views.add(imageView);
}
initImageData();
viewPagerAdapter = new MyViewPagerAdapter();
viewPager.setAdapter(viewPagerAdapter);
viewPager.setCurrentItem(1);
viewPager.setOnPageChangeListener(this);
}
private void initImageData() {
for (int i = 0; i < 3; i++) {
imageView = views.get(i);
if (i == 0) {
imageView.setImageResource(arrays[arrays.length - 1]);
} else {
imageView.setImageResource(arrays[i - 1]);
}
}
}
class MyViewPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
imageView = views.get(position);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View) object);
}
}
// Called when the sliding state changes
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
System.out.println("--onPageScrollStateChanged--state--:" + state);
switch (state) {
// After scrolling is completed,
case ViewPager.SCROLL_STATE_IDLE:
int currentItem = viewPager.getCurrentItem();
System.out.println("--currentItem--00--:" + currentItem);
System.out.println("--currentPage--00--:" + currentPage);
if (viewPager.getCurrentItem() == 1) {
// If the position does not change, terminate the loop
break;
}
if (viewPager.getCurrentItem() > 1) {
currentPage++;
} else {
currentPage--;
}
System.out.println("--currentPage--11--:" + currentPage);
if (currentPage == arrays.length) {
currentPage = 0;
}
if (currentPage == -1) {
currentPage = arrays.length - 1;
}
System.out.println("--currentPage--22--:" + currentPage);
if (currentPage == 0) {
views.get(0).setImageResource(arrays[arrays.length - 1]);
} else {
views.get(0).setImageResource(arrays[currentPage - 1]);
}
views.get(1).setImageResource(arrays[currentPage]);
if (currentPage == arrays.length - 1) {
views.get(2).setImageResource(arrays[0]);
} else {
views.get(2).setImageResource(arrays[currentPage + 1]);
}
viewPager.setCurrentItem(1, false);
currentItem = viewPager.getCurrentItem();
System.out.println("--currentItem--11--:" + currentItem);
break;
}
}
// Called when the current page is slid
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
// System.out.println("--onPageScrolled--position--:" + position);
}
// Called when a new page is selected
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
System.out.println("--onPageSelected--position--:" + position);
}
}