Easy to use adapters.
This project is maintained by mzule
一种简单的Adapter解决方案,支持多种ViewType,轻松创建ViewHolder
模式Adapter. 支持ListView
和RecyclerView
.
仅支持ListView
dependencies {
compile 'com.github.mzule.easyadapter:easyadapter:1.1.2'
}
需要支持RecyclerView
dependencies {
compile 'com.github.mzule.easyadapter:easyadapter:1.1.2'
compile 'com.github.mzule.easyadapter:easyadapterrecycler:1.1.2'
}
项目包含四个类, ViewType
, SingleTypeAdapter
, MultiTypeAdapter
, TypePerEntityAdapter
, 其中ViewType
负责创建、绑定(Hold)、渲染View;SingleTypeAdapter
支持单独一种样式类型的Adapter, MultiTypeAdapter
, TypePerEntityAdapter
支持多种样式类型的Adapter;TypePerEntityAdapter
是MultiTypeAdapter
的子类。
ViewType
(s)ViewType
负责创建、绑定、渲染View,每个ViewType
对应传统模式下的一个ViewHolder
,一个典型的ViewType
实现如下:
public class TipViewType extends ViewType<String> {
private TextView tipView;
@Override
public void onCreate() {
setContentView(R.layout.item_tip);
this.tipView = findViewById(R.id.tip);
}
@Override
public void onRender(int position, String tip) {
tipView.setText(tip);
}
}
ViewType
提供了一个findViewById(int)
方法,可以根据声明的类型进行强制转换。
onCreate
可以通过调用setContentView(int)
或者setContentView(View)
创建View,初始化成员变量;onRender(int, T)
负责渲染UI,绑定数据.ViewType
还提供了一个getAdapter()
方法直接直接操作Adapter.以及一个isEditMode()
检查当前是否在编辑模式.
Adapter
项目为ListView
,RecyclerVIew
个提供了3个Adapter
基类,名字一样,只是包名略作区分,分别是com.github.mzule.easyadapter
,com.github.mzule.easyadapter.recycler
。下面一一说明。
SingleTypeAdapter
适合仅有一种类型View的ListView
,典型实现如下:
class PlainAdapter extends SingleTypeAdapter<String> {
public PlainAdapter(Context context) {
super(context);
}
@Override
protected Class<? extends ViewType> singleViewType() {
return TipViewType.class;
}
}
顾名思义,MultiTypeAdapter
适用于需要在ListView
上显示多种类型View的时候,比如说微博客户端,一堆微博之间,夹杂几个广告,正好适用。典型实现:
class ArticleAdapter extends MultiTypeAdapter<Article> {
public ArticleAdapter(Context context) {
super(context);
}
@Override
protected void registerViewTypes() {
registerViewType(ArticleBriefViewType.class);
registerViewType(ArticleFullViewType.class);
}
@Override
protected Class<? extends ViewType> getViewType(int position, Article data) {
switch (data.getStyle()) {
case Article.STYLE_FULL:
return ArticleFullViewType.class;
case Article.STYLE_BRIEF:
return ArticleBriefViewType.class;
}
return null;
}
}
TypePerEntityAdapter
是MultiTypeAdapter
的子类,适用于每个数据实体class都对应不同的ViewType
实现,例如:
class TimelineAdapter extends TypePerEntityAdapter<Object> {
public TimelineAdapter(Context context) {
super(context);
}
@Override
protected void mapEntityViewTypes() {
mapEntityViewType(Post.class, PostViewType.class);
mapEntityViewType(Repost.class, RepostViewType.class);
mapEntityViewType(String.class, TipViewType.class);
mapEntityViewType(Recommend.class, RecommendViewType.class);
mapEntityViewType(Ad.class, AdViewType.class);
}
}
Adapter
通过ListView#setAdapter(Adapter)
使用Adapter,通过add(List)
/addAndNotify(List)
/clear()
/clearAndNotify()
添加或修改Adapter内的数据。add(List)
和addAndNotify(List)
的区别在于是否自动调用notifyDataSetChanged()
, clear
亦然。
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
List<String> fake = new ArrayList<>();
for (int i = 0; i < 100; i++) {
fake.add(UUID.randomUUID().toString());
}
adapter.addAndNotify(fake);