##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 设置圆点状态