您的位置:首页 > 移动开发 > Android开发

记android ViewPager实现轮播图的无限滚动笔记

2016-11-26 10:27 1061 查看
遇到的问题

在做广告无限轮播图的时候用手去主动向右滑动的时候发现出现空白的视图

解决办法

在重写PagerAdapter的destroyItem(View arg0, int arg1, Object arg2)时不要在这里面去调用((ViewPager) arg0).removeView(list.get(position));

原因是在做无限循环时,我们需要getCount()设置为Integer.MAX_VALUE很大的值,且在重写instantiateItem(View arg0, final int arg1)方法时,我们需要判断当前的视图是否已经有父控件包住了,如果有则在这里从父亲中移除。

以下是整个PagerAdapter的重写代码

public class AdBannerAdapter extends PagerAdapter
{
//所有的View集合
private List<View> list;

//点击回调事件
private AdBannerView.OnImageClick onImageClick;
public AdBannerAdapter(Context context, List<View> list) {
this.list = list;
}

//设置无限
循环
@Override
public int getCount() {
return Integer.MAX_E;
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

public View instantiateItem(View arg0, final int arg1) {
if (list.size() > 0)
{
final int position = arg1 % list.size()<0?list.size()+arg1:arg1 % list.size();
//如果已经被viewPager包含,则从中移除,否则会报错
if (list.get(position).getParent() != null){
ViewGroup group = (ViewGroup) list.get(position).getParent();
group.removeView(list.get(position));
}
//添加到ViewPager
((ViewPager) arg0).addView(list.get(position));
//设置点击事件
list.get(arg1 % list.size()).setOnClickListener(new OnClickListener()
{

@Override
public void onClick(View view)
{
if (onImageClick != null)
{
onImageClick.onImageClick(position);
}
}

});
return list.get(position);
}
return null;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
//因为上面已经把view从ViewPager中移除,这里不要再次移除,否则在手动右滑的时候会出现空白的视图
//      final int position = arg1 % list.size();
//      ((ViewPager) arg0).removeView(list.get(position));
}

public AdBannerView.OnImageClick getOnImageClick() {
return onImageClick;
}

public void setOnImageClick(AdBannerView.OnImageClick onImageClick) {
this.onImageClick = onImageClick;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息