网路请求数据 viewpager自动轮播 点击停止轮播,放开继续

##viewpager布局

<android.support.v4.view.ViewPager
    android:id="@+id/viewPager"

    android:layout_width="0dp"
    android:layout_height="200dp"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    ></android.support.v4.view.ViewPager>

    <!-- 小圆点 -->
   <LinearLayout
        android:id="@+id/dots"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="@id/viewPager"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent" />

##mian页面主代码

public class MainActivity extends AppCompatActivity {


    private BannerBean bannerBean;
    private ViewPager viewPager;
    private BannerAdapter bannerAdapter;
    private LinearLayout dots;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        page=1;
        initData(page);
    }
    private int page;
    private final int count = 10;
    private String bannerurl="http://www.zhaoapi.cn/quarter/getAd";
    //page=1&count=10
    private String listurl="http://172.17.8.100/movieApi/movie/v1/findHotMovieList?";
    private void initData(int page) {
        initBanner();
    }

    private final int CHANGE_PAGE = 0;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            //发消息解决自动轮播
            switch (msg.what){
                case CHANGE_PAGE:
                    int currentItem = viewPager.getCurrentItem();
                    currentItem++;
                    viewPager.setCurrentItem(currentItem);
                    handler.sendEmptyMessageDelayed(CHANGE_PAGE,1000);
                    break;
            }
        }
    };
    private void initBanner() {
        new AsyncTask<String, Void, List<BannerBean.BannerData>>() {
            @Override
            protected List<BannerBean.BannerData> doInBackground(String... strings) {
                try {
                    URL url = new URL(strings[0]);
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setConnectTimeout(5000);
                    urlConnection.setReadTimeout(5000);
                    int responseCode = urlConnection.getResponseCode();
                    if(responseCode==urlConnection.HTTP_OK){
                        String stream = getStream(urlConnection.getInputStream());
                        Gson gson = new Gson();
                        bannerBean = gson.fromJson(stream, BannerBean.class);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return bannerBean.getData();
            }

            @Override
            protected void onPostExecute(List<BannerBean.BannerData> bannerData) {
                //设置设配器  给数据
                bannerAdapter.setData(bannerData);
                //设置小圆点
                //初始化小圆点
                addDots(bannerData);
                //设置自动轮播
                int position = bannerData.size() * 500;
                viewPager.setCurrentItem(position);
                //发送消息
                startLoop();
            }
        }.execute(bannerurl);
    }
    public void  addDots(List<BannerBean.BannerData> data){
        //不管有没有,全部移除掉
        dots.removeAllViews();
        for (int i = 0 ; i < data.size();i++) {
            View view = new View(this);
            //给view设置背景  为小圆点布局
            view.setBackgroundResource(R.drawable.seleteor_dot);
            int size = getResources().getDimensionPixelSize(R.dimen.dot_size);
            //布局参数  10dp宽高
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(size, size);
            //小圆点间距
            layoutParams.leftMargin = size;
            layoutParams.rightMargin = size;
            //添加视图
            dots.addView(view, layoutParams);
        }
    }
    public void startLoop(){
        stopLoop();
        //当没有数据时
        if (bannerAdapter.getCount()==0){
            return;
        }
        handler.sendEmptyMessageDelayed(CHANGE_PAGE,1000);
    }
    public void stopLoop(){
        handler.removeMessages(CHANGE_PAGE);
    }
    private String getStream(InputStream inputStream) throws Exception {
        StringBuilder stringBuilder = new StringBuilder();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        for (String tmp = bufferedReader.readLine();tmp!=null;tmp=bufferedReader.readLine()){
            stringBuilder.append(tmp);
        }
        return stringBuilder.toString();
    }

    private void initView() {
        dots = findViewById(R.id.dots);
        viewPager = findViewById(R.id.viewPager);
        //加载更多
       // xlv.setPullLoadEnable(true);
        //适配器
        bannerAdapter = new BannerAdapter();
        viewPager.setAdapter(bannerAdapter);
        //触摸时不能轮播
        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //点击  移动  抬起
                if (event.getAction()==MotionEvent.ACTION_UP||event.getAction()==MotionEvent.ACTION_CANCEL){
                    //重新轮播
                    startLoop();
                }else if(event.getAction()==MotionEvent.ACTION_DOWN){
                    //停止轮播
                    stopLoop();
                }
                return false;
            }
        });
        //设置监听  设置小圆点的选中状态
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                //遍历所有孩子
                for (int j = 0;j < dots.getChildCount();j++){
                    //获取当前图片位置  设置远点是否选中
                    if (i%dots.getChildCount()==j){
                        dots.getChildAt(j).setSelected(true);
                    }else {
                        //其他不选中
                        dots.getChildAt(j).setSelected(false);
                    }

                }
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
    }
}

##pager适配器

public class BannerAdapter extends PagerAdapter {
private List<BannerBean.BannerData> data;

    public BannerAdapter() {
        this.data = new ArrayList<>();
    }

    public void setData(List<BannerBean.BannerData> data) {
        if (data!=null) {
            this.data = data;
            notifyDataSetChanged();
        }
    }

    @Override
    public int getCount() {
        //为轮播
        return data.size()==0?0:5000;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }
    public BannerBean.BannerData getItem(int position){
        return data.get(position%data.size());
    }
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        ImageView imageView = new ImageView(container.getContext());
        container.addView(imageView);
        //设置图片的缩放
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        ImageLoader.getInstance().displayImage(getItem(position).getNoHttpsIcon(),imageView);
        return imageView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }
}

##imageloader的初始化

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DisplayImageOptions option = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .showImageOnFail(R.mipmap.ic_launcher)
                .showImageOnLoading(R.mipmap.ic_launcher)
                .showImageForEmptyUri(R.mipmap.ic_launcher)
               // .displayer(new CircleBitmapDisplayer())
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        ImageLoaderConfiguration build = new ImageLoaderConfiguration
                .Builder(this)
                //内存缓存
                //.memoryCache(new LruMemoryCache())
                //.memoryCacheSize()
                .memoryCacheSizePercentage(20)
                //磁盘缓存
                .diskCacheSize(50 * 1024 * 1024)
                //.diskCache(new UnlimitedDiskCache())
                //.diskCache(new LruDiskCache())
                //默认图片显示选项
                .defaultDisplayImageOptions(option)
                .build();
        ImageLoader.getInstance().init(build);
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }
}

##shape中设置小圆点 如果这里设置的是圆点选中状态 不选中时换颜色即可

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <size android:width="4dp" android:height="4dp"/>
    <solid android:color="@android:color/black"/>
</shape>

##dimen中设置远点的尺寸

<resources>
    <dimen name="dot_size">10dp</dimen>
</resources>
最终在 drawable中写selector 设置圆点状态

猜你喜欢

转载自blog.csdn.net/weixin_44022413/article/details/84978460