在做首页时候 上方需要有一个轮播图来循环显示,可是我们Listview通过addHeaderView方式头部添加轮播,轮播失效,不管是Activity还是Fragment的方式 都不好用,这个时候我通过了这种方式解决了,,下面是源码 实在人,按照做就可以成功
新建一个类,以下是代码:
package com.example.computer.yingkezhibo.view; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.example.computer.yingkezhibo.R; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class SlideShowViewLunBo extends FrameLayout { //轮播图图片数量 private final static int IMAGE_COUNT = 3; //自动轮播的时间间隔 private final static int TIME_INTERVAL = 3; //自动轮播启用开关 private final static boolean isAutoPlay = true; //自定义轮播图的资源ID private int[] imagesResIds; //放轮播图片的ImageView 的list private List<ImageView> imageViewsList; //放圆点的View的list private List<TextView> dotViewsList; private ViewPager viewPager; //当前轮播页 private int currentItem = 0; //定时任务 private ScheduledExecutorService scheduledExecutorService; //Handler private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); viewPager.setCurrentItem(currentItem); } }; public SlideShowViewLunBo(Context context) { this(context,null); // TODO Auto-generated constructor stub } public SlideShowViewLunBo(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub hideClear(); } public SlideShowViewLunBo(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub initData(); initUI(context); if(isAutoPlay){ startPlay(); } } /** * 开始轮播图切换 */ private void startPlay(){ scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 4, TimeUnit.SECONDS); } /** * 停止轮播图切换 */ private void stopPlay(){ scheduledExecutorService.shutdown(); } /** * 初始化相关Data */ private void initData(){ Log.e("=====","卧槽 "); imagesResIds = new int[]{ R.mipmap.index_pic1, R.mipmap.index_pic2, R.mipmap.index_pic3, R.mipmap.index_pic4, R.mipmap.index_pic5, // R.mipmap.yingzheng1, }; imageViewsList = new ArrayList<ImageView>(); dotViewsList = new ArrayList<TextView>(); } /** * 初始化Views等UI */ private void initUI(Context context){ LayoutInflater.from(context).inflate(R.layout.a, this, true); for(int imageID : imagesResIds){ ImageView view = new ImageView(context); view.setImageResource(imageID); view.setScaleType(ImageView.ScaleType.FIT_XY); imageViewsList.add(view); } dotViewsList.add((TextView) findViewById(R.id.v_dot1)); dotViewsList.add((TextView)findViewById(R.id.v_dot2)); dotViewsList.add((TextView)findViewById(R.id.v_dot3)); dotViewsList.add((TextView)findViewById(R.id.v_dot4)); dotViewsList.add((TextView)findViewById(R.id.v_dot5)); viewPager = (ViewPager) findViewById(R.id.viewPagerLunBo); viewPager.setFocusable(true); viewPager.setAdapter(new MyPagerAdapter()); viewPager.setOnPageChangeListener(new MyPageChangeListener()); } void hideClear(){ dotViewsList.get(0).setBackgroundResource(R.drawable.dot_normal); dotViewsList.get(1).setBackgroundResource(R.drawable.dot_normal); dotViewsList.get(2).setBackgroundResource(R.drawable.dot_normal); dotViewsList.get(3).setBackgroundResource(R.drawable.dot_normal); dotViewsList.get(4).setBackgroundResource(R.drawable.dot_normal); } /** * 填充ViewPager的页面适配器 * @author caizhiming */ private class MyPagerAdapter extends PagerAdapter { @Override public void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub //((ViewPag.er)container).removeView((View)object); ((ViewPager)container).removeView(imageViewsList.get(position)); } @Override public Object instantiateItem(View container, int position) { // TODO Auto-generated method stub ((ViewPager)container).addView(imageViewsList.get(position)); return imageViewsList.get(position); } @Override public int getCount() { // TODO Auto-generated method stub return imageViewsList.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { // TODO Auto-generated method stub } @Override public Parcelable saveState() { // TODO Auto-generated method stub return null; } @Override public void startUpdate(View arg0) { // TODO Auto-generated method stub } @Override public void finishUpdate(View arg0) { // TODO Auto-generated method stub } } /** * ViewPager的监听器 * 当ViewPager中页面的状态发生改变时调用 * @author caizhiming */ private class MyPageChangeListener implements ViewPager.OnPageChangeListener { boolean isAutoPlay = false; @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub switch (arg0) { case 1:// 手势滑动,空闲中 isAutoPlay = true; break; case 2:// 界面切换中 isAutoPlay = true; break; case 0:// 滑动结束,即切换完毕或者加载完毕 // 当前为最后一张,此时从右向左滑,则切换到第一张 if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) { viewPager.setCurrentItem(0); } // 当前为第一张,此时从左向右滑,则切换到最后一张 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1); } break; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int pos) { // TODO Auto-generated method stub // View v1; // View v2; // View v3; // View v4; // v1=(View)findViewById(R.id.v_dot1) ; // v2=(View)findViewById(R.id.v_dot2); // v3=(View)findViewById(R.id.v_dot3); // v4=(View)findViewById(R.id.v_dot4) ; // currentItem = pos; switch (pos){ case 0: hideClear(); dotViewsList.get(0).setBackgroundResource(R.drawable.dot_focuse); break; case 1: hideClear(); dotViewsList.get(1).setBackgroundResource(R.drawable.dot_focuse); break; case 2: hideClear(); dotViewsList.get(2).setBackgroundResource(R.drawable.dot_focuse); break; case 3: hideClear(); dotViewsList.get(3).setBackgroundResource(R.drawable.dot_focuse); break; case 4: hideClear(); dotViewsList.get(4).setBackgroundResource(R.drawable.dot_focuse); break; } } } /** *执行轮播图切换任务 *@author caizhiming */ private class SlideShowTask implements Runnable{ @Override public void run() { // TODO Auto-generated method stub synchronized (viewPager) { currentItem = (currentItem+1)%imageViewsList.size(); handler.obtainMessage().sendToTarget(); } } } /** * 销毁ImageView资源,回收内存 * @author caizhiming */ private void destoryBitmaps() { for (int i = 0; i < IMAGE_COUNT; i++) { ImageView imageView = imageViewsList.get(i); Drawable drawable = imageView.getDrawable(); if (drawable != null) { //解除drawable对view的引用 drawable.setCallback(null); } } } }
ok 代码最长的一个类解决了....
接下来是layout页面,这个类相当于定义了一个轮播的模板直接复制粘贴放上就行
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:layout_below="@+id/topPanel" android:id="@+id/viewPagerLunBo" android:layout_width="match_parent" android:layout_height="200dp"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/viewPager" android:padding="5dp" android:gravity="center" android:orientation="horizontal" android:layout_marginTop="-20dp" > <!--<View--> <!--android:alpha="1"--> <!--android:id="@+id/v_dot1"--> <!--android:layout_width="20dp"--> <!--android:layout_height="8dp"--> <!--android:background="@drawable/bg2" />--> <TextView android:id="@+id/v_dot1" android:layout_width="8dp" android:layout_height="8dp" /> <TextView android:id="@+id/v_dot2" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/v_dot3" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/v_dot4" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" /> <TextView android:id="@+id/v_dot5" android:layout_width="8dp" android:layout_height="8dp" android:layout_marginLeft="5dp" /> </LinearLayout> </LinearLayout>接下来写你的要实现轮播的页面
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.computer.yingkezhibo.view.SlideShowViewLunBo android:id="@+id/lunbo" android:layout_width="match_parent" android:layout_height="200dp"> </com.example.computer.yingkezhibo.view.SlideShowViewLunBo> </LinearLayout>OK!完成之后 就可以在你要把轮播放在上面的那个类里面的addHeaderView来导入我们上边写的这个类啦,假设上边这个layout文件名是 b.xml 例子如下
View lunbo=View.inflate(getActivity(),R.layout.b,null); xListView.addHeaderView(lunbo);最后 就完成了~~~
注意 选中圆点和未选中圆点没写 为图个方便 下面写上选中的圆点,未选中的就换个颜色就好啦~~
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@color/colorQingCheng"></solid> </shape>