BaseAdapter的优化

Posted 楚天千里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BaseAdapter的优化相关的知识,希望对你有一定的参考价值。

传统的
 1 package cct.commonadapter.bean;
 2 import android.content.Context;
 3 import android.view.LayoutInflater;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6 import android.widget.BaseAdapter;
 7 import android.widget.TextView;
 8 import java.util.List;
 9 import cct.commonadapter.R;
10 
11 public class MyAdapter extends BaseAdapter {
12     private LayoutInflater inflater;
13     private List<Message> mdata;
14     public MyAdapter(Context context,List<Message> mdata){
15          inflater=LayoutInflater.from(context);
16         this.mdata=mdata;
17     }
18     @Override
19     public int getCount() {
20         return mdata.size();
21     }
22     @Override
23     public Object getItem(int position) {
24         return mdata.get(position);
25     }
26     @Override
27     public long getItemId(int position) {
28         return position;
29     }
30     @Override
31     public View getView(int position, View convertView, ViewGroup parent) {
32         ViewHolders holder;
33         if(convertView==null){
34             convertView=inflater.inflate(R.layout.item,parent,false);
35             holder=new ViewHolders();
36             holder.mtitle= (TextView) convertView.findViewById(R.id.mtitle);
37             holder.mdesc= (TextView) convertView.findViewById(R.id.mdesc);
38             holder.mtime= (TextView) convertView.findViewById(R.id.mtime);
39             holder.mphone= (TextView) convertView.findViewById(R.id.mphone);
40             convertView.setTag(holder);
41         }
42         else {
43             holder = (ViewHolders) convertView.getTag();
44         }
45             Message ms = mdata.get(position);
46             holder.mtitle.setText(ms.getTitle());
47             holder.mdesc.setText(ms.getDesc());
48             holder.mtime.setText(ms.getTime());
49             holder.mphone.setText(ms.getPhone());
50 
51         return convertView;
52     }
53     private  class ViewHolders
54     {
55         TextView mtitle;
56         TextView mdesc;
57         TextView mtime;
58         TextView mphone;
59     }
60 }

 附上Msessage类

 1     public class Message {
 2     private String title;
 3     private String desc;
 4     private String time;
 5     private String phone;
 6     public Message(int position) {
 7     }
 8     public Message(String title, String desc, String time, String phone) {
 9         this.title = title;
10         this.desc = desc;
11         this.time = time;
12         this.phone = phone;
13     }
14     public String getDesc() {
15         return desc;
16     }
17 
18     public void setDesc(String desc) {
19         this.desc = desc;
20     }
21 
22     public String getTitle() {
23         return title;
24     }
25 
26     public void setTitle(String title) {
27         this.title = title;
28     }
29 
30     public String getTime() {
31         return time;
32     }
33 
34     public void setTime(String time) {
35         this.time = time;
36     }
37 
38     public String getPhone() {
39         return phone;
40     }
41 
42     public void setPhone(String phone) {
43         this.phone = phone;
44     }
45 
46 }

 

万能适配器

//CommonAdapter
1
package cct.commonadapter.adapterUtil; 2 import android.content.Context; 3 import android.view.LayoutInflater; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import java.util.List; 8 import cct.commonadapter.R; 9 10 public abstract class CommonAapter<T> extends BaseAdapter { 11 protected Context context; 12 protected LayoutInflater inflater; 13 protected List<T> mdata; 14 15 public CommonAapter(Context context, List<T> mdata) { 16 this.context=context; 17 inflater=LayoutInflater.from(context); 18 this.mdata=mdata; 19 } 20 @Override 21 public int getCount() { 22 return mdata.size(); 23 } 24 25 @Override 26 public T getItem(int position) { 27 return mdata.get(position); 28 } 29 30 @Override 31 public long getItemId(int position) { 32 return position; 33 } 34 @Override 35 public View getView(int position, View convertView, ViewGroup parent) 36 { 37 ViewHolder holder=ViewHolder.get(context,convertView,parent, R.layout.item,position); 38 covert(holder,getItem(position)); 39 return holder.getMconvertView(); 40 } 41 public abstract void covert(ViewHolder holder, T t) ; 42 43 }

 

 

 通用的Viewholder

  1 package cct.commonadapter.adapterUtil;
  2 import android.content.Context;
  3 import android.graphics.Bitmap;
  4 import android.util.SparseArray;
  5 import android.view.LayoutInflater;
  6 import android.view.View;
  7 import android.view.ViewGroup;
  8 import android.widget.ImageView;
  9 import android.widget.TextView;
 10 
 11 public  class ViewHolder {
 12     private SparseArray<View> mViews;
 13     protected int mPosition;
 14     private View mConvertView;
 15     private Context mContext;
 16     protected int mLayoutId;
 17 
 18     /**初始化一个ViewHolder
 19      * @param context
 20      * @param itemView
 21      * @param parent
 22      * @param position
 23      */
 24     public ViewHolder(Context context, View itemView, ViewGroup parent, int position) {
 25         mContext = context;
 26         mConvertView = itemView;
 27         mPosition = position;
 28         mViews = new SparseArray<View>();
 29         mConvertView.setTag(this);
 30     }
 31 
 32     /**入口方法:用来判断页面是否加载过
 33      * @param context
 34      * @param convertView
 35      * @param parent
 36      * @param layoutId
 37      * @param position
 38      * @return
 39      */
 40     public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
 41        if (convertView == null)
 42         {
 43             View itemView = LayoutInflater.from(context).inflate(layoutId, parent,
 44                     false);
 45             ViewHolder holder = new ViewHolder(context, itemView, parent, position);
 46             holder.mLayoutId = layoutId;
 47             return holder;
 48         } else
 49         {
 50             ViewHolder holder = (ViewHolder) convertView.getTag();
 51             holder.mPosition = position;
 52             return holder;
 53         }
 54     }
 55     public View getMconvertView() {
 56         return mConvertView;
 57     }
 58 
 59     /**
 60      * 通过viewId获取View
 61      * @param viewId
 62      * @param <T>
 63      * @return
 64      */
 65     public <T extends View>T getView(int viewId){
 66         View view=mview.get(viewId);
 67         if(view==null)
 68         {view=mconvertView.findViewById(viewId);
 69             mview.put(viewId,view);
 70         }
 71         return (T)view;
 72     }
 73     public int getLayoutId()
 74     {
 75         return mLayoutId;
 76     }
 77 
 78     public void updatePosition(int position)
 79     {
 80         mPosition = position;
 81     }
 82 
 83     public int getItemPosition()
 84     {
 85         return mPosition;
 86     }
 87 
 88     /**通过得到控件id,和类的属性名
 89      * @param viewId
 90      * @param text
 91      * @return
 92      */
 93     public ViewHolder setTexts(int viewId,String text){
 94         TextView tv=getView(viewId);
 95         tv.setText(text);
 96         return this;
 97     }
 98     public ViewHolder setImageBitmap(int viewId, Bitmap map){
 99         ImageView iv=getView(viewId);
100         iv.setImageBitmap(map);
101         return this;
102     }
103     public ViewHolder setImageResource(int viewId, int resId)
104     {
105         ImageView view = getView(viewId);
106         view.setImageResource(resId);
107         return this;
108     }
109 public ViewHolder setImageDrawable(int viewId, Drawable drawable)
110     {
111         ImageView view = getView(viewId);
112         view.setImageDrawable(drawable);
113         return this;
114     }
115 
116     public ViewHolder setBackgroundColor(int viewId, int color)
117     {
118         View view = getView(viewId);
119         view.setBackgroundColor(color);
120         return this;
121     }
122 
123     public ViewHolder setBackgroundRes(int viewId, int backgroundRes)
124     {
125         View view = getView(viewId);
126         view.setBackgroundResource(backgroundRes);
127         return this;
128     }
129 
130     public ViewHolder setTextColor(int viewId, int textColor)
131     {
132         TextView view = getView(viewId);
133         view.setTextColor(textColor);
134         return this;
135     }
136 
137     public ViewHolder setTextColorRes(int viewId, int textColorRes)
138     {
139         TextView view = getView(viewId);
140         view.setTextColor(mContext.getResources().getColor(textColorRes));
141         return this;
142     }
143 }

 

 

 

任意一个适配器只需要继承上面封装好的适配器

 1 package cct.commonadapter.bean;
 2 import android.content.Context;
 3 import android.view.LayoutInflater;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6 import android.widget.BaseAdapter;
 7 import android.widget.TextView;
 8 import java.util.List;
 9 import cct.commonadapter.R;
10 import cct.commonadapter.adapterUtil.CommonAapter;
11 import cct.commonadapter.adapterUtil.ViewHolder;
12 import cct.commonadapter.bean.Message;
13 
14 public class MyCommonAdapter extends CommonAapter<Message> {
15     public MyCommonAdapter(Context context, List<Message> mdata){
16         super(context,mdata);
17     }
18 
19     @Override
20     public void covert(ViewHolder holder, Message ms) {
21 
22         holder.setTexts(R.id.mtitle,ms.getTitle())
23                 .setTexts(R.id.mdesc,ms.getDesc())
24                 .setTexts(R.id.mtime,ms.getTime())
25                 .setTexts(R.id.mphone,ms.getPhone());
26     }
27 }

 

以上是关于BaseAdapter的优化的主要内容,如果未能解决你的问题,请参考以下文章

BaseAdapter优化

2.4.6 BaseAdapter优化

BaseAdapter的优化

如何在填充了 BaseAdapter 的 Fragment 中刷新 ListView?

Android适配器之ArrayAdapterSimpleAdapter和BaseAdapter的简单用法

如何从片段中检索gridview中的图像?