您的位置:首页 > 其它

ListView_适配器之万能适配器_实现多个ListView公用同一个适配器

2015-09-17 15:07 417 查看
相信接触过开发的人一定会接触ListView,相信接触过ListView的人一定接触过BaseAdapter,相信接触过BaseAdapter的人一定很痛恨编写适配器,因为它的数量往往跟ListView的总数是成正比的,所以我今天给大家介绍一款神器,万能适配器!

在自定义适配器的时候,我们通常会自定义一个ViewHolder类,虽然这个名字是随便起的,但是就像约定俗成一样,我们还是这么用了这么多年!当然,自定义万能适配器,从它-ViewHolder开始,我们把所有与ViewHolder有关的操作都封装起来,这样在我们的适配器中,getView中的操作就会简单很多。

packagecom.ctgu.adapter;
importandroid.content.Context;
importandroid.util.SparseArray;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
publicclassViewHolder{
privateSparseArray<View>mView;
privateintmPosition;
privateViewmConvertView;
/**
*参数说明
*@paramcontext上下文
*@paramparentViewGroup
*@paramlayoutId布局文件
*@paramposition当前position
*/
publicViewHolder(Contextcontext,ViewGroupparent,intlayoutId,
intposition){
this.mPosition=position;
this.mView=newSparseArray<View>();
mConvertView=LayoutInflater.from(context).inflate(layoutId,parent,
false);
mConvertView.setTag(this);
}
/**
*@paramcontext
*@paramconvertView
*@paramparent
*@paramlayoutId
*@paramposition
*@return返回一个ViewHolder
*/
publicstaticViewHolderget(Contextcontext,ViewconvertView,
ViewGroupparent,intlayoutId,intposition){
if(convertView==null){
returnnewViewHolder(context,parent,layoutId,position);
}else{
ViewHolderholder=(ViewHolder)convertView.getTag();
holder.mPosition=position;
returnholder;
}
}
/*
*通过viewId获取控件
*/
public<TextendsView>TgetView(intviewId){
Viewview=mView.get(viewId);
if(view==null){
view=mConvertView.findViewById(viewId);
mView.put(viewId,view);
}
return(T)view;
}
/**
*返回视图
*@return
*/
publicViewgetmConvertView(){
returnmConvertView;
}
}


然后我们自定义自己的万能适配器

packagecom.example.day19_viewholder;
importjava.util.List;
importandroid.content.Context;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
publicabstractclassCommonAdapters<T>extendsBaseAdapter{
protectedContextcontext;
protectedList<T>list;
protectedLayoutInflaterinflater;
protectedintlayoutid;
publicCommonAdapters(Contextcontext,List<T>list,intlayoutid){
this.context=context;
this.inflater=LayoutInflater.from(context);
this.list=list;
this.layoutid=layoutid;
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnlist==null?0:list.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnlist==null?null:list.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
ViewHolderholder=ViewHolder.get(context,convertView,parent,
layoutid,position);
convert(holder,getItem(position));
returnholder.getmConvertView();
}
publicabstractvoidconvert(ViewHolderholder,Objectt);
}


其中,我们对外提供一个方法让调用者对控件进行获取并赋值操作。

这样就两个类就完成了万能适配器的制作,下面我们来使用下!

下面是MainAdapter.java

packagecom.example.day19_viewholder;
importjava.util.List;
importandroid.content.Context;
importandroid.widget.TextView;
publicclassMyAdapterextendsCommonAdapters<Jokes>{
publicMyAdapter(Contextcontext,List<Jokes>list){
super(context,list,R.layout.listview_item_jokes);
//TODOAuto-generatedconstructorstub
}
@Override
publicvoidconvert(ViewHolderholder,Objectt){
Jokesjoke=(Jokes)t;
((TextView)holder.getView(R.id.tv_jokes_title)).setText(joke.getTitle());
((TextView)holder.getView(R.id.tv_jokes_time)).setText(joke.getTime());
((TextView)holder.getView(R.id.tv_jokes_source)).setText(joke.getSource());
((TextView)holder.getView(R.id.tv_jokes_content)).setText(joke.getContent());
}
}


下面是MainActivity.java

packagecom.example.day19_viewholder;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.widget.ListView;
publicclassMainActivityextendsActivity{
privateListViewlistview;
privateMyAdapteradapter;
privateList<Jokes>list;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview=(ListView)findViewById(R.id.id_lv);
list=newArrayList<Jokes>();
//添加数据
for(inti=0;i<10;i++){
Jokesj=newJokes("title"+i,"土豆","2015/9/8","你是可爱的小苹果");
list.add(j);
}
adapter=newMyAdapter(this,list);
listview.setAdapter(adapter);
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
}


下面是Jokes.java

packagecom.example.day19_viewholder;
publicclassJokes{
privateStringtitle;
privateStringsource;
privateStringtime;
privateStringcontent;
publicJokes(){
//TODOAuto-generatedconstructorstub
}
publicJokes(Stringtitle,Stringsource,Stringtime,Stringcontent){
super();
this.title=title;
this.source=source;
this.time=time;
this.content=content;
}
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicStringgetSource(){
returnsource;
}
publicvoidsetSource(Stringsource){
this.source=source;
}
publicStringgetTime(){
returntime;
}
publicvoidsetTime(Stringtime){
this.time=time;
}
publicStringgetContent(){
returncontent;
}
publicvoidsetContent(Stringcontent){
this.content=content;
}
}


最后附上效果图,说明是没有问题的,哈哈!





最后附上源码下载地址,当然是不需要积分就可以下载的,知识就是要分享嘛!

源码下载地址:http://download.csdn.net/detail/u010998327/9114647
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: