现在我们继续上一篇的讲述,这次来讲讲关于ViewPager的无限循环方法。
对于viewpager控件的加载和适配器的加载,上一篇已经有了,我们直接在上一篇的基础上进行改进,这就是所谓的代码的复用。
这次我们使用handler消息机制以及线程来对界面进行更新,话不多说,看看代码。
<pre name="code" class="java">public class MainActivity extends ActionBarActivity {
public static final int CHANG_OK = 1;
private int[] res = new int[]{R.drawable.girl,R.drawable.girl2,R.drawable.girl3,R.drawable.girl4,R.drawable.girl5};
private ViewPager viewPager;
private List<ImageView> imageViews = new ArrayList<ImageView>();
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case CHANG_OK:
if(viewPager.getCurrentItem()/(res.length-1)==1)
{
viewPager.setCurrentItem(viewPager.getCurrentItem()%(res.length-1));
}else {
viewPager.setCurrentItem(viewPager.getCurrentItem()%(res.length-1)+1);
}
break;
default:
break;
}
};
};
以上代码是创建了一个handler实例,并且在接收线程消息后进行相关的界面更新,很简单,看一下代码就清楚了,然后后面增加了线程的更新信息的发送,笔者设置了每隔两秒就界面跟新一次,当然你也可以设置你的线程更新时间,这个无所谓。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(new PagerAdapter() {
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(res[position]);
imageView.setScaleType(ScaleType.CENTER_CROP);
container.addView(imageView);
imageViews.add(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(imageViews.get(position));
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return res.length;
}
});
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
while (true) {
Thread.sleep(2000);
handler.sendEmptyMessage(CHANG_OK);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
为了让thread能一直的发送消息,笔者设置了无限制的while(true),并且为了让大家更清楚,笔者将整个源码都放了上去,最后运行的效果和上一篇相似,只是多了自动切换界面的功能和无限循环功能。
end~