您的位置:首页 > 移动开发 > Android开发

【Android】通用系列 —— AbsListView适配器

2016-03-23 20:36 246 查看
【关键词】

Adapter
通用适配器

【问题】

打造一个通用的Adapter,而不为是每一个ListView或GridView都重复写Adpater;

【效果图】
【分析】
【解决方案】
【使用方法】
privateLouAdaptermLouAdapter;
privatevoidinitView(){
ListViewlvMain=(ListView)findViewById(R.id.lv_main);
lvMain.setAdapter(mLouAdapter=newLouAdapter<String>(mContext,lvMain,android.R.layout.simple_list_item_1){
@Override
protectedvoidassign(LouHolderholder,Strings){
holder.putText(android.R.id.text1,s);
}
});
}


添加元素:

mLouAdapter.addItem("Hello")


删除元素:

mLouAdapter.deleteItem(position)


删除元素(高度逐渐变0):

mLouAdapter.deleteItemWithAnim(position)


局部更新:

mLouAdapter.updateView(position)


【代码】

[LouHolder.java]
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.drawable.Drawable;
importandroid.util.SparseArray;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.TextView;
/**
*CreatedbyLouon2016/3/23.
*/
publicclassLouHolder{
privateSparseArray<View>mViews;
privateViewmConvertView;
protectedMARKmark;
protectedenumMARK{
NORMAL,DELETE
}
privateLouHolder(Contextcontext,intlayoutId){
mViews=newSparseArray<View>();
mConvertView=LayoutInflater.from(context).inflate(layoutId,null);
mConvertView.setTag(this);
}
publicstaticLouHoldergetInstance(Contextcontext,intlayoutId,ViewconvertView){
booleanneedInflate=convertView==null||((LouHolder)convertView.getTag()).mark==MARK.DELETE;
if(needInflate){
returnnewLouHolder(context,layoutId);
}
return(LouHolder)convertView.getTag();
}
publicViewgetConvertView(){
returnmConvertView;
}
public<TextendsView>TgetView(intviewId){
Viewview=mViews.get(viewId);
if(view==null){
view=mConvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return(T)view;
}
publicLouHolderputText(intviewId,Stringtext){
Viewv=getView(viewId);
if(vinstanceofTextView){
((TextView)v).setText(text);
}
returnthis;
}
publicLouHolderputText(intviewId,intresId){
Viewv=getView(viewId);
if(vinstanceofTextView){
((TextView)v).setText(resId);
}
returnthis;
}
publicLouHolderputImg(intviewId,intresId){
Viewv=getView(viewId);
if(vinstanceofImageView){
((ImageView)v).setImageResource(resId);
}
returnthis;
}
publicLouHolderputImg(intviewId,Bitmapbitmap){
Viewv=getView(viewId);
if(vinstanceofImageView){
((ImageView)v).setImageBitmap(bitmap);
}
returnthis;
}
publicLouHolderputImg(intviewId,Drawabledrawable){
Viewv=getView(viewId);
if(vinstanceofImageView){
((ImageView)v).setImageDrawable(drawable);
}
returnthis;
}
}


[LouAdapter.java]
importandroid.content.Context;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.animation.Animation;
importandroid.view.animation.Transformation;
importandroid.widget.AbsListView;
importandroid.widget.BaseAdapter;
importjava.util.ArrayList;
importjava.util.List;
/**
*CreatedbyLouon2016/3/23.
*/
publicabstractclassLouAdapter<T>extendsBaseAdapter{
privateArrayList<T>mLists;
privateContextmContext;
privateAbsListViewmListView;
privateintmLayoutId;
publicLouAdapter(Contextcontext,AbsListViewlistView,intlayoutId){
mContext=context;
mListView=listView;
mLayoutId=layoutId;
mLists=newArrayList<T>();
}
@Override
publicintgetCount(){
returnmLists.size();
}
@Override
publicTgetItem(intposition){
returnmLists.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
returnupdateView(position,convertView);
}
publicAbsListViewgetBindListView(){
returnmListView;
}
/**
*contain来表示是否已经包含元素;(可能需要重写,如果允许重复的话,就不必要重写了);
*
*@paramo
*@return
*/
protectedbooleancontain(To){
if(mLists.contains(o)){
returntrue;
}
returnfalse;
}
/**
*用数据来更新视图;
*
*@paramposition
*@paramconvertView
*@return
*/
privateViewupdateView(intposition,ViewconvertView){
LouHolderholder=LouHolder.getInstance(mContext,mLayoutId,convertView);
assign(holder,getItem(position));
returnholder.getConvertView();
}
/**
*当更改了某一个Item之后,可以通过updateView(position);的方式只更新这一个Item;
*
*@paramposition
*/
publicvoidupdateView(intposition){
ViewconvertView=getIndexView(position);
updateView(position,convertView);
}
/**
*@paramholder
*@paramt
*/
protectedabstractvoidassign(LouHolderholder,Tt);
/**
*获取可见元素的View;
*
*@paramposition
*@return
*/
publicViewgetIndexView(intposition){
intcurrentIndex=position-mListView.getFirstVisiblePosition();
if(currentIndex<0||currentIndex>=mLists.size()){
returnnull;
}
returnmListView.getChildAt(currentIndex);
}
publicvoidaddItem(To,booleanfilter){
if(filter&&contain(o)){
return;
}
mLists.add(o);
updateChange();
}
/**
*默认过滤添加的元素;
*
*@paramo
*/
publicvoidaddItem(To){
addItem(o,true);
}
publicList<T>getList(){
returnmLists;
}
/**
*初始化元素
*
*@paramlist
*/
publicvoidinitList(List<T>list){
mLists.clear();
mLists.addAll(list);
updateChange();
}
publicvoiddeleteItem(To){
mLists.remove(o);
updateChange();
}
publicvoiddeleteItem(intposition){
mLists.remove(position);
updateChange();
}
/**
*高度变为0后删除元素;
*
*@paramposition
*/
publicvoiddeleteItemWithAnim(finalintposition){
finalViewview=getIndexView(position);
finalintinitHeight=view.getMeasuredHeight();
Animationanim=newAnimation(){
@Override
protectedvoidapplyTransformation(floatinterpolatedTime,
Transformationt){
if(mLists.size()>0&&interpolatedTime==1){
//高度为0时删除元素,并更新adapter
if(view.getTag()instanceofLouHolder){
((LouHolder)view.getTag()).mark=LouHolder.MARK.DELETE;
deleteItem(position);
}
}else{
//不断的改变高度,直到高度为0;
view.getLayoutParams().height=initHeight
-(int)(initHeight*interpolatedTime);
view.requestLayout();
}
}
};
anim.setDuration(300);
view.startAnimation(anim);
}
publicvoidupdateChange(){
notifyDataSetChanged();
}
publicvoidclear(){
mLists.clear();
updateChange();
}
}

【参考资料】

Android快速开发系列打造万能的ListViewGridView适配器

JoanZapata/base-adapter-helper
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: