Browse Source

2.5.2 release (#53)

* Add ROUND_RECT Indicator Style.

* Fix bug #48

* Fix bug
zhpanvip 5 years ago
parent
commit
6e6e76867e

+ 1 - 1
README.md

@@ -1,7 +1,7 @@
 # BannerViewPager
 
 [![License](https://img.shields.io/badge/License%20-Apache%202-337ab7.svg)](https://www.apache.org/licenses/LICENSE-2.0)
-[![MinSdk](https://img.shields.io/badge/API-16%2B-brightgreen.svg?style=flat)
+![MinSdk](https://img.shields.io/badge/API-16%2B-brightgreen.svg?style=flat)
 [![JitPack](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
 [ ![JCenter](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
 [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-BannerViewPager-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7961)

+ 1 - 1
app/src/main/java/com/example/zhpan/circleviewpager/adapter/AdapterFragmentPager.kt

@@ -27,7 +27,7 @@ class AdapterFragmentPager(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
     override fun instantiateItem(container: ViewGroup, position: Int): Any {
         val fragment = super.instantiateItem(container, position) as Fragment
-        fragmentList!!.put(position, fragment as BaseFragment)
+        fragmentList?.put(position, fragment as BaseFragment)
         return fragment
     }
 

+ 2 - 1
app/src/main/java/com/example/zhpan/circleviewpager/fragment/BaseFragment.kt

@@ -8,6 +8,7 @@ import android.view.ViewGroup
 
 import androidx.annotation.ColorInt
 import androidx.annotation.ColorRes
+import androidx.core.content.ContextCompat
 
 import com.trello.rxlifecycle2.components.support.RxFragment
 
@@ -50,7 +51,7 @@ abstract class BaseFragment : RxFragment() {
 
     @ColorInt
     protected fun getColor(@ColorRes colorRes: Int): Int {
-        return context!!.resources.getColor(colorRes)
+        return ContextCompat.getColor(context!!,colorRes)
     }
 
     /**

+ 9 - 8
app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java

@@ -109,18 +109,19 @@ public class HomeFragment extends BaseFragment {
         mBannerViewPager
                 .setAutoPlay(true)
                 .setInterval(5000)
-                .setRevealWidth(BannerUtils.dp2px(10))
+                .setScrollDuration(1200)
+//                .setRevealWidth(BannerUtils.dp2px(10))
                 .setPageMargin(BannerUtils.dp2px(10))
-                .setPageStyle(PageStyle.MULTI_PAGE_OVERLAP)
+                .setPageStyle(PageStyle.MULTI_PAGE)
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setHolderCreator(NetViewHolder::new)
-                .setIndicatorMargin(0,0,0, (int) getResources().getDimension(R.dimen.dp_18))
-                .setOnPageClickListener(position -> {
-                    BannerData bannerData = mBannerViewPager.getList().get(position);
-                    Toast.makeText(getMContext(),
-                            "点击了position:" + position + " " + bannerData.getTitle(), Toast.LENGTH_SHORT).show();
+                .setIndicatorMargin(0, 0, 0, (int) getResources().getDimension(R.dimen.dp_18))
+                .setOnPageClickListener(this::onPageClicked);
+    }
 
-                });
+    private void onPageClicked(int position) {
+        BannerData bannerData = mBannerViewPager.getList().get(position);
+        Toast.makeText(getMContext(), "position:" + position + " " + bannerData.getTitle(), Toast.LENGTH_SHORT).show();
     }
 
     private View getHeaderView() {

+ 1 - 0
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java

@@ -52,6 +52,7 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
         view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
         mViewPager.setIndicatorGap(BannerUtils.dp2px(6))
                 .setRoundCorner(BannerUtils.dp2px(6))
+                .setOnPageClickListener(position -> ToastUtils.show("Position:" + position))
                 .setIndicatorColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setHolderCreator(() -> new ImageResourceViewHolder(0));
         initRadioGroup();

+ 1 - 1
app/src/main/res/layout/fragment_others.xml

@@ -27,7 +27,7 @@
         android:layout_below="@id/indicator_view"
         android:layout_marginStart="10dp"
         android:layout_marginTop="10dp"
-        android:text="@string/text_indicator_style"
+        android:text="@string/custom_style"
         android:textColor="#000000"
         android:textSize="18sp"
         android:textStyle="bold" />

+ 2 - 4
app/src/main/res/values/strings.xml

@@ -9,10 +9,8 @@
     <string name="tab1">Home</string>
     <string name="tab2">Page</string>
     <string name="tab3">Indicator</string>
+    <string name="tab4">Others</string>
     <string name="text_page_style">Page Style:</string>
     <string name="text_indicator_style">Indicator Style:</string>
-
-    <!-- TODO: Remove or change this placeholder text -->
-    <string name="hello_blank_fragment">Hello blank fragment</string>
-    <string name="tab4">Others</string>
+    <string name="custom_style">Custom Style</string>
 </resources>

+ 76 - 44
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -38,7 +38,6 @@ import com.zhpan.bannerview.provider.ViewStyleSetter;
 import com.zhpan.bannerview.transform.PageTransformerFactory;
 import com.zhpan.bannerview.view.CatchViewPager;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import static com.zhpan.bannerview.adapter.BannerPagerAdapter.MAX_VALUE;
@@ -66,8 +65,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private CatchViewPager mViewPager;
 
-    private List<T> mList;
-
     private BannerManager mBannerManager;
 
     private HolderCreator<VH> holderCreator;
@@ -99,7 +96,6 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         inflate(getContext(), R.layout.layout_banner_view_pager, this);
         mViewPager = findViewById(R.id.vp_main);
         mIndicatorLayout = findViewById(R.id.rl_indicator);
-        mList = new ArrayList<>();
     }
 
     @Override
@@ -138,11 +134,12 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
     @Override
     public void onPageSelected(int position) {
         // Optimized For Issue #42
-        if (mList.size() > 0 && isCanLoop() && position == 0) {
-            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
-            setCurrentItem(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()));
+        int size = mBannerPagerAdapter.getListSize();
+        if (size > 0 && isCanLoop() && position == 0) {
+            position = MAX_VALUE / 2 - ((MAX_VALUE / 2) % size) + 1;
+            setCurrentItem(0, false);
         }
-        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, mList.size());
+        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
         if (mOnPageChangeListener != null)
             mOnPageChangeListener.onPageSelected(currentPosition);
         if (mIndicatorView != null) {
@@ -162,17 +159,20 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     @Override
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
+        int listSize = mBannerPagerAdapter.getListSize();
+        if (listSize > 0) {
+            if (mOnPageChangeListener != null) {
+                mOnPageChangeListener.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
+                        positionOffset, positionOffsetPixels);
+            }
+            if (mIndicatorView != null)
+                mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, listSize),
+                        positionOffset, positionOffsetPixels);
         }
-        if (mIndicatorView != null)
-            mIndicatorView.onPageScrolled(BannerUtils.getRealPosition(isCanLoop(), position, mList.size()),
-                    positionOffset, positionOffsetPixels);
     }
 
     private void handlePosition() {
-        if (mList.size() > 1) {
+        if (mBannerPagerAdapter.getListSize() > 1) {
             currentPosition = mViewPager.getCurrentItem() + 1;
             mViewPager.setCurrentItem(currentPosition);
             mHandler.postDelayed(mRunnable, getInterval());
@@ -181,26 +181,26 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
 
     private void initBannerData(List<T> list) {
         if (list != null) {
-            initList(list);
-            setupViewPager();
+            setIndicatorValues(list);
+            setupViewPager(list);
             initRoundCorner();
         }
     }
 
-    private void initList(List<T> list) {
-        mList.clear();
-        mList.addAll(list);
-        if (mList.size() > 1) {
-            setIndicatorValues();
-        } else if (mIndicatorView != null) {
-            mIndicatorView.setPageSize(mList.size());
-        }
-        if (mList.size() > 0 && isCanLoop()) {
-            currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1;
-        }
-    }
-
-    private void setIndicatorValues() {
+//    private void initList(List<T> list) {
+//        mList.clear();
+//        mList.addAll(list);
+//        mIndicatorView.setPageSize(mList.size());
+//        if (mList.size() > 1) {
+//            setIndicatorValues();
+//        } else if (mIndicatorView != null) {
+//            mIndicatorView.setPageSize(mList.size());
+//        }
+//        setIndicatorValues(list);
+//
+//    }
+
+    private void setIndicatorValues(List<T> list) {
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
         if (isCustomIndicator && null != mIndicatorView) {
             initIndicator(mIndicatorView);
@@ -208,7 +208,7 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
             initIndicator(new IndicatorView(getContext()));
         }
         mIndicatorView.setIndicatorOptions(bannerOptions.getIndicatorOptions());
-        mIndicatorView.setPageSize(mList.size());
+        mIndicatorView.setPageSize(list.size());
     }
 
     private void initIndicator(IIndicator indicatorView) {
@@ -258,10 +258,13 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    private void setupViewPager() {
+    private void setupViewPager(List<T> list) {
         if (holderCreator != null) {
+            if (list.size() > 0 && isCanLoop()) {
+                currentPosition = MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1;
+            }
             removeAllViews();
-            mViewPager.setAdapter(getPagerAdapter());
+            mViewPager.setAdapter(getPagerAdapter(list));
             mViewPager.setCurrentItem(currentPosition);
             mViewPager.removeOnPageChangeListener(this);
             mViewPager.addOnPageChangeListener(this);
@@ -279,16 +282,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         }
     }
 
-    private PagerAdapter getPagerAdapter() {
-        BannerPagerAdapter<T, VH> bannerPagerAdapter =
-                new BannerPagerAdapter<>(mList, holderCreator);
-        bannerPagerAdapter.setCanLoop(isCanLoop());
-        bannerPagerAdapter.setPageClickListener(position -> {
+    private BannerPagerAdapter<T, VH> mBannerPagerAdapter;
+
+    private PagerAdapter getPagerAdapter(List<T> list) {
+        mBannerPagerAdapter =
+                new BannerPagerAdapter<>(list, holderCreator);
+        mBannerPagerAdapter.setCanLoop(isCanLoop());
+        mBannerPagerAdapter.setPageClickListener(position -> {
             if (mOnPageClickListener != null) {
                 mOnPageClickListener.onPageClick(position);
             }
         });
-        return bannerPagerAdapter;
+        return mBannerPagerAdapter;
     }
 
     private void initPageStyle() {
@@ -341,14 +346,15 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @return BannerViewPager数据集合
      */
     public List<T> getList() {
-        return mList;
+        return mBannerPagerAdapter.getList();
     }
 
     /**
      * 开启轮播
      */
     public void startLoop() {
-        if (!isLooping() && isAutoPlay() && mList.size() > 1) {
+        if (!isLooping() && isAutoPlay() && mBannerPagerAdapter != null &&
+                mBannerPagerAdapter.getListSize() > 1) {
             mHandler.postDelayed(mRunnable, getInterval());
             setLooping(true);
         }
@@ -608,6 +614,18 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
         initBannerData(list);
     }
 
+//    public void update(List<T> list) {
+//        if (null != list) {
+//            if (mBannerPagerAdapter != null && mBannerManager.bannerOptions().getPageStyle() == PageStyle.NORMAL) {
+//                mBannerPagerAdapter.setList(list);
+//                mIndicatorView.setPageSize(list.size());
+////                setCurrentItem(0, false);
+//            } else {
+//                initBannerData(list);
+//            }
+//        }
+//    }
+
     /**
      * @return the currently selected page position.
      */
@@ -623,7 +641,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param item Item index to select
      */
     public void setCurrentItem(int item) {
-        mViewPager.setCurrentItem(isCanLoop() ? MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1 + item : item);
+        if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
+            removeAllViews();
+            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item);
+            addView(mViewPager);
+            addView(mIndicatorLayout);
+        } else {
+            mViewPager.setCurrentItem(item);
+        }
     }
 
     /**
@@ -633,7 +658,14 @@ public class BannerViewPager<T, VH extends ViewHolder> extends RelativeLayout im
      * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
      */
     public void setCurrentItem(int item, boolean smoothScroll) {
-        mViewPager.setCurrentItem(isCanLoop() ? MAX_VALUE / 2 - ((MAX_VALUE / 2) % mList.size()) + 1 + item : item, smoothScroll);
+        if (isCanLoop() && mBannerPagerAdapter.getListSize() > 1) {
+            removeAllViews();
+            mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % mBannerPagerAdapter.getListSize()) + 1 + item, smoothScroll);
+            addView(mViewPager);
+            addView(mIndicatorLayout);
+        } else {
+            mViewPager.setCurrentItem(item, smoothScroll);
+        }
     }
 
     /**

+ 23 - 1
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -32,7 +32,8 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     public static final int MAX_VALUE = Integer.MAX_VALUE;
 
     public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
-        this.mList = list;
+        mList = new ArrayList<>();
+        mList.addAll(list);
         this.holderCreator = holderCreator;
     }
 
@@ -58,6 +59,11 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
         return itemView;
     }
 
+//    @Override
+//    public int getItemPosition(@NonNull Object object) {
+//        return POSITION_NONE;
+//    }
+
     private View findViewByPosition(ViewGroup container, int position) {
         for (View view : mViewList) {
             if (((int) view.getTag()) == position && view.getParent() == null) {
@@ -119,4 +125,20 @@ public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
     public interface PageClickListener {
         void onPageClick(int position);
     }
+
+//    public void setList(List<T> list) {
+//        mList.clear();
+//        notifyDataSetChanged();
+//        mList.addAll(list);
+//        notifyDataSetChanged();
+//        mViewList.clear();
+//    }
+
+    public List<T> getList() {
+        return mList;
+    }
+
+    public int getListSize() {
+        return mList.size();
+    }
 }

+ 12 - 6
bannerview/src/main/java/com/zhpan/bannerview/indicator/IndicatorView.java

@@ -36,6 +36,12 @@ public class IndicatorView extends BaseIndicatorView implements IIndicator {
         mDrawerProxy = new DrawerProxy(getIndicatorOptions());
     }
 
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+        mDrawerProxy.onLayout(changed,left,top,right,bottom);
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
@@ -43,15 +49,15 @@ public class IndicatorView extends BaseIndicatorView implements IIndicator {
         setMeasuredDimension(measureResult.getMeasureWidth(), measureResult.getMeasureHeight());
     }
 
-    @Override
-    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
-        super.setIndicatorOptions(indicatorOptions);
-        mDrawerProxy.setIndicatorOptions(indicatorOptions);
-    }
-
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         mDrawerProxy.onDraw(canvas);
     }
+
+    @Override
+    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
+        super.setIndicatorOptions(indicatorOptions);
+        mDrawerProxy.setIndicatorOptions(indicatorOptions);
+    }
 }

+ 5 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/BaseDrawer.java

@@ -25,6 +25,11 @@ public abstract class BaseDrawer implements IDrawer {
         mMeasureResult = new MeasureResult();
     }
 
+    @Override
+    public void onLayout(boolean changed, int left, int top, int right, int bottom) {
+
+    }
+
     public class MeasureResult {
 
         int measureWidth;

+ 7 - 2
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/DrawerProxy.java

@@ -25,8 +25,9 @@ public class DrawerProxy implements IDrawer {
         mIDrawer = DrawerFactory.createDrawer(indicatorOptions);
     }
 
-    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
-        init(indicatorOptions);
+    @Override
+    public void onLayout(boolean changed, int left, int top, int right, int bottom) {
+
     }
 
     @Override
@@ -38,4 +39,8 @@ public class DrawerProxy implements IDrawer {
     public void onDraw(Canvas canvas) {
         mIDrawer.onDraw(canvas);
     }
+
+    public void setIndicatorOptions(IndicatorOptions indicatorOptions) {
+        init(indicatorOptions);
+    }
 }

+ 2 - 0
bannerview/src/main/java/com/zhpan/bannerview/indicator/drawer/IDrawer.java

@@ -12,6 +12,8 @@ import com.zhpan.bannerview.manager.IndicatorOptions;
  */
 public interface IDrawer {
 
+    void onLayout(boolean changed, int left, int top, int right, int bottom);
+
     BaseDrawer.MeasureResult onMeasure(int widthMeasureSpec, int heightMeasureSpec);
 
     void onDraw(Canvas canvas);

BIN
download/app.apk