@@ -26,19 +26,10 @@ dependencies {
26261 . 创建JavaBean,如BasisImgBean.class,BasisTextBean.class。
27272 . 创建布局文件,如binder_basis_img.xml,binder_left_text.xml,binder_right_text.xml。
28283 . 创建ViewBinder:
29- - 单布局条目:创建单布局条目继承ViewBinder子类SingleViewBinder。
30- - 多布局条目:创建多布局条目使用MultiViewBinder组合多个单布局条目即可。
29+ - 继承ItemViewBinder<T, VH extends RecyclerView.ViewHolder>
30+ - 继承SimpleItemViewBinder< T > ,内部默认使用CommonViewHolder简化创建代码
31314 . 创建MultiTypeAdapter并注册ViewBinder。
3232
33- 关系图:
34-
35- ![ 关系图] ( https://github.com/JunhuaLin/MultiTypeAdapter/blob/master/photo/关系图1.png )
36-
37- UML图:
38-
39- ![ UML] ( https://github.com/JunhuaLin/MultiTypeAdapter/blob/master/photo/uml图.png )
40-
41-
4233注:具体细节参考** 实例展示** 或者查看** 源代码** 。
4334
4435#### b.实例
@@ -56,122 +47,162 @@ public class BasisTextBean {
56472.创建布局文件(略)
5748
58493.创建ViewBinder
50+
51+ 两种方式创建ViewBinder:
52+
53+ a、继承ItemViewBinder<T, VH extends RecyclerView.ViewHolder>
54+ b、继承SimpleItemViewBinder<T >
55+
56+ 两者本质是一样的,SimpleItemViewBinder简化了ItemViewBinder的代码,默认使用CommonViewHolder简化创建过程。
57+ CommonViewHolder内部实现了常用的方法,并提供View缓存功能,所有View查找一次后都会被缓存起来,后续查找直接缓存返回。
58+
59+
5960``` java
60- public class ImgBinderView extends SingleViewBinder<BasisImgBean > {
61+ // 简单布局可以继承SimpleItemViewBinder简化创建代码
62+ public class ImgBinderItemView extends SimpleItemViewBinder<BasisImgBean > {
6163
62- public ImgBinderView () {
63- super (BasisImgBean . class, R . layout. binder_basis_img);
64+ @Override
65+ public void onBindViewHolder (CommonViewHolder holder , BasisImgBean bean , int position ) {
66+ holder. setText(R . id. tv_type_content, " BasisImgBean.class -> R.layout.binder_basis_img" )
67+ .setImageResource(R . id. iv_img, bean. getRes());
6468 }
6569
6670 @Override
67- public void onBindView (ViewHolder holder , BasisImgBean bean , int position ) {
68- holder. setText(R . id. tv_type_content, " BasisImgBean.class" + " ->R.layout.binder_basis_img" )
69- .setImageResource(R . id. iv_img, bean. getRes());
71+ protected int getLayoutId () {
72+ return R . layout. binder_basis_img;
7073 }
7174}
7275
73- public class TextLeftBinderView extends SingleViewBinder<BasisTextBean > {
76+ // 对比两种继承方式
77+ public class TextLeftBinderItemView extends SimpleItemViewBinder<BasisTextBean > {
7478
75- public TextLeftBinderView () {
76- super (BasisTextBean . class, R . layout. binder_left_text);
79+ @Override
80+ public void onBindViewHolder (CommonViewHolder holder , BasisTextBean bean , int position ) {
81+ holder. setText(R . id. tv_layout_left, " R.layout.binder_left_text" )
82+ .setText(R . id. tv_class_left, bean. getText())
83+ .setOnItemClickListener(view - > Toast . makeText(view. getContext()," TextLeftBinderItemView item " + position,Toast . LENGTH_SHORT ). show());
7784 }
7885
7986 @Override
80- public void onBindView (ViewHolder holder , BasisTextBean bean , int position ) {
81- holder. setText(R . id. tv_layout_left, " R.layout.binder_left_text" )
82- .setText(R . id. tv_class_left, bean. getText());
87+ protected int getLayoutId () {
88+ return R . layout. binder_left_text;
8389 }
8490}
8591
86- public class TextRightBinderView extends SingleViewBinder<BasisTextBean > {
92+ // 复杂布局可以继承ItemViewBinder,自定义ViewHolder完成复杂操作
93+ public class TextRightBinderItemView extends ItemViewBinder<BasisTextBean , TextRightBinderItemView .TextRightViewHolder > {
8794
88- public TextRightBinderView () {
89- super (BasisTextBean . class, R . layout. binder_right_text);
95+ @Override
96+ public TextRightViewHolder onCreateViewHolder (LayoutInflater inflater , ViewGroup parent ) {
97+ return new TextRightViewHolder (inflater. inflate(R . layout. binder_right_text, parent, false ));
9098 }
9199
92100 @Override
93- public void onBindView (ViewHolder holder , BasisTextBean bean , final int position ) {
94- holder. setText(R . id. tv_type_right, " R.layout.binder_right_text" )
95- .setText(R . id. tv_class_right, bean. getText());
96-
97- holder. findView(R . id. rl_root). setOnClickListener(new View .OnClickListener () {
98- @Override
99- public void onClick (View v ) {
100- Toast . makeText(v. getContext(), " clock item " + position, Toast . LENGTH_SHORT ). show();
101- }
102- });
101+ public void onBindViewHolder (TextRightViewHolder holder , BasisTextBean bean , int position ) {
102+ holder. bindData(bean, position);
103+ }
103104
105+ class TextRightViewHolder extends RecyclerView .ViewHolder {
106+ TextView tv_type_right;
107+ TextView tv_class_right;
108+
109+ TextRightViewHolder (View itemView ) {
110+ super (itemView);
111+ tv_type_right = itemView. findViewById(R . id. tv_type_right);
112+ tv_class_right = itemView. findViewById(R . id. tv_class_right);
113+ }
114+
115+ void bindData (BasisTextBean bean , int position ) {
116+ tv_type_right. setText(" R.layout.binder_right_text" );
117+ tv_class_right. setText(bean. getText());
118+ itemView. setOnClickListener(view - > Toast . makeText(view. getContext(), " TextRightBinderItemView item " + position, Toast . LENGTH_SHORT ). show());
119+ }
104120 }
105121}
106- ```
107-
108- SingleViewBinder方法介绍:
109- > public SingleViewBinder(Class<T > beanClass, int layoutId)
110-
111- - 参数1:beanClass,为泛型T的类类型,如Item1.class,用于区分条目。
112- - 参数2:layoutId,为条目布局资源id。
113-
114- > public int onCountView(Item1 bean, int position)
115-
116- 该方法返回用于初始化该布局View缓存大小的初始值,默认值为6,建议重写避免扩容和内存浪费。
117-
118- > public void onBindView(ViewHolder holder, Item1 bean, int position)
119-
120- - 第一个参数:holder,用来封装复用条目的,通过它的findView(id)可以得到条目中所有到View对象,然后进行数据填充即可。同一个id的View findView只会查找一次,之后从缓存中获取。
121- ViewHolder的setImageResource()和setBackgroundResource()是用来快速填充文字和图片的方法,它们的返回值是ViewHolder本身。
122- - 第二个参数:bean,就是我们数据对象的引用。
123- - 第三个参数:position,当前条目位置。
124122
123+ ```
125124
126- 4.创建MultiTypeAdapter并注册ViewBinder
125+ 4.创建MultiTypeAdapter并注册ItemViewBinder
127126``` java
128127 // 初始化MultiTypeAdapter
129128 MultiTypeAdapter multiTypeAdapter = new MultiTypeAdapter ();
130129 // 注册ViewBinder
131- multiTypeAdapter. register(new ImgBinderView ());// 一对一
130+ multiTypeAdapter. register(BasisImgBean . class, new ImgBinderItemView ());// 一对一
132131 multiTypeAdapter. register(BasisTextBean . class)// 一对多
133- .mapping(new TextLeftBinderView (), new TextRightBinderView ())
134- .match(new TypeMatcher<BasisTextBean > () {
135- @Override
136- public Class<? extends ViewBinder<BasisTextBean > > onMatch (BasisTextBean bean , int position ) {
137- if (bean. getType() == 1 ) return TextLeftBinderView . class;
138- return TextRightBinderView . class;
139- }
132+ .mapping(new TextLeftBinderItemView (), new TextRightBinderItemView ())
133+ .match((bean, position) - > {
134+ if (bean. getType() == 1 ) return TextLeftBinderItemView . class;
135+ return TextRightBinderItemView . class;
140136 });
137+ // 设置数据集合
138+ mMultiTypeAdapter. setList(... );
141139```
142140#### c.效果图jpg
143141![ 基础用法] ( https://github.com/JunhuaLin/MultiTypeAdapter/blob/master/photo/基础用法.jpg )
144142
145143### 3.更多方法
146144
147- MultiTypeAdapter:
145+ #### MultiTypeAdapter:
148146``` java
149- public void setDefaultViewBinder(ViewBinder itemViewBinder)
150- public void register(ViewBinder itemViewBinder)
151- public < T > OneToManyMapper<T > register(Class<T > beanClass)
152- public void unregister(ViewBinder itemViewBinder)
153- ```
147+ // 设置默认的ItemViewBinder,没有匹配到合适的ItemViewBinder使用默认的
148+ public void setDefaultViewBinder(@Nullable ItemViewBinder<Object , ?> binder)
154149
155- ViewHolder:
156- ``` java
157- public < T extends View > T findView( @IdRes int viewId)
158- public RecyclerView getRecyclerView()
159- public ViewHolder setText( @IdRes int viewId, String text )
160- public ViewHolder setText( @IdRes int viewId, @StringRes int resId)
161- public ViewHolder setImageResource( @IdRes int imageViewId, @DrawableRes int drawableId)
162- public ViewHolder setBackgroundResource( @IdRes int viewId, @DrawableRes int drawableId )
150+ // 为数据条目注册ItemViewBinder
151+ public < T > void register( @NonNull Class< T > beanClass, @NonNull ItemViewBinder< T , ?> binder)
152+
153+ // 为同一个数据类型注册不同的ItemViewBinder,处理一种数据类型对应多种ItemViewBinder情况
154+ public < T > OneToManyMapper< T > register( @NonNull Class< T > beanClass )
155+
156+ // 设置展示的数据集合,内部仅引用数据集合
157+ public void setList( @Nullable List<?> list )
163158```
164159
165- BinderView :
160+ #### ItemViewBinder :
166161``` java
167162public final MultiTypeAdapter getAdapter()
168- protected long getItemId(int position)
169- protected void onViewRecycled(ViewHolder holder)
163+ protected long getItemId(T item, int position)
164+ protected void onViewRecycled(ViewHolder holder)
170165protected boolean onFailedToRecycleView(ViewHolder holder)
171166protected void onViewAttachedToWindow(ViewHolder holder)
172167protected void onViewDetachedFromWindow(ViewHolder holder)
173168```
174169
170+
171+ #### CommonViewHolder:
172+ ``` java
173+ // findViewById同样的功能,内部提供缓存view的功能
174+ public < T extends View > T findView(@IdRes int viewId)
175+
176+ public RecyclerView getRecyclerView()
177+
178+ // 快捷设置TextView的文本
179+ public CommonViewHolder setText(@IdRes int viewId, String text)
180+ public CommonViewHolder setText(@IdRes int viewId, @StringRes int resId)
181+
182+ // 快捷设置TextView的文本颜色
183+ public CommonViewHolder setTextColor(@IdRes int viewId, ColorStateList colorStateList)
184+ public CommonViewHolder setTextColor(@IdRes int viewId, @ColorInt int colorInt)
185+
186+ // 快捷设置ImageView的src
187+ public CommonViewHolder setImageResource(@IdRes int imageViewId, @DrawableRes int drawableId)
188+
189+ // 快捷设置View的背景
190+ public CommonViewHolder setBackgroundResource(@IdRes int viewId, @DrawableRes int drawableId)
191+
192+ // 设置条目的根itemView的点击事件
193+ public CommonViewHolder setOnItemClickListener(View . OnClickListener onClickListener)
194+
195+ // 清除View缓存,一般不需要调用
196+ public void clear()
197+
198+ // 获取常用资源
199+ public Context getContext()
200+ public Resources getResources()
201+ public String getString(@StringRes int id)
202+
203+ ```
204+
205+
175206### 4.更多实例展示
176207
177208#### 淘宝首页效果(基本用法) 效果图gif
0 commit comments