终结Adapter、ViewHolder,封装通用适配器
项目传送门1 | compile 'com.excellence:basetools:1.2.4' |
Android适配器
在Android开发中,经常使用Adapter和ViewHolder,总是写着千篇一律的适配器代码,所以进行通用型、万能型的Adapter封装。
MVVM模式Adapter封装
最近学习MVVM,发现一系列优点,适配器封装也非常简单,并且可以让ViewHolder去死吧,只留下可爱的Adapter;开启DataBinding,进行封装。普通Adapter封装
其他环境下:不开启DataBinding,封装Adapter和ViewHolder,使用时需要实现Adapter的抽象接口。
以上两种方式都可以实现单布局类型、多布局类型的适配器。
Adapter示例
MVVM模式Adapter示例
DataBinding,ListVew、GridView适配器
单布局类型
简单到爆炸有木有!!!1
2
3
4// 直接创建CommonBindingAdapter
CommonBindingAdapter<Flower> adapter = new CommonBindingAdapter<>(mFlowers, R.layout.item_flower, BR.flower);
// 设置适配器,等同于ListView.setAdapter()、GridView.setAdapter()
mBinding.setAdapter(adapter);多布局类型
主要是实现多布局类型的ViewDelegate
的接口1
2
3
4
5
6
7// 直接创建MultiItemTypeBindingAdapter
MultiItemTypeBindingAdapter<Flower> adapter = new MultiItemTypeBindingAdapter<>(mFlowers);
// 添加多布局类型
adapter.addItemViewDelegate(new RoseViewDelegate());
adapter.addItemViewDelegate(new TulipViewDelegate());
// 设置适配器
mBinding.setAdapter(adapter);实现
ItemViewDelegate
的接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public static class RoseViewDelegate implements ItemViewDelegate<Flower>
{
public int getItemViewLayoutId()
{
return R.layout.item_rose;
}
public int getItemVariable()
{
return BR.rose;
}
public boolean isForViewType(Flower item, int position)
{
return item instanceof Rose;
}
}
DataBinding,RecyclerView适配器
同上
单布局类型
1
2
3
4
5
6// 直接创建BaseRecyclerBindingAdapter
BaseRecyclerBindingAdapter<Flower> adapter = new BaseRecyclerBindingAdapter<>(mFlowers, R.layout.item_flower, BR.flower);
// 设置适配器,等同于RecyclerView.setAdapter()
mBinding.setAdapter(adapter);
// 注意设置LayoutManager,等同于RecyclerView.setLayoutManager()
mBinding.setLayoutManager(new LinearLayoutManager(this));多布局类型
1
2
3
4
5MultiItemTypeBindingRecyclerAdapter<Flower> adapter = new MultiItemTypeBindingRecyclerAdapter<>(mFlowers);
adapter.addItemViewDelegate(new RoseViewDelegate());
adapter.addItemViewDelegate(new TulipViewDelegate());
mBinding.setAdapter(adapter);
mBinding.setLayoutManager(new LinearLayoutManager(this));
普通Adapter示例
ListVew、GridView适配器
单布局类型
实现CommonAdapter
的接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 创建adapter类继承CommonAdapter,然后设置适配器即可
private class AppGridAdapter extends CommonAdapter<ResolveInfo>
{
public AppGridAdapter(Context context, List<ResolveInfo> datas, int layoutId)
{
super(context, datas, layoutId);
}
public void convert(ViewHolder viewHolder, ResolveInfo item, int position)
{
// ViewHolder封装了一些辅助方法,方便View的各种设置
ImageView iconView = viewHolder.getView(android.R.id.icon);
iconView.setImageDrawable(item.loadIcon(mPackageManager));
viewHolder.setText(android.R.id.text1, item.loadLabel(mPackageManager).toString());
}
}多布局类型
实现ItemViewDelegate
接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33// 多布局适配器
private class ChatAdapter extends MultiItemTypeAdapter<People>
{
public ChatAdapter(Context context, List<People> messages)
{
super(context, messages);
addItemViewDelegate(new ComputerDelegate());
addItemViewDelegate(new BlueDelegate());
addItemViewDelegate(new PurpleDelegate());
}
}
// 不同的布局视图
private class ComputerDelegate implements ItemViewDelegate<People>
{
public int getItemViewLayoutId()
{
return R.layout.item_computer;
}
public boolean isForViewType(People item, int position)
{
return item instanceof ComputerData;
}
public void convert(ViewHolder viewHolder, People item, int position)
{
viewHolder.setText(R.id.computer_text, item.getMsg());
}
}
RecyclerView适配器
单布局类型
实现BaseRecyclerAdapter
的接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 创建adapter类继承BaseRecyclerAdapter
private class AppRecyclerAdapter extends BaseRecyclerAdapter<ResolveInfo>
{
private PackageManager mPackageManager = null;
public AppRecyclerAdapter(Context context, List<ResolveInfo> datas, int layoutId)
{
super(context, datas, layoutId);
mPackageManager = context.getPackageManager();
}
public void convert(RecyclerViewHolder viewHolder, ResolveInfo item, int position)
{
// ViewHolder封装了一些辅助方法,方便View的各种设置
viewHolder.setText(android.R.id.text1, item.loadLabel(mPackageManager));
viewHolder.setImageDrawable(android.R.id.icon, item.loadIcon(mPackageManager));
}
}多布局类型
实现ItemViewDelegate
的接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33// 多布局适配器
private class WarAdapter extends MultiItemTypeRecyclerAdapter<People>
{
public WarAdapter(Context context, List<People> datas)
{
super(context, datas);
addItemViewDelegate(new ComputerRecyclerDelegate());
addItemViewDelegate(new BlueRecyclerDelegate());
addItemViewDelegate(new PurpleRecyclerDelegate());
}
}
// 不同的布局视图
private class ComputerRecyclerDelegate implements ItemViewDelegate<People>
{
public int getItemViewLayoutId()
{
return R.layout.item_computer;
}
public boolean isForViewType(People item, int position)
{
return item instanceof ComputerData;
}
public void convert(RecyclerViewHolder viewHolder, People item, int position)
{
viewHolder.setText(R.id.computer_text, item.getMsg());
}
}