瀏覽代碼

Merge pull request #178 from Dboy233/master

Add BaseBannerQuickAdapter
zhpanvip 4 年之前
父節點
當前提交
fe5f804745

+ 7 - 0
app/build.gradle

@@ -30,6 +30,13 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+
+    viewBinding {
+        enabled = true
+    }
+    dataBinding {
+        enabled = true
+    }
 }
 
 repositories {

+ 3 - 3
app/src/main/java/com/example/zhpan/banner/activity/WelcomeActivity.kt

@@ -22,7 +22,7 @@ import java.util.*
 
 class WelcomeActivity : BaseDataActivity() {
 
-    private lateinit var mViewPager: BannerViewPager<CustomBean, CustomPageViewHolder>
+    private lateinit var mViewPager: BannerViewPager<CustomBean>
 
     private val des = arrayOf("在这里\n你可以听到周围人的心声", "在这里\nTA会在下一秒遇见你", "在这里\n不再错过可以改变你一生的人")
 
@@ -62,9 +62,9 @@ class WelcomeActivity : BaseDataActivity() {
                     updateUI(position)
                 }
             })
-            adapter = WelcomeAdapter().apply {
+            setAdapter(WelcomeAdapter().apply {
                 mOnSubViewClickListener = CustomPageViewHolder.OnSubViewClickListener { _, position -> ToastUtils.showShort("Logo Clicked,position:$position") }
-            }
+            })
             setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
                     ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
         }.create(data)

+ 2 - 2
app/src/main/java/com/example/zhpan/banner/adapter/ArticleAdapter.kt

@@ -44,7 +44,7 @@ class ArticleAdapter(val context: Context, data: List<ArticleWrapper.Article>) :
                     .setIndicatorSliderColor(holder.resources.getColor(R.color.red_normal_color), holder.resources.getColor(R.color.red_checked_color))
                     .setOrientation(ViewPager2.ORIENTATION_VERTICAL)
                     .setInterval(2000)
-                    .setAdapter(ImageResourceAdapter(0)).create(article.pagers)
+                    .setAdapter(SimpleBannerAdapter(0)).create(article.pagers)
         } else if (holder is ArticleViewHolder) {
             holder.tvAuthor.text = article.author
             holder.tvTitle.text = article.title
@@ -72,7 +72,7 @@ class ArticleAdapter(val context: Context, data: List<ArticleWrapper.Article>) :
     }
 
     inner class BannerItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-        var bannerViewPager: BannerViewPager<Int, ImageResourceViewHolder> = itemView.findViewById(R.id.banner_view3)
+        var bannerViewPager: BannerViewPager<Int> = itemView.findViewById(R.id.banner_view3)
         var resources: Resources = itemView.context.resources
 
         init {

+ 156 - 0
app/src/main/java/com/example/zhpan/banner/adapter/SimpleBannerAdapter.java

@@ -0,0 +1,156 @@
+package com.example.zhpan.banner.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.databinding.DataBindingUtil;
+
+import com.example.zhpan.banner.R;
+import com.example.zhpan.banner.databinding.ItemSlideModeBinding;
+import com.example.zhpan.banner.databinding.ItemSlideModelDataBindingBinding;
+import com.example.zhpan.banner.view.CornerImageView;
+import com.zhpan.bannerview.BaseBannerQuickAdapter;
+import com.zhpan.bannerview.BaseBannerViewHolder;
+
+/**
+ * @author DBoy
+ * @date 2020/12/11
+ * Class 描述 : 简单Adapter示例:
+ * 这个adapter使用四种方式进行适配数据,主要是简化了 adapter的构建繁琐的问题。
+ * <p>
+ * 主要使用方式 继承BaseBannerQuickAdapter<T> 泛型为数据类
+ * 实现 {@link #convert(BaseBannerViewHolder, Integer, int, int)} 方法进行数据填充适配
+ * <p>
+ * 重写{@link #getLayoutId(int)} 设置布局
+ * 或者 可以重写{@link #createBindingView(Context, ViewGroup, int)} 使用其他方式:
+ * <p>
+ * ==== 其他方式 ====
+ * 可以使用ViewBinding填充数据;
+ * 可以使用DataBinding填充数据;
+ * 修改{@link SimpleBannerAdapter#type} 的值进行预览效果;
+ * {@link #Use_LayoutId}
+ * {@link #Use_ViewBinding}
+ * {@link #Use_DataBinding}
+ * {@link #Use_fool}
+ */
+public class SimpleBannerAdapter extends BaseBannerQuickAdapter<Integer> {
+
+    /**
+     * 使用布局
+     */
+    private final int Use_LayoutId = 0;
+
+    /**
+     * 使用ViewBinding
+     */
+    private final int Use_ViewBinding = 1;
+
+    /**
+     * 使用DataBinding
+     */
+    private final int Use_DataBinding = 2;
+    /**
+     * 自己构建view
+     */
+    private final int Use_fool = 3;
+
+    /**
+     * 示例使用方式
+     */
+    private final int type = Use_ViewBinding;
+    //圆角
+    private final int mRoundCorner;
+    //示例使用ViewBinding
+    private ItemSlideModeBinding mItemViewBinding;
+    //示例使用DataBinding
+    private ItemSlideModelDataBindingBinding mItemViewDataBinding;
+
+    public SimpleBannerAdapter(int roundCorner) {
+        mRoundCorner = roundCorner;
+    }
+
+    @Override
+    protected void convert(BaseBannerViewHolder<Integer> holder, Integer data, int position, int pageSize) {
+        switch (type) {
+            case Use_LayoutId:
+                convertLayoutId(holder, data, position, pageSize);
+                break;
+            case Use_ViewBinding:
+                convertViewBinding(data, position, pageSize);
+                break;
+            case Use_DataBinding:
+                convertDataBinding(data, position, pageSize);
+                break;
+            case Use_fool:
+                convertLayoutId(holder, data, position, pageSize);
+                break;
+        }
+
+    }
+
+    @Override
+    protected View createBindingView(Context context, ViewGroup parent, int viewType) {
+        switch (type) {
+            case Use_fool:
+                //这我就不说了
+                CornerImageView cornerImageView = new CornerImageView(context);
+                cornerImageView.setId(R.id.banner_image);
+                cornerImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+                ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+                cornerImageView.setLayoutParams(params);
+                return cornerImageView;
+            case Use_ViewBinding:
+                //使用ViewBinding创建View
+                mItemViewBinding = ItemSlideModeBinding.inflate(LayoutInflater.from(context), parent, false);
+                return mItemViewBinding.getRoot();
+            case Use_DataBinding:
+                //使用DataBinding创建View
+                mItemViewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_slide_model_data_binding, parent, false);
+                return mItemViewDataBinding.getRoot();
+            default:
+                //  LayoutId 返回了确切的布局id 是不执行 createBindingView的
+                return null;
+        }
+
+    }
+
+    @Override
+    public int getLayoutId(int viewType) {
+        if (type == Use_LayoutId) {
+            return R.layout.item_slide_mode;
+        } else {
+            return super.getLayoutId(viewType);
+        }
+    }
+
+    /**
+     * 使用布局id填充数据
+     */
+    private void convertLayoutId(BaseBannerViewHolder<Integer> holder, Integer data, int position, int pageSize) {
+        CornerImageView imageView = holder.findView(R.id.banner_image);
+        imageView.setRoundCorner(mRoundCorner);
+        imageView.setImageResource(data);
+    }
+
+    /**
+     * 使用ViewBinding填充数据
+     */
+    private void convertViewBinding(Integer data, int position, int pageSize) {
+        mItemViewBinding.bannerImage.setRoundCorner(mRoundCorner);
+        mItemViewBinding.bannerImage.setImageResource(data);
+    }
+
+    /**
+     * 使用DataBinding填充数据
+     */
+    private void convertDataBinding(Integer data, int position, int pageSize) {
+        mItemViewDataBinding.bannerImage.setRoundCorner(mRoundCorner);
+        mItemViewDataBinding.bannerImage.setImageResource(data);
+    }
+
+
+}
+

+ 5 - 8
app/src/main/java/com/example/zhpan/banner/fragment/HomeFragment.java

@@ -16,21 +16,19 @@ import com.example.zhpan.banner.R;
 import com.example.zhpan.banner.activity.WebViewActivity;
 import com.example.zhpan.banner.adapter.ArticleAdapter;
 import com.example.zhpan.banner.adapter.HomeAdapter;
-import com.example.zhpan.banner.adapter.ImageResourceAdapter;
+import com.example.zhpan.banner.adapter.SimpleBannerAdapter;
 import com.example.zhpan.banner.bean.ArticleWrapper;
 import com.example.zhpan.banner.bean.DataWrapper;
 import com.example.zhpan.banner.net.BannerData;
 import com.example.zhpan.banner.net.RetrofitGnerator;
 import com.example.zhpan.banner.net.RxUtil;
+import com.example.zhpan.banner.net.common.ResponseObserver;
 import com.example.zhpan.banner.recyclerview.ui.CustomRecyclerView;
-import com.example.zhpan.banner.viewholder.ImageResourceViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.BaseViewHolder;
 import com.zhpan.bannerview.constants.IndicatorGravity;
 import com.zhpan.bannerview.utils.BannerUtils;
-import com.example.zhpan.banner.net.common.ResponseObserver;
 import com.zhpan.indicator.IndicatorView;
 import com.zhpan.indicator.enums.IndicatorSlideMode;
 import com.zhpan.indicator.enums.IndicatorStyle;
@@ -38,7 +36,6 @@ import com.zhpan.indicator.enums.IndicatorStyle;
 import java.util.ArrayList;
 import java.util.List;
 
-
 import io.reactivex.Observable;
 import io.reactivex.schedulers.Schedulers;
 
@@ -49,8 +46,8 @@ import static com.example.zhpan.banner.net.BannerData.TYPE_NEW;
  */
 public class HomeFragment extends BaseFragment {
 
-    private BannerViewPager<BannerData, BaseViewHolder<BannerData>> mViewPagerHorizontal;
-    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPagerVertical;
+    private BannerViewPager<BannerData> mViewPagerHorizontal;
+    private BannerViewPager<Integer> mViewPagerVertical;
     private CustomRecyclerView recyclerView;
     private ArticleAdapter articleAdapter;
     private SmartRefreshLayout mSmartRefreshLayout;
@@ -195,7 +192,7 @@ public class HomeFragment extends BaseFragment {
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color))
                 .setOrientation(ViewPager2.ORIENTATION_VERTICAL)
                 .setInterval(2000)
-                .setAdapter(new ImageResourceAdapter(0)).create(getPicList(4));
+                .setAdapter(new SimpleBannerAdapter(0)).create(getPicList(4));
     }
 
     private void onPageClicked(View clickedView,int position) {

+ 1 - 1
app/src/main/java/com/example/zhpan/banner/fragment/IndicatorFragment.java

@@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull;
  */
 public class IndicatorFragment extends BaseFragment {
 
-    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    private BannerViewPager<Integer> mViewPager;
     private RadioGroup mRadioGroupStyle;
     private RadioGroup mRadioGroupMode;
     private RadioButton radioButton;

+ 3 - 4
app/src/main/java/com/example/zhpan/banner/fragment/OthersFragment.java

@@ -11,9 +11,8 @@ import androidx.annotation.NonNull;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ToastUtils;
 import com.example.zhpan.banner.R;
-import com.example.zhpan.banner.adapter.ImageResourceAdapter;
+import com.example.zhpan.banner.adapter.SimpleBannerAdapter;
 import com.example.zhpan.banner.view.FigureIndicatorView;
-import com.example.zhpan.banner.viewholder.ImageResourceViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
@@ -31,7 +30,7 @@ import java.util.Random;
  */
 public class OthersFragment extends BaseFragment implements View.OnClickListener {
 
-    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    private BannerViewPager<Integer> mViewPager;
     private RadioGroup radioGroupStyle;
     private RadioButton radioButton;
     private IndicatorView mIndicatorView;
@@ -80,7 +79,7 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
                     int currentItem = mViewPager.getCurrentItem();
                     LogUtils.e("currentItem:", currentItem + "");
                 })
-                .setAdapter(new ImageResourceAdapter(0))
+                .setAdapter(new SimpleBannerAdapter(0))
                 .setOnPageClickListener((clickedView, position) -> ToastUtils.showShort("Position:" + position))
                 .setIndicatorSliderColor(getColor(R.color.red_normal_color), getColor(R.color.red_checked_color)).create();
         initRadioGroup();

+ 3 - 4
app/src/main/java/com/example/zhpan/banner/fragment/PageFragment.java

@@ -6,8 +6,7 @@ import android.widget.RadioGroup;
 
 import com.blankj.utilcode.util.ToastUtils;
 import com.example.zhpan.banner.R;
-import com.example.zhpan.banner.adapter.ImageResourceAdapter;
-import com.example.zhpan.banner.viewholder.ImageResourceViewHolder;
+import com.example.zhpan.banner.adapter.SimpleBannerAdapter;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.annotation.APageStyle;
 import com.zhpan.bannerview.constants.PageStyle;
@@ -18,7 +17,7 @@ import com.zhpan.indicator.enums.IndicatorSlideMode;
  * Created by zhpan on 2018/7/24.
  */
 public class PageFragment extends BaseFragment {
-    private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
+    private BannerViewPager<Integer> mViewPager;
     private RadioGroup mRadioGroupPageStyle;
 
     @Override
@@ -46,7 +45,7 @@ public class PageFragment extends BaseFragment {
                 .setIndicatorSliderRadius(getResources().getDimensionPixelOffset(R.dimen.dp_4), getResources().getDimensionPixelOffset(R.dimen.dp_5))
                 .setLifecycleRegistry(getLifecycle())
                 .setOnPageClickListener(this::pageClick)
-                .setAdapter(new ImageResourceAdapter(getResources().getDimensionPixelOffset(R.dimen.dp_8)))
+                .setAdapter(new SimpleBannerAdapter(getResources().getDimensionPixelOffset(R.dimen.dp_8)))
                 .setInterval(5000);
         initRadioGroup();
         view.findViewById(R.id.rb_multi_page_overlap).performClick();

+ 20 - 0
app/src/main/res/layout/item_slide_model_data_binding.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <data>
+
+    </data>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <com.example.zhpan.banner.view.CornerImageView
+            android:id="@+id/banner_image"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:contentDescription="@string/image_description"
+            android:scaleType="centerCrop" />
+
+    </RelativeLayout>
+</layout>

+ 51 - 53
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -4,6 +4,11 @@ import android.content.Context;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.RelativeLayout;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
@@ -14,13 +19,6 @@ import androidx.lifecycle.OnLifecycleEvent;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewpager2.widget.ViewPager2;
 
-import android.os.Parcelable;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.RelativeLayout;
-
 import com.zhpan.bannerview.annotation.AIndicatorGravity;
 import com.zhpan.bannerview.annotation.APageStyle;
 import com.zhpan.bannerview.annotation.Visibility;
@@ -28,8 +26,8 @@ import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
 import com.zhpan.bannerview.provider.ScrollDurationManger;
-import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.bannerview.provider.ViewStyleSetter;
+import com.zhpan.bannerview.utils.BannerUtils;
 import com.zhpan.indicator.IndicatorView;
 import com.zhpan.indicator.annotation.AIndicatorSlideMode;
 import com.zhpan.indicator.annotation.AIndicatorStyle;
@@ -51,7 +49,7 @@ import static com.zhpan.bannerview.utils.BannerUtils.getOriginalPosition;
  * Created by zhpan on 2017/3/28.
  */
 @SuppressWarnings({"unused", "UnusedReturnValue"})
-public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLayout implements LifecycleObserver {
+public class BannerViewPager<T> extends RelativeLayout implements LifecycleObserver {
 
     private int currentPosition;
 
@@ -71,7 +69,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
 
     private final Handler mHandler = new Handler();
 
-    private BaseBannerAdapter<T, VH> mBannerPagerAdapter;
+    private BaseBannerAdapter<T, BaseViewHolder<T>> mBannerPagerAdapter;
 
     private ViewPager2.OnPageChangeCallback onPageChangeCallback;
 
@@ -311,8 +309,8 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     }
 
     private void initIndicatorGravity() {
-        RelativeLayout.LayoutParams layoutParams =
-                (RelativeLayout.LayoutParams) ((View) mIndicatorView).getLayoutParams();
+        LayoutParams layoutParams =
+                (LayoutParams) ((View) mIndicatorView).getLayoutParams();
         switch (mBannerManager.getBannerOptions().getIndicatorGravity()) {
             case CENTER:
                 layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
@@ -329,7 +327,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     }
 
     private void initIndicatorSliderMargin() {
-        ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) mIndicatorView).getLayoutParams();
+        MarginLayoutParams layoutParams = (MarginLayoutParams) ((View) mIndicatorView).getLayoutParams();
         BannerOptions.IndicatorMargin indicatorMargin = mBannerManager.getBannerOptions().getIndicatorMargin();
         if (indicatorMargin == null) {
             int dp10 = BannerUtils.dp2px(10);
@@ -482,13 +480,13 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         }
     }
 
-    public BannerViewPager<T, VH> setAdapter(BaseBannerAdapter<T, VH> adapter) {
-        this.mBannerPagerAdapter = adapter;
+    public <VH extends BaseViewHolder<T>> BannerViewPager<T> setAdapter(BaseBannerAdapter<T, VH> adapter) {
+        this.mBannerPagerAdapter = (BaseBannerAdapter<T, BaseViewHolder<T>>) adapter;
         return this;
     }
 
-    public BaseBannerAdapter<T, VH> getAdapter() {
-        return mBannerPagerAdapter;
+    public <VH extends BaseViewHolder<T>> BaseBannerAdapter<T,VH> getAdapter() {
+        return (BaseBannerAdapter<T, VH>) mBannerPagerAdapter;
     }
 
     /**
@@ -498,7 +496,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param radius round radius
      */
-    public BannerViewPager<T, VH> setRoundCorner(int radius) {
+    public <VH extends BaseViewHolder<T>> BannerViewPager<T> setRoundCorner(int radius) {
         mBannerManager.getBannerOptions().setRoundRectRadius(radius);
         return this;
     }
@@ -510,7 +508,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param radius round radius
      */
-    public BannerViewPager<T, VH> setRoundRect(int radius) {
+    public BannerViewPager<T> setRoundRect(int radius) {
         setRoundCorner(radius);
         return this;
     }
@@ -520,7 +518,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param autoPlay is enable auto play
      */
-    public BannerViewPager<T, VH> setAutoPlay(boolean autoPlay) {
+    public BannerViewPager<T> setAutoPlay(boolean autoPlay) {
         mBannerManager.getBannerOptions().setAutoPlay(autoPlay);
         if (isAutoPlay()) {
             mBannerManager.getBannerOptions().setCanLoop(true);
@@ -533,7 +531,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param canLoop is can loop
      */
-    public BannerViewPager<T, VH> setCanLoop(boolean canLoop) {
+    public BannerViewPager<T> setCanLoop(boolean canLoop) {
         mBannerManager.getBannerOptions().setCanLoop(canLoop);
         if (!canLoop) {
             mBannerManager.getBannerOptions().setAutoPlay(false);
@@ -546,7 +544,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param interval loop interval,unit is millisecond.
      */
-    public BannerViewPager<T, VH> setInterval(int interval) {
+    public BannerViewPager<T> setInterval(int interval) {
         mBannerManager.getBannerOptions().setInterval(interval);
         return this;
     }
@@ -554,7 +552,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * @param transformer PageTransformer that will modify each page's animation properties
      */
-    public BannerViewPager<T, VH> setPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
+    public BannerViewPager<T> setPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
         if (transformer != null) {
             mViewPager.setPageTransformer(transformer);
         }
@@ -564,7 +562,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * @param transformer PageTransformer that will modify each page's animation properties
      */
-    public BannerViewPager<T, VH> addPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
+    public BannerViewPager<T> addPageTransformer(@Nullable ViewPager2.PageTransformer transformer) {
         if (transformer != null) {
             mBannerManager.addTransformer(transformer);
         }
@@ -590,7 +588,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param pageMargin page margin
      */
-    public BannerViewPager<T, VH> setPageMargin(int pageMargin) {
+    public BannerViewPager<T> setPageMargin(int pageMargin) {
         mBannerManager.setPageMargin(pageMargin);
         return this;
     }
@@ -600,7 +598,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param onPageClickListener item click listener
      */
-    public BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener onPageClickListener) {
+    public BannerViewPager<T> setOnPageClickListener(OnPageClickListener onPageClickListener) {
         this.mOnPageClickListener = onPageClickListener;
         return this;
     }
@@ -610,7 +608,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param scrollDuration page scroll duration
      */
-    public BannerViewPager<T, VH> setScrollDuration(int scrollDuration) {
+    public BannerViewPager<T> setScrollDuration(int scrollDuration) {
         mBannerManager.getBannerOptions().setScrollDuration(scrollDuration);
         return this;
     }
@@ -621,8 +619,8 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      * @param checkedColor checked color of indicator
      * @param normalColor  unchecked color of indicator
      */
-    public BannerViewPager<T, VH> setIndicatorSliderColor(@ColorInt int normalColor,
-                                                          @ColorInt int checkedColor) {
+    public BannerViewPager<T> setIndicatorSliderColor(@ColorInt int normalColor,
+                                                      @ColorInt int checkedColor) {
         mBannerManager.getBannerOptions().setIndicatorSliderColor(normalColor, checkedColor);
         return this;
     }
@@ -636,7 +634,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param radius 指示器圆点半径
      */
-    public BannerViewPager<T, VH> setIndicatorSliderRadius(int radius) {
+    public BannerViewPager<T> setIndicatorSliderRadius(int radius) {
         setIndicatorSliderRadius(radius, radius);
         return this;
     }
@@ -647,12 +645,12 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      * @param normalRadius  unchecked circle radius
      * @param checkedRadius checked circle radius
      */
-    public BannerViewPager<T, VH> setIndicatorSliderRadius(int normalRadius, int checkedRadius) {
+    public BannerViewPager<T> setIndicatorSliderRadius(int normalRadius, int checkedRadius) {
         mBannerManager.getBannerOptions().setIndicatorSliderWidth(normalRadius * 2, checkedRadius * 2);
         return this;
     }
 
-    public BannerViewPager<T, VH> setIndicatorSliderWidth(int indicatorWidth) {
+    public BannerViewPager<T> setIndicatorSliderWidth(int indicatorWidth) {
         setIndicatorSliderWidth(indicatorWidth, indicatorWidth);
         return this;
     }
@@ -668,12 +666,12 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *                    if the indicator style is {@link com.zhpan.indicator.enums.IndicatorStyle#ROUND_RECT} the params means checked round rectangle width
      *                    if the indicator style is {@link com.zhpan.indicator.enums.IndicatorStyle#CIRCLE } means checked circle diameter
      */
-    public BannerViewPager<T, VH> setIndicatorSliderWidth(int normalWidth, int checkWidth) {
+    public BannerViewPager<T> setIndicatorSliderWidth(int normalWidth, int checkWidth) {
         mBannerManager.getBannerOptions().setIndicatorSliderWidth(normalWidth, checkWidth);
         return this;
     }
 
-    public BannerViewPager<T, VH> setIndicatorHeight(int indicatorHeight) {
+    public BannerViewPager<T> setIndicatorHeight(int indicatorHeight) {
         mBannerManager.getBannerOptions().setIndicatorHeight(indicatorHeight);
         return this;
     }
@@ -683,7 +681,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param indicatorGap indicator gap
      */
-    public BannerViewPager<T, VH> setIndicatorSliderGap(int indicatorGap) {
+    public BannerViewPager<T> setIndicatorSliderGap(int indicatorGap) {
         mBannerManager.getBannerOptions().setIndicatorGap(indicatorGap);
         return this;
     }
@@ -693,7 +691,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param visibility One of {@link View#VISIBLE}, {@link View#INVISIBLE}, or {@link View#GONE}.
      */
-    public BannerViewPager<T, VH> setIndicatorVisibility(@Visibility int visibility) {
+    public BannerViewPager<T> setIndicatorVisibility(@Visibility int visibility) {
         mBannerManager.getBannerOptions().setIndicatorVisibility(visibility);
         return this;
     }
@@ -706,7 +704,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *                {@link com.zhpan.bannerview.constants.IndicatorGravity#START}
      *                {@link com.zhpan.bannerview.constants.IndicatorGravity#END}
      */
-    public BannerViewPager<T, VH> setIndicatorGravity(@AIndicatorGravity int gravity) {
+    public BannerViewPager<T> setIndicatorGravity(@AIndicatorGravity int gravity) {
         mBannerManager.getBannerOptions().setIndicatorGravity(gravity);
         return this;
     }
@@ -718,7 +716,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      * @see com.zhpan.indicator.enums.IndicatorSlideMode#NORMAL
      * @see com.zhpan.indicator.enums.IndicatorSlideMode#SMOOTH
      */
-    public BannerViewPager<T, VH> setIndicatorSlideMode(@AIndicatorSlideMode int slideMode) {
+    public BannerViewPager<T> setIndicatorSlideMode(@AIndicatorSlideMode int slideMode) {
         mBannerManager.getBannerOptions().setIndicatorSlideMode(slideMode);
         return this;
     }
@@ -729,7 +727,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param customIndicator custom indicator view
      */
-    public BannerViewPager<T, VH> setIndicatorView(IIndicator customIndicator) {
+    public BannerViewPager<T> setIndicatorView(IIndicator customIndicator) {
         if (customIndicator instanceof View) {
             isCustomIndicator = true;
             mIndicatorView = customIndicator;
@@ -745,7 +743,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      * @see com.zhpan.indicator.enums.IndicatorStyle#DASH
      * @see com.zhpan.indicator.enums.IndicatorStyle#ROUND_RECT
      */
-    public BannerViewPager<T, VH> setIndicatorStyle(@AIndicatorStyle int indicatorStyle) {
+    public BannerViewPager<T> setIndicatorStyle(@AIndicatorStyle int indicatorStyle) {
         mBannerManager.getBannerOptions().setIndicatorStyle(indicatorStyle);
         return this;
     }
@@ -774,10 +772,10 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * Sets the orientation of the ViewPager2.
      *
-     * @param orientation {@link androidx.viewpager2.widget.ViewPager2#ORIENTATION_HORIZONTAL} or
-     *                    {@link androidx.viewpager2.widget.ViewPager2#ORIENTATION_VERTICAL}
+     * @param orientation {@link ViewPager2#ORIENTATION_HORIZONTAL} or
+     *                    {@link ViewPager2#ORIENTATION_VERTICAL}
      */
-    public BannerViewPager<T, VH> setOrientation(@ViewPager2.Orientation int orientation) {
+    public BannerViewPager<T> setOrientation(@ViewPager2.Orientation int orientation) {
         mBannerManager.getBannerOptions().setOrientation(orientation);
         return this;
     }
@@ -928,11 +926,11 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @return BannerViewPager
      */
-    public BannerViewPager<T, VH> setPageStyle(@APageStyle int pageStyle) {
+    public BannerViewPager<T> setPageStyle(@APageStyle int pageStyle) {
         return setPageStyle(pageStyle, DEFAULT_MIN_SCALE);
     }
 
-    public BannerViewPager<T, VH> setPageStyle(@APageStyle int pageStyle, float pageScale) {
+    public BannerViewPager<T> setPageStyle(@APageStyle int pageStyle, float pageScale) {
         mBannerManager.getBannerOptions().setPageStyle(pageStyle);
         mBannerManager.getBannerOptions().setPageScale(pageScale);
         return this;
@@ -941,7 +939,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * @param revealWidth 一屏多页模式下两边页面显露出来的宽度
      */
-    public BannerViewPager<T, VH> setRevealWidth(int revealWidth) {
+    public BannerViewPager<T> setRevealWidth(int revealWidth) {
         setRevealWidth(revealWidth, revealWidth);
         return this;
     }
@@ -950,7 +948,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      * @param leftRevealWidth  left page item  reveal width
      * @param rightRevealWidth right page item reveal width
      */
-    public BannerViewPager<T, VH> setRevealWidth(int leftRevealWidth, int rightRevealWidth) {
+    public BannerViewPager<T> setRevealWidth(int leftRevealWidth, int rightRevealWidth) {
         mBannerManager.getBannerOptions().setRightRevealWidth(rightRevealWidth);
         mBannerManager.getBannerOptions().setLeftRevealWidth(leftRevealWidth);
         return this;
@@ -959,12 +957,12 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * Suggest to use default offScreenPageLimit.
      */
-    public BannerViewPager<T, VH> setOffScreenPageLimit(int offScreenPageLimit) {
+    public BannerViewPager<T> setOffScreenPageLimit(int offScreenPageLimit) {
         mBannerManager.getBannerOptions().setOffScreenPageLimit(offScreenPageLimit);
         return this;
     }
 
-    public BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) {
+    public BannerViewPager<T> setIndicatorMargin(int left, int top, int right, int bottom) {
         mBannerManager.getBannerOptions().setIndicatorMargin(left, top, right, bottom);
         return this;
     }
@@ -972,7 +970,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     /**
      * Enable or disable user initiated scrolling
      */
-    public BannerViewPager<T, VH> setUserInputEnabled(boolean userInputEnabled) {
+    public BannerViewPager<T> setUserInputEnabled(boolean userInputEnabled) {
         mBannerManager.getBannerOptions().setUserInputEnabled(userInputEnabled);
         mViewPager.setUserInputEnabled(userInputEnabled);
         return this;
@@ -982,12 +980,12 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         void onPageClick(View clickedView, int position);
     }
 
-    public BannerViewPager<T, VH> registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
+    public BannerViewPager<T> registerOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
         this.onPageChangeCallback = onPageChangeCallback;
         return this;
     }
 
-    public BannerViewPager<T, VH> setLifecycleRegistry(Lifecycle lifecycleRegistry) {
+    public BannerViewPager<T> setLifecycleRegistry(Lifecycle lifecycleRegistry) {
         lifecycleRegistry.addObserver(this);
         return this;
     }
@@ -1016,7 +1014,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
      *
      * @param disallowIntercept true 禁止BVP拦截事件,false 允许BVP拦截事件
      */
-    public BannerViewPager<T, VH> disallowInterceptTouchEvent(boolean disallowIntercept) {
+    public BannerViewPager<T> disallowInterceptTouchEvent(boolean disallowIntercept) {
         mBannerManager.getBannerOptions().setDisallowIntercept(disallowIntercept);
         return this;
     }

+ 36 - 2
bannerview/src/main/java/com/zhpan/bannerview/BaseBannerAdapter.java

@@ -1,5 +1,6 @@
 package com.zhpan.bannerview;
 
+import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -16,18 +17,51 @@ import java.util.List;
  * Created by zhpan on 2017/3/28.
  */
 public abstract class BaseBannerAdapter<T, VH extends BaseViewHolder<T>> extends RecyclerView.Adapter<VH> {
+
+    public static final int MAX_VALUE = 500;
+
     protected List<T> mList = new ArrayList<>();
+
     private boolean isCanLoop;
-    public static final int MAX_VALUE = 500;
+    /**
+     * 页面点击回调
+     */
     private BannerViewPager.OnPageClickListener mPageClickListener;
+    /**
+     * 上下问
+     */
+    protected Context mContext;
+
+    @Override
+    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
+        super.onAttachedToRecyclerView(recyclerView);
+        mContext = recyclerView.getContext();
+    }
 
     @NonNull
     @Override
     public final VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-        View inflate = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
+        View inflate;
+        int layoutId = getLayoutId(viewType);
+        if (layoutId <= 0) {
+            inflate = createBindingView(getContext(), parent, viewType);
+        } else {
+            inflate = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
+        }
         return createViewHolder(parent, inflate, viewType);
     }
 
+    /**
+     * 创建ViewHolder中的根View,重写此方法创建View;使用此方法后{@link #getLayoutId(int)}失效
+     */
+    protected View createBindingView(Context context, ViewGroup parent, int viewType) {
+        return null;
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
     @Override
     public final void onBindViewHolder(@NonNull VH holder, final int position) {
         int realPosition = BannerUtils.getRealPosition(isCanLoop, position, mList.size());

+ 47 - 0
bannerview/src/main/java/com/zhpan/bannerview/BaseBannerQuickAdapter.java

@@ -0,0 +1,47 @@
+package com.zhpan.bannerview;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+
+/**
+ * @author DBoy
+ * @date 2020/12/11
+ * Class 描述 : 快速创建adapter使用
+ */
+public abstract class BaseBannerQuickAdapter<T> extends BaseBannerAdapter<T, BaseBannerViewHolder<T>> {
+    /**
+     * 默认没有LayoutId 使用
+     */
+    protected final int NO_LAYOUT = -1;
+
+    @Override
+    protected void onBind(BaseBannerViewHolder<T> holder, T data, int position, int pageSize) {
+        convert(holder, data, position, pageSize);
+    }
+
+    @Override
+    public BaseBannerViewHolder<T> createViewHolder(@NonNull ViewGroup parent, View itemView, int viewType) {
+        return new BaseBannerViewHolder<T>(itemView);
+    }
+
+    /**
+     * 进行数据适配
+     * @param holder 基础ViewHolder
+     * @param data 数据
+     * @param position 位置
+     * @param pageSize 页面个数
+     */
+    protected abstract void convert(BaseBannerViewHolder<T> holder, T data, int position, int pageSize);
+
+    /**
+     * 如果使用的是布局id 重写此方法;
+     * 如果使用ViewBinding 重写  createViewBinding(ViewGroup, int);此方法不需要重写
+     */
+    @Override
+    public int getLayoutId(int viewType) {
+        return NO_LAYOUT;
+    }
+
+}

+ 23 - 0
bannerview/src/main/java/com/zhpan/bannerview/BaseBannerViewHolder.java

@@ -0,0 +1,23 @@
+package com.zhpan.bannerview;
+
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+/**
+ * @author DBoy
+ * @date 2020/12/11
+ * Class 描述 : 不做任何操作
+ */
+public class BaseBannerViewHolder<T> extends BaseViewHolder<T> {
+
+
+    public BaseBannerViewHolder(@NonNull View itemView) {
+        super(itemView);
+    }
+
+    @Override
+    public void bindData(T data, int position, int pageSize) {
+
+    }
+}

+ 8 - 10
bannerview/src/main/java/com/zhpan/bannerview/BaseViewHolder.java

@@ -12,8 +12,6 @@ import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.zhpan.bannerview.utils.BannerUtils;
-
 /**
  * <pre>
  *   Created by zhpan on 2020/4/5.
@@ -33,7 +31,7 @@ public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder {
     public abstract void bindData(T data, int position, int pageSize);
 
     @SuppressWarnings("unchecked")
-    protected <V extends View> V findView(int viewId) {
+    public  <V extends View> V findView(int viewId) {
         View view = mViews.get(viewId);
         if (view == null) {
             view = itemView.findViewById(viewId);
@@ -43,40 +41,40 @@ public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder {
     }
 
 
-    protected void setText(int viewId, String text) {
+    public void setText(int viewId, String text) {
         View view = findView(viewId);
         if (view instanceof TextView) {
             ((TextView) view).setText(text);
         }
     }
 
-    protected void setText(int viewId, @StringRes int textId) {
+    public void setText(int viewId, @StringRes int textId) {
         View view = findView(viewId);
         if (view instanceof TextView) {
             ((TextView) view).setText(textId);
         }
     }
 
-    protected void setTextColor(int viewId, @ColorInt int colorId) {
+    public void setTextColor(int viewId, @ColorInt int colorId) {
         View view = findView(viewId);
         if (view instanceof TextView) {
             ((TextView) view).setTextColor(colorId);
         }
     }
 
-    protected void setOnClickListener(int viewId, View.OnClickListener clickListener) {
+    public void setOnClickListener(int viewId, View.OnClickListener clickListener) {
         findView(viewId).setOnClickListener(clickListener);
     }
 
-    protected void setBackgroundResource(int viewId, @DrawableRes int resId) {
+    public void setBackgroundResource(int viewId, @DrawableRes int resId) {
         findView(viewId).setBackgroundResource(resId);
     }
 
-    protected void setBackgroundColor(int viewId, @ColorInt int colorId) {
+    public void setBackgroundColor(int viewId, @ColorInt int colorId) {
         findView(viewId).setBackgroundColor(colorId);
     }
 
-    protected void setImageResource(@IdRes int viewId, @DrawableRes int resId) {
+    public void setImageResource(@IdRes int viewId, @DrawableRes int resId) {
         View view = findView(viewId);
         if (view instanceof ImageView) {
             ((ImageView) view).setImageResource(resId);