ListView的基类Adapter和基类ViewHolder

2017-01-13 14:56:13来源:http://www.jianshu.com/p/3a605d48f282作者:native_人点击

第七城市

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被选择状态(因为这种需求不少,但很多时候我们不能修改实体类属性),方便做单选或者多选功能。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台