ViewPager
一、ViewPager简介:
(一)、作用:
ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。ViewPager用于实现多页面的切换效果。该类存在于Google的兼容包里面,android.support.v4.view.ViewPager。
(二)、ViewPager的常规使用步骤:
1、在布局文件中定义ViewPager组件(android.support.v4.view.ViewPager节点);
2、在Activity中设置ViewPager中放置的view内容;
3、给ViewPager对象设置适配器(PagerAdapter)。
- ViewPager的适配器是PagerAdapter,它是基类。提供适配器来填充ViewPager的内部。一般做法都是继承PagerAdapter,自定义一个MyAdapter。
- 也可以使用一个更具体的实现,如FragmentPagerAdapter或FragmentStatePagerAdapter。谷歌官方推荐ViewPager和Fragment一起使用。当然在3.0以下版本中,没有必要这么做。
(三)、实现PagerAdapter必须重写的方法:
1、getCount()
2、isViewFromObject(View, Object)
3、instantiateItem(ViewGroup, int)
4、destroyItem(ViewGroup, int, Object)
【备注:】最少要实现上面四个方法,当然如果想让程序更健壮或是功能更全面,你可以重写其他的方法。
二、ViewPager实现广告条实例:
(一)、Adapter核心代码:
public class MyAdapter extends PagerAdapter {
private static final String TAG = "viewpager";
private List<ImageView> list;
public MyAdapter(List<ImageView> list) {
this.list = list;
}
//返回ViewPager中item的总量
@Override
public int getCount() {
//设置item的数量为Integer.MAX_VALUE
return Integer.MAX_VALUE;
}
//判断当前显示的ImageView和instantiateItem方法返回的ImageView是否是同一个
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
//添加ImageView到ViewPager中
@Override
public Object instantiateItem(ViewGroup container, int position) {
//根据position将List中的ImageView添加到ViewPager中
container.addView(list.get(position%list.size()));
Log.d(TAG, "instantiateItem() returned: " + position);
//将添加的ImageView返回
return list.get(position%list.size());
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//从容器中移除一个ImageView
container.removeView(list.get(position%list.size()));
Log.d(TAG, "destroyItem() returned: " + position);
}
}
(二)MainActivity核心代码:
public class MainActivity extends AppCompatActivity {
private List<ImageView> list;
private LinearLayout dotLayout;
private int prePosition;
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
//开启一个新线程,实现ViewPager的自动滚动
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//runOnUiThread中的代码运行在主线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
}
});
}
}
}).start();
}
private void initView() {
viewPager = (ViewPager) findViewById(R.id.vp1);
//构造适配器
MyAdapter adapter = new MyAdapter(list);
//设置Adapter
viewPager.setAdapter(adapter);
//设置ViewPager预加载的页数
// viewPager.setOffscreenPageLimit(2);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//ViewPager滑动过程中调用
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
//ViewPager新页面确定后调用
@Override
public void onPageSelected(int position) {
//设置前一个View为白色
dotLayout.getChildAt(prePosition).setEnabled(false);
//设置当前View为红色
dotLayout.getChildAt(position % list.size()).setEnabled(true);
//将当前位置赋给prePosition
prePosition = position % list.size();
}
//ViewPager滑动状态改变后调用
//0--静止状态
//1--手在拖动
//2--手松开后自动滑动
@Override
public void onPageScrollStateChanged(int state) {
}
});
//设置ViewPager的初始item
viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - 3);
}
/**
* 构造数据源
*/
private void initData() {
dotLayout = (LinearLayout) findViewById(R.id.dotLayout);
list = new ArrayList<>();
int[] imgs = new int[]{R.drawable.p001, R.drawable.p002, R.drawable.p003, R.drawable.p004, R.drawable.p005};
for (int img : imgs) {
//使用Java代码创建一个ImageView
ImageView imageView = new ImageView(this);
//设置图片以及ScaleType属性
imageView.setImageResource(img);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
list.add(imageView);
//创建一个View对象
View view = new View(this);
//设置View的宽和高
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()), (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));
//设置View左边距,避免View连在一起
params.leftMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getResources().getDisplayMetrics());
view.setLayoutParams(params);
//设置背景颜色,背景使用selector,可使View在不同状态显示不同颜色
view.setBackgroundResource(R.drawable.dot_backg);
//默认状态下View的Enable属性为false(View全为白色)
view.setEnabled(false);
//将View添加进LinearLayout中
dotLayout.addView(view);
}
//第一个View默认为红色
dotLayout.getChildAt(0).setEnabled(true);
}
}
三、ViewPager加载Fragment实例:
(一)、Adapter核心代码:
public class MyFgAdapter extends FragmentPagerAdapter {
private List<Fragment> list;
public MyFgAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.list = list;
}
//返回一个Fragment
@Override
public Fragment getItem(int position) {
return list.get(position);
}
//返回Fragment总数
@Override
public int getCount() {
return list.size();
}
}
(二)、Activity核心代码
public class MainActivity extends AppCompatActivity {
private List<Fragment> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSharedPreferences("loginInfo", MODE_PRIVATE).edit().putBoolean("isFirstLogin", false).commit();
ViewPager viewPager = (ViewPager) findViewById(R.id.vp);
initData();
MyFgAdapter adapter = new MyFgAdapter(getSupportFragmentManager(), list);
viewPager.setAdapter(adapter);
}
private void initData() {
list = new ArrayList<>();
ChatFragment chatFragment = new ChatFragment();
FriendFragment friendFragment = new FriendFragment();
FindFragment findFragment = new FindFragment();
HomeFragment homeFragment = new HomeFragment();
list.add(chatFragment);
list.add(friendFragment);
list.add(findFragment);
list.add(homeFragment);
}
}