1:基類的抽取用于簡化代碼,簡化效果如下(Adapter代碼量減少艰亮,也不需要再自定義ViewHolder)
2:基類Adapter
public abstract class MBaseAdapter?extends BaseAdapter {
//定義一個集合装处,對ListView 需要的數(shù)據(jù)進行接收
publicListmData=newArrayList();
//定義一個集合误债,對ListViewz中Item的選擇狀態(tài)進行記錄(方便做單選/多選)
publicHashMapmap=newHashMap();
//上下文,默認(rèn)為全局上下文妄迁,可在構(gòu)造是傳入Activity
publicContextcontext=BaseApplication.getContext();
//空構(gòu)造
publicMBaseAdapter() {
}
//包含數(shù)據(jù)構(gòu)造
publicMBaseAdapter(List mData) {
this.mData.clear();
this.mData.addAll(mData);
this.map.clear();
for(Vv : mData) {
map.put(v, false);
}
}
//包含數(shù)據(jù)/上下文構(gòu)造
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;
}
//重新設(shè)置數(shù)據(jù)
public voidsetData(List mData) {
this.mData.clear();
this.mData.addAll(mData);
this.map.clear();
for(Vv : mData) {
map.put(v, false);
}
this.notifyDataSetChanged();
}
//清空數(shù)據(jù)
public voidclear() {
this.mData.clear();
this.map.clear();
this.notifyDataSetChanged();
}
//獲取ListView條目數(shù)
@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位置寝蹈,將該位置上的數(shù)據(jù)Item綁定狀態(tài)為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位置,將該位置上的數(shù)據(jù)Item綁定狀態(tài)為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是否被選擇的狀態(tài)
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:兩個基類的主要作用為能夠減少一定的代碼箫老,將大量的工作轉(zhuǎn)移到基類之中進行(ViewHolder直接不用寫),另外黔州,Adapter之中定義了一個map耍鬓,可用于記錄當(dāng)前的item被選擇狀態(tài)(因為這種需求不少,但很多時候我們不能修改實體類屬性)流妻,方便做單選或者多選功能牲蜀。