SuperAdapter
Introduction: listview 和 recycleview 的 adapter 的封装,考虑重用性和可读性,不过度抽象
Tags:
listview 和 recycleview 的 adapter 的封装,考虑重用性和可读性,不过度抽象
[封装的说明] (http://www.jianshu.com/p/994de390378f)
使用
gradle:
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Step 2. Add the dependency
dependencies {
compile 'com.github.glassLake:SuperAdapter:1.0.0'
}
使用
使用技巧:
listview,recycleview 的数据与界面达到完全的一一对应,如果服务器返回的数据不对应,那么重新组合,如果有一个 item 无需数据,那么在 datas 里插入 null 或无意义的数据,holder 多一种类型来处理即可.
SuperLvAdapter:
单一类型 item 时,使用匿名实现类即可,多种类型时,重写 getItemViewTypeCount 和 getItemViewType(position) 即可,无需更改 getview 内部的逻辑.
SuperLvHolder:
写子类的时候在子类内部指定 layout 文件,一般情况下,实现 assingDatasAndEvents(Activity context, String bean)就可以,如果要用到 int position ,boolean isLast,就实现更多参数的同名方法,此时,上面那个简化的方法空实现即可.
如果该 holder 在多个地方使用,那么可以作为单独的类,达到复用的目的.
SuperRcvAdapter 和 SuperRcvHolder
adapter 一般情况下都使用匿名子类.多个 item 时分别指定类型和对应的 hoder 即可. holder 一般也使用匿名子类.如果在其他页面需要复用,那么可以写成单独的子类.其 layout 文件需要在构造函数前传入,已封装好方法.
示例代码
AbstractListview 的 SuperLvAdapter:
adapter:(这里示例代码是只有一种 itemtype 的情况)
ListView listView = new ListView(this);
ArrayList<String> datas = new ArrayList<>();
SuperLvAdapter adapter = new SuperLvAdapter(datas, this) {
@Override
protected SuperLvHolder generateNewHolder(Activity context,int viewType) {
return new CustomHolder(context);
}
};
listView.setAdapter(adapter);
adapter.add("hhhh");
viewholder 的实现:
class CustomHolder extends SuperLvHolder<String> {
@Bind(R.id.tv_text)
TextView mTvText;
public CustomHolder(Activity context) {
super(context);
}
@Override
protected int setLayoutRes() {
return R.layout.holder_demo_list;
}
@Override
public void assingDatasAndEvents(Activity context, String bean) {
mTvText.setText(bean);
}
}
RecycleView 的 SuperRcvAdapter:
SuperRcvAdapter,多种类型下的使用
mAdapter = new SuperRcvAdapter(datas, mActivity) {
public static final int TYPE_0 = 0;
public static final int TYPE_1 = 1;
@Override
protected SuperRcvHolder generateCoustomViewHolder(int viewType) {
switch (viewType) {
case TYPE_0:
return new CustomHolder(inflate(R.layout.holder_demo_list));
case TYPE_1:
return new CustomHolder2(inflate(R.layout.holder_demo_list_2));
default:
return new SuperRcvHolder<String>(inflate(R.layout.holder_demo_list_2)) {//匿名子类
private TextView tv_text;
@Override
public void assignDatasAndEvents(Activity context, String data) {
super.assignDatasAndEvents(context, data);
tv_text.setText(data);
}
};
}
}
@Override
public int getItemViewType(int position) {
if (position % 2 == 0) {//偶数位
return TYPE_0;
} else {//奇数位
return TYPE_1;
}
}
};
mRecyclerView.setAdapter(mAdapter);
holder 的实现:
class CustomHolder extends SuperRcvHolder<String> {
@Bind(R.id.tv_text)
TextView mTvText;
public CustomHolder(View itemView) {
super(itemView);
}
@Override
public void assignDatasAndEvents(Activity context, String data) {
mTvText.setText(data);
}
//备用
@Override
public void assignDatasAndEvents(Activity context, String data, int position, boolean isLast,
boolean isListViewFling, List datas, SuperRcvAdapter superRecyAdapter) {
super.assignDatasAndEvents(context, data, position, isLast, isListViewFling, datas, superRecyAdapter);
}
}