Viewpager3.0出现的,用于大图轮播;
ViewPager预加载机制:最多保存3个page,超过的将需要被销毁掉
关联jar包的源代码:共两种方式;
1.先点击Android Dependencies,将它从BuildPath remove掉,
再右键点击jar包,将jar add to BuildPath;
然后就出现Attatch Source按钮了
2.在libs目录下新建一个文件,文件名是jar包全名(包括后缀.jar),然后
该文件名以.properties结尾,新建一行键值对如:
src=jar源代码绝对路径,(不要忘了将单斜线变成双斜线)
自定义View要带上包名:
在layout布局下定义view时。
<android.support.v4.view.ViewPager>
</android.support.v4.view.ViewPager>
ViewPager 需要 instantiateItem 相当于添加ListView中的getView;
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View view = View.inflate(MainActivity.this,R.layout.adapter_item, null);
ImageView imageview =(ImageView) view.findViewById(R.id.image);
Ad ad = list.get(position);
imageview.setImageResource(ad.getIconResId());
container.addView(view); //记得要将View添加到ViewPager中。
return view; //需要返回view;
}
异常处理:
类明明存在,却报class not found异常解决方法
右键工程,打开bulid path面板,选择Order And Export,
将对应jar打钩
设置对应文字同步的方法是:设置页面改变的监听。
这个是文字改变时, 获取当前的页面与此匹配。 该方法要在页面改变监听中调用。
private void updateDesc(){
int currentpage = viewpager.getCurrentItem();
tv_desc.setText(list.get(currentpage).getDesc()); //获取当前页面。
}
viewpager.setOnPageChangeListener(new OnPageChangeListener() {
@Override//页面改变的监听。
public void onPageSelected(int position) {
// TODO Auto-generated method stub
// Log.e("Mainactivity", "position :"+position);
updateDesc();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
});
动态的设置图片在pageVIew中:
这个方法是更新文字描述和原点的状态 。:
private void updateDescAndDot() {
int currentpage = viewpager.getCurrentItem();
tv_desc.setText(list.get(currentpage).getDesc()); // 获取当前页面。
for(int i=0; i<ll_dot.getChildCount();i++){
ll_dot.getChildAt(i).setEnabled(currentpage==i); //判断两者是否相同,相同的话为true。else为false。
}
几个原点用代码在linearLayout的注册方式:
private void initDots() {
// TODO Auto-generated method stub
for (int i = 0; i < list.size(); i++) {
View view = new View(this);
LayoutParams params = new LayoutParams(8,8); //这个是Linearlayout的layoutParams需注意必须是,
if(i!=0){
params.leftMargin=5; //第一个不用设置左边距。
}
view.setLayoutParams(params);
view.setBackgroundResource(R.drawable.selector_dot);
ll_dot.addView(view);
}
以下就是将ViewPager的轮播,变成无线循环的样式:
广告轮播的伪无限循环;
viewpager.setCurrentItem(item); viewPager中的方法。
Ad ad = list.get(position%list.size()); //取得余数。
int currentValue = Integer.MAX_VALUE/2;
int value = currentValue%list.size();
viewpager.setCurrentItem(currentValue-value); //保证两边都能无限的滑动。
adapter中的设置;
class MyAdapter extends PagerAdapter {
/**
* 获取page的总数量。
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE; // list封装的数据个数。
}
/**
* 滑动的view和即将进入的view是不是同一个 true : 使用缓存 false: 重新创建。
*/
@Override
public boolean isViewFromObject(View view, Object object) {
// TODO Auto-generated method stub
return view == object;
}
/**
* 删除销毁page; position 銷毀第几页。
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
// super.destroyItem(container, position, object);
container.removeView((View) object);
}
/**
* 类似于BaseAdapter的getView 方法。 将数据设置给View;
*
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View view = View.inflate(MainActivity.this, R.layout.adapter_item, null);
ImageView imageview = (ImageView) view.findViewById(R.id.image);
Ad ad = list.get(position%list.size()); //让它得到的值是其模数就能保证其能拿到具体的对象。
imageview.setImageResource(ad.getIconResId());
container.addView(view);
return view;
}
添加一个自动滑动的效果:
handler.sendEmptyMessageDelayed(0, 4000); 发送一个空的消息,用于延时。
加一个Handler就可以达到自动滑动的效果。
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
viewpager.setCurrentItem(viewpager.getCurrentItem()+1); //当前页面+1;
handler.sendEmptyMessageDelayed(0, 4000); //每四秒发送一个消息。 这个是为了达到循环的效果。
};
};