ListView的基类Adapter和基类ViewHolder
1:基类的抽取用于简化代码,简化效果如下(Adapter代码量减少,也不需要再自定义ViewHolder)
2:基类Adapter
public abstract class MBaseAdapter extends BaseAdapter {
//定义一个集合,对ListView 需要的数据进行接收
publicListmData=newArrayList();
//定义一个集合,对ListViewz中Item的选择状态进行记录(方便做单选/多选)
publicHashMapmap=newHashMap();
//上下文,默认为全局上下文,可在构造是传入Activity
publicContextcontext=BaseApplication.getContext();
//空构造
publicMBaseAdapter() {
}
//包含数据构造
publicMBaseAdapter(List mData) {
this.mData.clear();
this.mData.addAll(mData);
this.map.clear();
for(Vv : mData) {
map.put(v, false);
}
}
//包含数据/上下文构造
publicMBaseAdapter(List mData,Context context) {
this.mData.clear();
this.mData.addAll(mData);
this.map.clear();
for(Vv : mData) {
map.put(v, false);
}
this.context= context;
}
//重新设置数据
public voidsetData(List mData) {
this.mData.clear();
this.mData.addAll(mData);
this.map.clear();
for(Vv : mData) {
map.put(v, false);
}
this.notifyDataSetChanged();
}
//清空数据
public voidclear() {
this.mData.clear();
this.map.clear();
this.notifyDataSetChanged();
}
//获取ListView条目数
@Override
public intgetCount() {
returnmData.size();
}
//获取该位置Item
@Override
publicObjectgetItem(intposition) {
returnmData.get(position);
}
@Override
public longgetItemId(intposition) {
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroup parent) {
BaseViewHolderbaseViewHolder =BaseViewHolder.get(BaseApplication.getContext(),convertView,idLayout());
contactData2View(mData.get(position),baseViewHolder);
returnbaseViewHolder.getConvertView();
}
protected abstract voidcontactData2View(Vitem,BaseViewHolderbaseViewHolder);
protected abstract intidLayout();
publicHashMapgetMap() {
returnmap;
}
//传入被点击的Item位置,将该位置上的数据Item绑定状态为True(单选)
public voidsingleClickItemToTrue(intposition) {
Vv =mData.get(position);
for(Vi :map.keySet()) {
if(i.equals(v)) {
map.put(i, true);
}else{
map.put(i, false);
}
}
}
//传入被点击的Item位置,将该位置上的数据Item绑定状态为True(多选)
public voidclickItemToTrue(intposition) {
Vv =mData.get(position);
for(Vi :map.keySet()) {
if(i.equals(v)) {
if(map.get(i)) {
map.put(i, false);
}else{
map.put(i, true);
}
}
}
}
//返回被选择的Item,如果没有则返回NULL
publicVgetCheckedItem() {
Vv =null;
for(Vi :map.keySet()) {
if(map.get(i)) {
v = i;
}
}
returnv;
}
//返回该Item是否被选择的状态
public booleangetItemStatus(Vv) {
returnmap.get(v);
}
}
3:基类ViewHolder
public classBaseViewHolder{
private finalSparseArraymViews;
privateViewmConvertView;
privateBaseViewHolder(Context context,intlayoutId) {
this.mViews=newSparseArray();
mConvertView=View.inflate(context,layoutId,null);
mConvertView.setTag(this);
}
public staticBaseViewHolderget(Context context,ViewconvertView,
intlayoutId) {
if(convertView ==null) {
return newBaseViewHolder(context,layoutId);
}
return(BaseViewHolder) convertView.getTag();
}
publicViewgetConvertView() {
returnmConvertView;
}
publicTgetView(intviewId) {
Viewview =mViews.get(viewId);
if(view ==null) {
view =mConvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return(T) view;
}
}
4:两个基类的主要作用为能够减少一定的代码,将大量的工作转移到基类之中进行(ViewHolder直接不用写),另外,Adapter之中定义了一个map,可用于记录当前的item被选择状态(因为这种需求不少,但很多时候我们不能修改实体类属性),方便做单选或者多选功能。