1. 程式人生 > >ViewPager輪播圖 Handler方式實現

ViewPager輪播圖 Handler方式實現

1.提取的基類BaseActivity

package com.example.viewpager_demo;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutResId());
        //初始化檢視
        initView();
        //載入資料
        initData();
    }
    protected abstract int getLayoutResId();
    //初始化檢視
    protected abstract void initView();
    //載入資料
    protected abstract void initData();


}

2.MainActivity主頁面

package com.example.viewpager_demo;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.TypedValue;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.Adaper.BunnerAdaper;
import com.example.Bean.BunnerBean;
import com.example.Util.NetUtils;

public class MainActivity extends BaseActivity {
    private String imageUrl = "https://api.tianapi.com/wxnew/?key=605fa0a929c8d8b116424df0510c6b2a&num=6&page=1";
    private ViewPager viewPager;
    private LinearLayout linearLayout;
    private TextView textView;
    private BunnerAdaper adaper;

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_main;
    }

    //初始化view
    @Override
    protected void initView() {
        viewPager = findViewById(R.id.v_pager);
        linearLayout = findViewById(R.id.L_layout);
        textView = findViewById(R.id.text);
        //建立介面卡
        adaper = new BunnerAdaper(this);
        //設定給介面卡
        viewPager.setAdapter(adaper);
        //滑動監聽
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            //快取的點
            private int index = -1;

            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                //改變textview
                textView.setText(adaper.getItem(i).getTitle());
                //改變當前點
                linearLayout.getChildAt(i % linearLayout.getChildCount()).setSelected(true);
                //還原原來的點
                if (index >= 0) {
                    linearLayout.getChildAt(index % linearLayout.getChildCount()).setSelected(false);
                }
                index = i;
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
    }

    //載入資料
    @Override
    protected void initData() {
        NetUtils.getInstance().getRequest(imageUrl, BunnerBean.class, new NetUtils.CallBack<BunnerBean>() {
            @Override
            public void onSuccess(BunnerBean o) {
                if (o == null || !o.isSuccess()) {
                    Toast.makeText(MainActivity.this, "請求錯誤", Toast.LENGTH_SHORT).show();
                    return;
                }
                adaper.setmList(o.getNewslist());
                //初始化小圓點的方法
                initDot(o.getNewslist().size());
                //切換到中間位置
                int center = adaper.getCount() / 2;
                center = center - center % o.getNewslist().size();
                viewPager.setCurrentItem(center);
                //開啟輪播
                startLooper();
            }
        });
    }

    //建立handler
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
            handler.sendEmptyMessageDelayed(0, 2000);
        }
    };

    //開啟輪播
    private void startLooper() {
        handler.removeCallbacksAndMessages(null);
        handler.sendEmptyMessageDelayed(0, 2000);
    }

    //初始化小圓點
    private void initDot(int size) {
        linearLayout.removeAllViews();
        for (int i = 0; i < size; i++) {
            ImageView imageView = new ImageView(this);
            imageView.setBackgroundResource(R.drawable.select_dot);
            //佈局引數 寬高包裹
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT
            );
            int marage = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5,
                    getResources().getDisplayMetrics());
            params.leftMargin = marage;
            params.rightMargin = marage;
            linearLayout.addView(imageView, params);
        }
    }
}

3.介面卡頁面

package com.example.Adaper;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.example.Bean.BunnerBean;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.List;

public class BunnerAdaper extends PagerAdapter {
    private List<BunnerBean.NewslistBean> mList;
    private Context mContext;

    public BunnerAdaper(Context mContext) {
        this.mContext = mContext;
        //出始化
        mList = new ArrayList<>();
    }
    public void setmList(List<BunnerBean.NewslistBean> lists){
        mList.clear();
        if(lists!=null){
            mList.addAll(lists);
        }
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return mList.size()>0?5000:0;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }
    public BunnerBean.NewslistBean getItem(int position){
        return mList.get(position%mList.size());
    }
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        ImageView imageView = new ImageView(mContext);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        container.addView(imageView);
        ImageLoader.getInstance().displayImage(getItem(position).getPicUrl(),imageView);
        return imageView;
    }

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

4.工具類

package com.example.Util;

import android.annotation.SuppressLint;
import android.os.AsyncTask;

import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class NetUtils {
    private static NetUtils instance;
    private Gson gson;
    public NetUtils() {
        gson = new Gson();
    }

    public static NetUtils getInstance() {
        if(instance == null){
            instance = new NetUtils();
        }
        return instance;
    }
    //執行一個網路請求返回string
    public String getRequest(String urlStr){
        String result = "";
        try {
            //定義url地址
            URL url = new URL(urlStr);
            //開啟連線
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            //設定請求格式
            urlConnection.setRequestMethod("GET");
            //設定超時
            urlConnection.setReadTimeout(5000);
            urlConnection.setConnectTimeout(5000);
            //獲取請求碼
            int responseCode = urlConnection.getResponseCode();
            if(responseCode == 200){
                result = stream2String(urlConnection.getInputStream());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
    //將位元組流轉換為字元流
    private String stream2String(InputStream inputStream) throws IOException {
        StringBuilder builder = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        for (String tmp = br.readLine();tmp!=null;tmp = br.readLine()){
            builder.append(tmp);
        }
        return builder.toString();
    }
    //執行一個網路請求返回bean
    public <E> E getRequest(String urlStr,Class clazz){
        return (E) gson.fromJson(getRequest(urlStr),clazz);
    }
    //定義介面
    public interface CallBack<E>{
        void onSuccess(E e);
    }
    //非同步 回撥請求
    @SuppressLint("StaticFieldLeak")
    public void getRequest(String urlStr, final Class clazz, final CallBack callBack){
        new AsyncTask<String,Void,Object>(){
            @Override
            protected Object doInBackground(String... strings) {
                return getRequest(strings[0],clazz);
            }

            @Override
            protected void onPostExecute(Object o) {
                callBack.onSuccess(o);
            }
        }.execute(urlStr);
    }
}

5.Bean類

package com.example.Bean;

import java.util.List;

public class BunnerBean {

    private int code;
    private String msg;
    private List<NewslistBean> newslist;
    private final int SUCCESS_CODE = 200;
    public boolean isSuccess(){
        return SUCCESS_CODE == code;
    }
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<NewslistBean> getNewslist() {
        return newslist;
    }

    public void setNewslist(List<NewslistBean> newslist) {
        this.newslist = newslist;
    }

    public static class NewslistBean {
        private String ctime;
        private String title;
        private String description;
        private String picUrl;
        private String url;

        public String getCtime() {
            return ctime;
        }

        public void setCtime(String ctime) {
            this.ctime = ctime;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getPicUrl() {
            return picUrl;
        }

        public void setPicUrl(String picUrl) {
            this.picUrl = picUrl;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

6.Application初始化圖片頁面

package com.example.Application;

import android.app.Application;
import android.graphics.Bitmap;

import com.example.viewpager_demo.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

public class App extends Application {
    @Override
    public void onCreate() {

        ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(this)
                .diskCacheSize(50*1024*1024)
                .memoryCacheSizePercentage(10)
                .defaultDisplayImageOptions(new DisplayImageOptions.Builder()
                        .cacheInMemory(true)
                        .cacheOnDisk(true)
                        .bitmapConfig(Bitmap.Config.RGB_565)
                        .showImageOnLoading(R.mipmap.ic_launcher)
                        .showImageForEmptyUri(R.mipmap.ic_launcher)
                        .showImageOnFail(R.mipmap.ic_launcher)
                        .build())
                .build());
        super.onCreate();
    }
}

7.佈局頁面

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <android.support.v4.view.ViewPager
        android:id="@+id/v_pager"
        android:layout_width="0dp"
        android:layout_height="200dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />
    <LinearLayout
        android:id="@+id/L_layout"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:orientation="horizontal"
        app:layout_constraintRight_toRightOf="@id/v_pager"
        app:layout_constraintBottom_toBottomOf="@id/v_pager"
        android:padding="8dp"
        />
   <TextView
        android:id="@+id/text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:maxLines="1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/L_layout"
        app:layout_constraintBottom_toBottomOf="@id/v_pager"
        android:ellipsize="end"
        />
</android.support.constraint.ConstraintLayout>

7.輪播圖小圓點

7.1預設圓點顏色
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    >
    <size
        android:width="8dp"
        android:height="8dp"
        />
    <solid
        android:color="#909090"
        />
</shape>

7.2選中圓點顏色
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    >
    <size
        android:width="8dp"
        android:height="8dp"
        />
    <solid
        android:color="#900000"
        />
</shape>

7.3select設定選中
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/shape_sel_dot" android:state_selected="true"></item>
    <item android:drawable="@drawable/shape_normal_dot" ></item>
</selector>