Skip to content

Commit 8848767

Browse files
committed
doc(readme):调整文档
1 parent 29555b7 commit 8848767

7 files changed

Lines changed: 232 additions & 106 deletions

File tree

README.md

Lines changed: 111 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,10 @@ dependencies {
2626
1. 创建JavaBean,如BasisImgBean.class,BasisTextBean.class。
2727
2. 创建布局文件,如binder_basis_img.xml,binder_left_text.xml,binder_right_text.xml。
2828
3. 创建ViewBinder:
29-
- 单布局条目:创建单布局条目继承ViewBinder子类SingleViewBinder。
30-
- 多布局条目:创建多布局条目使用MultiViewBinder组合多个单布局条目即可。
29+
- 继承ItemViewBinder<T, VH extends RecyclerView.ViewHolder>
30+
- 继承SimpleItemViewBinder<T> ,内部默认使用CommonViewHolder简化创建代码
3131
4. 创建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 {
5647
2.创建布局文件(略)
5748

5849
3.创建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
167162
public 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)
170165
protected boolean onFailedToRecycleView(ViewHolder holder)
171166
protected void onViewAttachedToWindow(ViewHolder holder)
172167
protected 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

app/src/main/java/cn/junhua/android/commonadapter/binder/basis/TextLeftBinderItemView.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cn.junhua.android.commonadapter.binder.basis;
22

3-
import cn.junhua.android.adapter.SimpleItemViewBinder;
3+
import android.widget.Toast;
4+
45
import cn.junhua.android.adapter.CommonViewHolder;
6+
import cn.junhua.android.adapter.SimpleItemViewBinder;
57
import cn.junhua.android.commonadapter.R;
68
import cn.junhua.android.commonadapter.bean.basis.BasisTextBean;
79

@@ -14,7 +16,10 @@ public class TextLeftBinderItemView extends SimpleItemViewBinder<BasisTextBean>
1416
@Override
1517
public void onBindViewHolder(CommonViewHolder holder, BasisTextBean bean, int position) {
1618
holder.setText(R.id.tv_layout_left, "R.layout.binder_left_text")
17-
.setText(R.id.tv_class_left, bean.getText());
19+
.setText(R.id.tv_class_left, bean.getText())
20+
.setOnItemClickListener(view -> Toast.makeText(view.getContext(),
21+
"TextLeftBinderItemView item " + position,
22+
Toast.LENGTH_SHORT).show());
1823
}
1924

2025
@Override
Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,46 @@
11
package cn.junhua.android.commonadapter.binder.basis;
22

3+
import android.support.v7.widget.RecyclerView;
4+
import android.view.LayoutInflater;
35
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.TextView;
48
import android.widget.Toast;
59

6-
import cn.junhua.android.adapter.CommonViewHolder;
7-
import cn.junhua.android.adapter.SimpleItemViewBinder;
10+
import cn.junhua.android.adapter.ItemViewBinder;
811
import cn.junhua.android.commonadapter.R;
912
import cn.junhua.android.commonadapter.bean.basis.BasisTextBean;
1013

1114
/**
1215
* ImgBinderItemView
1316
* Created by Administrator on 2018/1/21.
1417
*/
15-
public class TextRightBinderItemView extends SimpleItemViewBinder<BasisTextBean> {
18+
public class TextRightBinderItemView extends ItemViewBinder<BasisTextBean, TextRightBinderItemView.TextRightViewHolder> {
1619

1720
@Override
18-
public void onBindViewHolder(CommonViewHolder holder, BasisTextBean bean, final int position) {
19-
holder.getPosition();
20-
21-
holder.setText(R.id.tv_type_right, "R.layout.binder_right_text")
22-
.setText(R.id.tv_class_right, bean.getText())
23-
.setOnItemClickListener(new View.OnClickListener() {
24-
@Override
25-
public void onClick(View view) {
26-
Toast.makeText(view.getContext(), "clock item " + position, Toast.LENGTH_SHORT).show();
27-
}
28-
});
21+
public TextRightViewHolder onCreateViewHolder(LayoutInflater inflater, ViewGroup parent) {
22+
return new TextRightViewHolder(inflater.inflate(R.layout.binder_right_text, parent, false));
2923
}
3024

3125
@Override
32-
protected int getLayoutId() {
33-
return R.layout.binder_right_text;
26+
public void onBindViewHolder(TextRightViewHolder holder, BasisTextBean bean, int position) {
27+
holder.bindData(bean, position);
28+
}
29+
30+
class TextRightViewHolder extends RecyclerView.ViewHolder {
31+
TextView tv_type_right;
32+
TextView tv_class_right;
33+
34+
TextRightViewHolder(View itemView) {
35+
super(itemView);
36+
tv_type_right = itemView.findViewById(R.id.tv_type_right);
37+
tv_class_right = itemView.findViewById(R.id.tv_class_right);
38+
}
39+
40+
void bindData(BasisTextBean bean, int position) {
41+
tv_type_right.setText("R.layout.binder_right_text");
42+
tv_class_right.setText(bean.getText());
43+
itemView.setOnClickListener(view -> Toast.makeText(view.getContext(), "TextRightBinderItemView item " + position, Toast.LENGTH_SHORT).show());
44+
}
3445
}
3546
}

multitypeadapter/src/main/java/cn/junhua/android/adapter/CommonViewHolder.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
public class CommonViewHolder extends RecyclerView.ViewHolder {
2323

2424
//region filed
25-
private SparseArray<View> mViews;
25+
private SparseArray<View> mViewPool;
2626
private RecyclerView mRecyclerView;
2727
/**
2828
* 内部View缓存池的默认大小
@@ -70,14 +70,14 @@ public CommonViewHolder(View itemView, ViewGroup parent, int initialCapacity) {
7070
*/
7171
public <T extends View> T findView(@IdRes int viewId) {
7272
//延迟初始化
73-
if (mViews == null) {
74-
mViews = new SparseArray<>(mInitialCapacity);
73+
if (mViewPool == null) {
74+
mViewPool = new SparseArray<>(mInitialCapacity);
7575
}
7676

77-
View view = mViews.get(viewId);
77+
View view = mViewPool.get(viewId);
7878
if (view == null) {
7979
view = itemView.findViewById(viewId);
80-
mViews.put(viewId, view);
80+
mViewPool.put(viewId, view);
8181
}
8282
return (T) view;
8383
}
@@ -178,6 +178,15 @@ public CommonViewHolder setOnItemClickListener(View.OnClickListener onClickListe
178178
itemView.setOnClickListener(onClickListener);
179179
return this;
180180
}
181+
182+
/**
183+
* 清除View缓存,一般不需要调用
184+
*/
185+
public void clear() {
186+
if (mViewPool != null) {
187+
mViewPool.clear();
188+
}
189+
}
181190
//endregion
182191

183192
//region resources api

0 commit comments

Comments
 (0)