打造万能Adapter(适配器)——适用于ListView、GridListView

整理总结自鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/38902805/

一、利用普通的Adapter实现ListView列表——这是最基础的适配器

以下代码是最普通的实现方法:

1、MainActiviy.Java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     private List<String> mData = new ArrayList<String>(Arrays.asList("HongYang""GuoLin""RenYuGang""Jiatao"));  
  4.     private Context context;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         context = this;  
  10.         setContentView(R.layout.activity_main);  
  11.         ListView listView = (ListView) findViewById(R.id.listview);  
  12.   
  13.         MyAdapter mAdapter = new MyAdapter(context, mData);  
  14.         listView.setAdapter(mAdapter);  
  15.     }  
  16. }  

2、activity_main.xml

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".act.MainActivity">  
  7.   
  8.     <ListView  
  9.         android:id="@+id/listview"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent" />  
  12. </RelativeLayout>  

3、MyAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/10. 
  3.  * 这是最普通的适配器: 
  4.  *      MyAdapter继承BaseAdapter,然后getView里面使用ViewHolder模式; 
  5.  *      一般情况下,我们的写法是这样的:对于不同布局的ListView,我们会有一个对应的Adapter,在Adapter中又会有一个ViewHolder类来提高效率。 
  6.  *      这样出现ListView就会出现与之对应的Adapter类、ViewHolder类; 
  7.  *  那么有没有办法减少我们的编码呢?第二部分中将初步实现 
  8.  */  
  9. public class MyAdapter extends BaseAdapter {  
  10.   
  11.     private LayoutInflater mLayoutInflater;  
  12.     private Context mContext;  
  13.     private List<String> mData;  
  14.   
  15.     public MyAdapter(Context mContext, List<String> mData) {  
  16.         mLayoutInflater = LayoutInflater.from(mContext);  
  17.         this.mContext = mContext;  
  18.         this.mData = mData;  
  19.     }  
  20.   
  21.     @Override  
  22.     public int getCount() {  
  23.         return mData == null ? 0 : mData.size();  
  24.     }  
  25.   
  26.     @Override  
  27.     public Object getItem(int position) {  
  28.         return mData.get(position);  
  29.     }  
  30.   
  31.     @Override  
  32.     public long getItemId(int position) {  
  33.         return position;  
  34.     }  
  35.   
  36.     @Override  
  37.     public View getView(int position, View convertView, ViewGroup parent) {  
  38.         ViewHolder holder;  
  39.         if (convertView == null) {  
  40.             holder = new ViewHolder();  
  41.             convertView = mLayoutInflater.inflate(R.layout.item_string_listview, parent, false);  
  42.             holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);  
  43.             convertView.setTag(holder);  
  44.         } else {  
  45.             holder = (ViewHolder) convertView.getTag();  
  46.         }  
  47.   
  48.         holder.tv_title.setText(mData.get(position));  
  49.         return convertView;  
  50.     }  
  51.   
  52.     class ViewHolder {  
  53.         private TextView tv_title;  
  54.     }  
  55. }  

4、item_string_listview.xml

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/tv_title"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="50dp"  
  6.     android:background="#aa111111"  
  7.     android:gravity="center_vertical"  
  8.     android:paddingLeft="15dp"  
  9.     android:text="hello"  
  10.     android:textColor="#ffffff"  
  11.     android:textSize="20sp"  
  12.     android:textStyle="bold">  
  13.   
  14. </TextView>  


二、打造通用的ViewHolder——使能在外部获得ViewHolder、相关View控件、convertView

1、MainActiviy.java

同上

2、activity_main.xml

同上

3、ViewHolder.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/11. 
  3.  * 通用的ViewHolder 
  4.  * 1、ViewHolder的作用是通过convertView.setTag与convertView进行绑定,然后当convertView复用时,直接从与之对于的ViewHolder(getTag)中拿到convertView布局中的控件,省去了findViewById的时间; 
  5.  * 2、也就是说,实际上们每个convertView会绑定一个ViewHolder对象,这个viewHolder主要用于帮convertView存储布局中的控件; 
  6.  * 3、那么我们只要写出一个通用的ViewHolder,然后对于任意的convertView,提供一个对象让其setTag即可; 
  7.  * 4、既然是通用,那么我们这个ViewHolder就不可能含有各种控件的成员变量了,因为每个Item的布局是不同的,最好的方式是什么呢? 
  8.  * 5、提供一个容器,专门存每个Item布局中的所有控件,而且还要能够查找出来;既然需要查找,那么ListView肯定是不行了,需要一个键值对进行保存,键为控件的Id,值为控件的引用; 
  9.  * 6、相信大家立刻就能想到Map;但是我们不用Map,因为有更好的替代类,就是我们android提供的SparseArray这个类,和Map类似,但是比Map效率,不过键只能为Integer. 
  10.  */  
  11. public class ViewHolder {  
  12.   
  13.     private SparseArray<View> mViews;  
  14.     private View mConvertView;  
  15.   
  16.     //构造函数  
  17.     private ViewHolder(Context context, int resLayoutId, ViewGroup parent) {  
  18.         this.mViews = new SparseArray<View>();  
  19.         this.mConvertView = LayoutInflater.from(context).inflate(resLayoutId, parent, false);  
  20.         this.mConvertView.setTag(this);  
  21.     }  
  22.   
  23.     //获取一个ViewHolder  
  24.     public static ViewHolder getHolder(Context context, int resLayoutId, View convertView, ViewGroup parent) {  
  25.         if (convertView == null) {  
  26.             return new ViewHolder(context, resLayoutId, parent);  
  27.         }  
  28.         return (ViewHolder) convertView.getTag();  
  29.     }  
  30.   
  31.     //通过控件的id获取对应的控件,如果没有则加入mViews;记住 <T extends View> T 这种用法  
  32.     public <T extends View> T getItemView(int viewId) {  
  33.         View view = mViews.get(viewId);  
  34.         if (view == null) {  
  35.             view = mConvertView.findViewById(viewId);  
  36.             mViews.put(viewId, view);  
  37.         }  
  38.         return (T) view;  
  39.     }  
  40.   
  41.     //获得一个convertView  
  42.     public View getmConvertView() {  
  43.         return mConvertView;  
  44.     }  
  45.   
  46. }  

4、MyAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/10. 
  3.  * 这是使用了通用的ViewHolder的适配器 
  4.  *  除了getView,其他方法都一样: 
  5.  *      1、调用ViewHolder的get方法: 
  6.  *          如果convertView为null,new一个ViewHolder实例,通过使用mInflater.inflate加载布局,然后new一个SparseArray用于存储View,最后setTag(this); 
  7.  *          如果存在那么直接getTag; 
  8.  *      2、通过getView(id)获取控件,如果存在则直接返回,否则调用findViewById,返回存储,返回。 
  9.  *      3、最后通过holder.getmConvertView()返回视图; 
  10.  */  
  11. public class MyAdapter extends BaseAdapter {  
  12.   
  13.     private LayoutInflater mLayoutInflater;  
  14.     private Context mContext;  
  15.     private List<String> mData;  
  16.   
  17.     public MyAdapter(Context mContext, List<String> mData) {  
  18.         mLayoutInflater = LayoutInflater.from(mContext);  
  19.         this.mContext = mContext;  
  20.         this.mData = mData;  
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         return mData == null ? 0 : mData.size();  
  26.     }  
  27.   
  28.     @Override  
  29.     public Object getItem(int position) {  
  30.         return mData.get(position);  
  31.     }  
  32.   
  33.     @Override  
  34.     public long getItemId(int position) {  
  35.         return position;  
  36.     }  
  37.   
  38.     @Override  
  39.     public View getView(int position, View convertView, ViewGroup parent) {  
  40.         //实例化一个ViewHolder  
  41.         ViewHolder holder = ViewHolder.getHolder(mContext, R.layout.item_string_listview, convertView, parent);  
  42.         //获取控件  
  43.         TextView view = holder.getItemView(R.id.tv_title);  
  44.         //给控件赋值  
  45.         view.setText(mData.get(position));  
  46.         return holder.getmConvertView();  
  47.     }  
  48. }  

5、item_string_listview.xml

同上


三、初步打造通用的Adapter——通过泛型支持所有数据集合,抽取公共方法封装成抽象基类,对外开发getView方法

1、MainActiviy.java

同上

2、activity_main.xml

同上

3、ViewHolder.java

同上

4、ComAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/11. 
  3.  * 通用的适配器 
  4.  * 1、<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">ComAdapter</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">需要保持一个List对象,存储一个Bean的集合,不同的ListView,Bean肯定是不同的,这个ComAdapter肯定需要支持泛型,内部维持一个List<T></span> 
  5.  * 2、ComAdapter是一个抽象类,提取getView以外的方法,getView方法留给子类去实现 
  6.  */  
  7. public abstract class ComAdapter<T> extends BaseAdapter {  
  8.   
  9.     protected LayoutInflater mLayoutInflater;  
  10.     protected Context mContext;  
  11.     protected List<T> mData;  
  12.   
  13.     public ComAdapter(Context mContext, List<T> mData) {  
  14.         mLayoutInflater = LayoutInflater.from(mContext);  
  15.         this.mContext = mContext;  
  16.         this.mData = mData;  
  17.     }  
  18.   
  19.     @Override  
  20.     public int getCount() {  
  21.         return mData == null ? 0 : mData.size();  
  22.     }  
  23.   
  24.     @Override  
  25.     public Object getItem(int position) {  
  26.         return mData.get(position);  
  27.     }  
  28.   
  29.     @Override  
  30.     public long getItemId(int position) {  
  31.         return position;  
  32.     }  
  33. }  

5、MyAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/11. 
  3.  * 继承ComAdapter抽象类,而且使用了通用的ViewHolder的适配器 
  4.  */  
  5. public class MyAdapter<T> extends ComAdapter {  
  6.   
  7.     public MyAdapter(Context mContext, List<T> mData){  
  8.         super(mContext, mData);  
  9.     }  
  10.   
  11.     @Override  
  12.     public View getView(int position, View convertView, ViewGroup parent) {  
  13.         //实例化一个ViewHolder  
  14.         ViewHolder holder = ViewHolder.getHolder(mContext, R.layout.item_string_listview, convertView, parent);  
  15.         //获取控件  
  16.         TextView view = holder.getItemView(R.id.tv_title);  
  17.         //给控件赋值  
  18.         view.setText((String) mData.get(position));  
  19.         return holder.getmConvertView();  
  20.     }  
  21. }  

6、item_string_listview.xml

同上


四、进一步打造通用的Adapter——使用匿名内部类获得适配器

1、MainActiviy.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.   
  3.     private List<String> mData = new ArrayList<String>(Arrays.asList("HongYang""GuoLin""RenYuGang""Jiatao"));  
  4.     private Context context;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         context = this;  
  10.         setContentView(R.layout.activity_main);  
  11.         ListView listView = (ListView) findViewById(R.id.listview);  
  12.   
  13.         //直接使用匿名内部类即可取得适配器  
  14.         ComAdapter mAdapter = new ComAdapter<String>(context, mData, R.layout.item_string_listview) {  
  15.             @Override  
  16.             public void convert(ViewHolder holder, String item) {//通过ViewHolder找到iew,通过Item设置值  
  17.                 TextView view =holder.getItemView(R.id.tv_title);  
  18.                 view.setText(item);  
  19.             }  
  20.         };  
  21.         listView.setAdapter(mAdapter);  
  22.     }  
  23. }  

2、activity_main.xml

同上

3、ViewHolder.java

同上

4、ComAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/11. 
  3.  * 通用的适配器 
  4.  * 1、所有的Adapter的第一行(ViewHolder viewHolder = getViewHolder(position, convertView,parent);)和 最后一行:return viewHolder.getConvertView();一定是一样的。 
  5.  * 2、那么我们可以这样做:我们把第一行和最后一行写死,把中间变化的部分抽取出来,这不就是OO的设计原则嘛。 
  6.  */  
  7. public abstract class ComAdapter<T> extends BaseAdapter {  
  8.   
  9.     protected LayoutInflater mLayoutInflater;  
  10.     protected Context mContext;  
  11.     protected List<T> mData;  
  12.     protected int mItemLayoutId;  
  13.   
  14.     public ComAdapter(Context mContext, List<T> mData, int mItemLayoutId) {  
  15.         mLayoutInflater = LayoutInflater.from(mContext);  
  16.         this.mContext = mContext;  
  17.         this.mData = mData;  
  18.         this.mItemLayoutId = mItemLayoutId;  
  19.     }  
  20.   
  21.     @Override  
  22.     public int getCount() {  
  23.         return mData == null ? 0 : mData.size();  
  24.     }  
  25.   
  26.     @Override  
  27.     public T getItem(int position) {  
  28.         return mData.get(position);  
  29.     }  
  30.   
  31.     @Override  
  32.     public long getItemId(int position) {  
  33.         return position;  
  34.     }  
  35.   
  36.     @Override  
  37.     public View getView(int position, View convertView, ViewGroup parent) {  
  38.         //实例化一个ViewHolder  
  39.         ViewHolder holder = getViewHolder(position, convertView, parent);  
  40.         //使用对外公开的convert方法,通过ViewHolder把View找到,通过Item设置值  
  41.         convert(holder, getItem(position));  
  42.         return holder.getmConvertView();  
  43.     }  
  44.   
  45.     private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent){  
  46.         return ViewHolder.getHolder(mContext, mItemLayoutId, convertView, parent);  
  47.     }  
  48.   
  49.     /** 
  50.      * 对外公布了一个convert方法,并且还把ViewHolder和本item对应的Bean对象给传出去 
  51.      * 现在convert方法里面需要干嘛呢?通过ViewHolder把View找到,通过Item设置值 
  52.      */  
  53.     public abstract void convert(ViewHolder holder, T item);  
  54.   
  55. }  

5、MyAdapter.java

不再使用,删除即可

6、item_string_listview.xml

同上


五、打造终极版通用Adapter——进一步完善ViewHolder使匿名内部类中convert方法只需一行代码即能给对应的view赋值

1、MainActiviy.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 通过匿名内部类获得适配器,适配内的convert方法只需一行代码即可为对应的view赋值 
  3.  */  
  4. public class MainActivity extends Activity {  
  5.   
  6.     private List<String> mData = new ArrayList<String>(Arrays.asList("HongYang""GuoLin""RenYuGang""Jiatao"));  
  7.     private Context context;  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         context = this;  
  13.         setContentView(R.layout.activity_main);  
  14.         ListView listView = (ListView) findViewById(R.id.listview);  
  15.   
  16.         //直接使用匿名内部类即可取得适配器  
  17.         ComAdapter mAdapter = new ComAdapter<String>(context, mData, R.layout.item_string_listview) {  
  18.             @Override  
  19.             public void convert(ViewHolder holder, String item) {//通过ViewHolder找到view,通过Item设置值  
  20.                 holder.setTextView(R.id.tv_title, item);//只需一行代码即可实现:给对应的view赋值  
  21.             }  
  22.         };  
  23.         listView.setAdapter(mAdapter);  
  24.     }  
  25. }  

2、activity_main.xml

同上

3、ViewHolder.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * Created by jiatao on 2016/6/11. 
  3.  * 通用的ViewHolder 
  4.  * 1、ViewHolder的作用是通过convertView.setTag与convertView进行绑定,然后当convertView复用时,直接从与之对于的ViewHolder(getTag)中拿到convertView布局中的控件,省去了findViewById的时间; 
  5.  * 2、也就是说,实际上们每个convertView会绑定一个ViewHolder对象,这个viewHolder主要用于帮convertView存储布局中的控件; 
  6.  * 3、那么我们只要写出一个通用的ViewHolder,然后对于任意的convertView,提供一个对象让其setTag即可; 
  7.  * 4、既然是通用,那么我们这个ViewHolder就不可能含有各种控件的成员变量了,因为每个Item的布局是不同的,最好的方式是什么呢? 
  8.  * 5、提供一个容器,专门存每个Item布局中的所有控件,而且还要能够查找出来;既然需要查找,那么ListView肯定是不行了,需要一个键值对进行保存,键为控件的Id,值为控件的引用; 
  9.  * 6、相信大家立刻就能想到Map;但是我们不用Map,因为有更好的替代类,就是我们android提供的SparseArray这个类,和Map类似,但是比Map效率,不过键只能为Integer. 
  10.  * <p/> 
  11.  * 最后的封装: 
  12.  * 我们现在在convertView里面需要这样: 
  13.  * 
  14.  * @Override public void convert(ViewHolder viewHolder, String item) { 
  15.  * TextView view = viewHolder.getView(R.id.id_tv_title); 
  16.  * view.setText(item); 
  17.  * } 
  18.  * 我们细想一下,其实布局里面的View常用也就那么几种:ImageView,TextView,Button,CheckBox等等; 
  19.  * 那么我觉得ViewHolder还可以封装一些常用的方法,比如setText(id,String);setImageResource(viewId, resId);setImageBitmap(viewId, bitmap); 
  20.  */  
  21. public class ViewHolder {  
  22.   
  23.     private SparseArray<View> mViews;  
  24.     private View mConvertView;  
  25.   
  26.     //构造函数  
  27.     private ViewHolder(Context context, int resLayoutId, ViewGroup parent) {  
  28.         this.mViews = new SparseArray<View>();  
  29.         this.mConvertView = LayoutInflater.from(context).inflate(resLayoutId, parent, false);  
  30.         this.mConvertView.setTag(this);  
  31.     }  
  32.   
  33.     //获取一个ViewHolder  
  34.     public static ViewHolder getHolder(Context context, int resLayoutId, View convertView, ViewGroup parent) {  
  35.         if (convertView == null) {  
  36.             return new ViewHolder(context, resLayoutId, parent);  
  37.         }  
  38.         return (ViewHolder) convertView.getTag();  
  39.     }  
  40.   
  41.     //通过控件的id获取对应的控件,如果没有则加入mViews;记住 <T extends View> T 这种用法  
  42.     public <T extends View> T getItemView(int viewId) {  
  43.         View view = mViews.get(viewId);  
  44.         if (view == null) {  
  45.             view = mConvertView.findViewById(viewId);  
  46.             mViews.put(viewId, view);  
  47.         }  
  48.         return (T) view;  
  49.     }  
  50.   
  51.     //获得一个convertView  
  52.     public View getmConvertView() {  
  53.         return mConvertView;  
  54.     }  
  55.   
  56.     /** 
  57.      * 为TextView赋值 
  58.      */  
  59.     public ViewHolder setTextView(int viewId, String text) {  
  60.         TextView view = getItemView(viewId);  
  61.         view.setText(text);  
  62.         return this;  
  63.     }  
  64.   
  65.     /** 
  66.      * 为ImageView赋值——drawableId 
  67.      */  
  68.     public ViewHolder setImageResource(int viewId, int drawableId) {  
  69.         ImageView view = getItemView(viewId);  
  70.         view.setImageResource(drawableId);  
  71.         return this;  
  72.     }  
  73.   
  74.     /** 
  75.      * 为ImageView赋值——bitmap 
  76.      */  
  77.     public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {  
  78.         ImageView view = getItemView(viewId);  
  79.         view.setImageBitmap(bitmap);  
  80.         return this;  
  81.     }  
  82.   
  83. }  

4、ComAdapter.java

同上

5、MyAdapter.java

不再使用,删除即可

6、item_string_listview.xml

同上


六、实例运用

1、MainActiviy.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 运用万能适配器实现复杂视图的实例 
  3.  */  
  4. public class MainActivity extends Activity {  
  5.   
  6.     private List<ArticleBean> beanlist;  
  7.     private Context context;  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         context = this;  
  13.         setContentView(R.layout.activity_main);  
  14.         ListView listView = (ListView) findViewById(R.id.listview);  
  15.   
  16.         beanlist = new ArrayList<ArticleBean>();  
  17.         for(int i=1;i<10;i++){  
  18.             ArticleBean bean = new ArticleBean("文章"+i,"内容"+i+":周三早上丢失了红色钱包,在食堂二楼","2016060"+i,"1718013691"+i);  
  19.             beanlist.add(bean);  
  20.         }  
  21.   
  22.         //直接使用匿名内部类即可取得适配器  
  23.         ComAdapter mAdapter = new ComAdapter<ArticleBean>(context, beanlist, R.layout.item_example_listview) {  
  24.             @Override  
  25.             public void convert(ViewHolder holder, ArticleBean item) {//通过ViewHolder找到view,通过Item设置值  
  26.                 holder.setTextView(R.id.tv_title, item.getTitle());  
  27.                 holder.setTextView(R.id.tv_describe, item.getContent());  
  28.                 holder.setTextView(R.id.tv_time, item.getTime());  
  29.                 holder.setTextView(R.id.tv_phone, item.getPhone());  
  30.             }  
  31.         };  
  32.         listView.setAdapter(mAdapter);  
  33.     }  
  34. }  

2、activity_main.xml

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".act.MainActivity">  
  7.   
  8.     <ListView  
  9.         android:id="@+id/listview"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent" />  
  12. </RelativeLayout>  

3、ViewHolder.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ViewHolder {  
  2.   
  3.     private SparseArray<View> mViews;  
  4.     private View mConvertView;  
  5.   
  6.     //构造函数  
  7.     private ViewHolder(Context context, int resLayoutId, ViewGroup parent) {  
  8.         this.mViews = new SparseArray<View>();  
  9.         this.mConvertView = LayoutInflater.from(context).inflate(resLayoutId, parent, false);  
  10.         this.mConvertView.setTag(this);  
  11.     }  
  12.   
  13.     //获取一个ViewHolder  
  14.     public static ViewHolder getHolder(Context context, int resLayoutId, View convertView, ViewGroup parent) {  
  15.         if (convertView == null) {  
  16.             return new ViewHolder(context, resLayoutId, parent);  
  17.         }  
  18.         return (ViewHolder) convertView.getTag();  
  19.     }  
  20.   
  21.     //通过控件的id获取对应的控件,如果没有则加入mViews;记住 <T extends View> T 这种用法  
  22.     public <T extends View> T getItemView(int viewId) {  
  23.         View view = mViews.get(viewId);  
  24.         if (view == null) {  
  25.             view = mConvertView.findViewById(viewId);  
  26.             mViews.put(viewId, view);  
  27.         }  
  28.         return (T) view;  
  29.     }  
  30.   
  31.     //获得一个convertView  
  32.     public View getmConvertView() {  
  33.         return mConvertView;  
  34.     }  
  35.   
  36.     /** 
  37.      * 为TextView赋值 
  38.      */  
  39.     public ViewHolder setTextView(int viewId, String text) {  
  40.         TextView view = getItemView(viewId);  
  41.         view.setText(text);  
  42.         return this;  
  43.     }  
  44.   
  45.     /** 
  46.      * 为ImageView赋值——drawableId 
  47.      */  
  48.     public ViewHolder setImageResource(int viewId, int drawableId) {  
  49.         ImageView view = getItemView(viewId);  
  50.         view.setImageResource(drawableId);  
  51.         return this;  
  52.     }  
  53.   
  54.     /** 
  55.      * 为ImageView赋值——bitmap 
  56.      */  
  57.     public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {  
  58.         ImageView view = getItemView(viewId);  
  59.         view.setImageBitmap(bitmap);  
  60.         return this;  
  61.     }  
  62.   
  63. }  

4、ComAdapter.java

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public abstract class ComAdapter<T> extends BaseAdapter {  
  2.   
  3.     protected LayoutInflater mLayoutInflater;  
  4.     protected Context mContext;  
  5.     protected List<T> mData;  
  6.     protected int mItemLayoutId;  
  7.   
  8.     public ComAdapter(Context mContext, List<T> mData, int mItemLayoutId) {  
  9.         mLayoutInflater = LayoutInflater.from(mContext);  
  10.         this.mContext = mContext;  
  11.         this.mData = mData;  
  12.         this.mItemLayoutId = mItemLayoutId;  
  13.     }  
  14.   
  15.     @Override  
  16.     public int getCount() {  
  17.         return mData == null ? 0 : mData.size();  
  18.     }  
  19.   
  20.     @Override  
  21.     public T getItem(int position) {  
  22.         return mData.get(position);  
  23.     }  
  24.   
  25.     @Override  
  26.     public long getItemId(int position) {  
  27.         return position;  
  28.     }  
  29.   
  30.     @Override  
  31.     public View getView(int position, View convertView, ViewGroup parent) {  
  32.         //实例化一个ViewHolder  
  33.         ViewHolder holder = getViewHolder(position, convertView, parent);  
  34.         //使用对外公开的convert方法,通过ViewHolder把View找到,通过Item设置值  
  35.         convert(holder, getItem(position));  
  36.         return holder.getmConvertView();  
  37.     }  
  38.   
  39.     private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent){  
  40.         return ViewHolder.getHolder(mContext, mItemLayoutId, convertView, parent);  
  41.     }  
  42.   
  43.     /** 
  44.      * 对外公布了一个convert方法,并且还把ViewHolder和本item对应的Bean对象给传出去 
  45.      * 现在convert方法里面需要干嘛呢?通过ViewHolder把View找到,通过Item设置值 
  46.      */  
  47.     public abstract void convert(ViewHolder holder, T item);  
  48.   
  49. }  

5、item_string_listview.xml

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="#ffffff"  
  6.     android:orientation="vertical"  
  7.     android:padding="10dp">  
  8.   
  9.     <TextView  
  10.         android:id="@+id/tv_title"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"  
  13.         android:singleLine="true"  
  14.         android:text="红色钱包"  
  15.         android:textColor="#444444"  
  16.         android:textSize="16sp"></TextView>  
  17.   
  18.     <TextView  
  19.         android:id="@+id/tv_describe"  
  20.         android:layout_width="match_parent"  
  21.         android:layout_height="wrap_content"  
  22.         android:layout_below="@id/tv_title"  
  23.         android:layout_marginTop="10dp"  
  24.         android:maxLines="2"  
  25.         android:minLines="1"  
  26.         android:text="周三早上丢失了红色钱包,在食堂二楼"  
  27.         android:textColor="#898989"  
  28.         android:textSize="16sp"></TextView>  
  29.   
  30.     <TextView  
  31.         android:id="@+id/tv_time"  
  32.         android:layout_width="wrap_content"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_below="@id/tv_describe"  
  35.         android:layout_marginTop="10dp"  
  36.         android:text="20130240122"  
  37.         android:textColor="#898989"  
  38.         android:textSize="12sp"></TextView>  
  39.   
  40.     <TextView  
  41.         android:id="@+id/tv_phone"  
  42.         android:layout_width="wrap_content"  
  43.         android:layout_height="wrap_content"  
  44.         android:layout_alignParentRight="true"  
  45.         android:layout_below="@id/tv_describe"  
  46.         android:layout_marginTop="10dp"  
  47.         android:background="#5cbe6c"  
  48.         android:drawableLeft="@mipmap/icon_photo"  
  49.         android:drawablePadding="5dp"  
  50.         android:paddingBottom="3dp"  
  51.         android:paddingLeft="5dp"  
  52.         android:paddingRight="5dp"  
  53.         android:paddingTop="3dp"  
  54.         android:text="138024249542"  
  55.         android:textColor="#ffffff"  
  56.         android:textSize="12sp"></TextView>  
  57.   
  58. </RelativeLayout>  

运行结果如图:


0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值