Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段(转)

摘自:http://blog.csdn.net/shakespeare001/article/details/7926783

Adapter是连接后端数据和前端显示的适配器接口,是数据Data和UI(视图View)之间一个重要的纽带。

下图表达了数据Data、适配器Adapter、UI视图View三者之间的紧密关系。

注意:当数据发生改变时都要用Adater调用自己notifyDataSetChanged()方法来通知UI视图View

        重新刷新界面展示新的数据源。

收藏ArrayAdapter、SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法。

1.ArrayAdapter


只可以简单的显示一行文本

代码片段:

  1. ArrayAdapter<String> adapter = new ArrayAdapter<String>(  
  2.                 this,  
  3.                 R.layout.item,//只能有一个定义了id的TextView  
  4.                 data);//data既可以是数组,也可以是List集合  


 另外 onItemClick(AdapterView<?> parent, View view, int position, long id)

 参数介绍如下:

 parent:被单击的ListView对象

 view:被单击的那一项

 position:被单击的那一项在ListView中的位置

 id:被选中的那一行的id

 

ArrayAdapter三种适配器样式:

1 多选ListView的item条目: android.R.layout.simple_list_item_multiple_choice 

2 单选ListView的item条目: android.R.layout.simple_list_item_single_choice

3 全选ListView的item条目: android.R.layout.simlple_list_item_checked

 

2.SimpleAdapter


可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),
也是只是单纯的负责显示(当然可以设计复杂点的布局来显示复杂列表),例如,每行显示不同背景等。

代码片段:

  1. List<Map<String,Object>> mData= new ArrayList<Map<String,Object>>();;  
  2. for(int i =0; i < lengh; i++) {      
  3.     Map<String,Object> item = new HashMap<String,Object>();      
  4.     item.put("image", R.drawable.portrait);      
  5.     item.put("title", mListTitle[i]);      
  6.     item.put("text", mListStr[i]);      
  7.     mData.add(item);       
  8. }      
  9. SimpleAdapter adapter = new SimpleAdapter(  
  10.                 this,            --是上下文对象
  11.                 mData,        --mData是基于Map的List,这个Map集合包含了ListView每一个item视图需要的数据
  12.                 R.layout.item,    --是ListView每一个item条目样式的视图布局  
  13.                 new String[]{"image","title","text"},        --是一个名称的数组,每个名称是为了在ArrayList中的每个索引Map的key的名称
  14.                 new int[]{R.id.image,R.id.title,R.id.text});     --是一个用于显示ListView中的每一个item条目样式的视图的id的数组。


3.BaseAdapter

可以实现复杂的列表布局,由于BaseAdapter是一个抽象类,使用该类需要自己写一个适配器继承该类,
正是由于继承了该类,需要我们重写一些方法,让我们可以在代码里控制列表的样式,更加灵活。

继承BaseAdapter,要覆写getView()方法,此方法返回一个ListView每个item的视图View

代码片段:

    1. private class MyListAdapter extends BaseAdapter{    
    2.         private Context mContext;    
    3.         private int[] colors=new int[]{0xff626569,0xff4f5257 };    
    4.          public MyListAdapter(Context context){    
    5.              mContext=context;    
    6.          }    
    7.         @Override    
    8.         public int getCount() {    
    9.             // TODO Auto-generated method stub    
    10.             return mListText.length;    
    11.         }    
    12.     
    13.         @Override    
    14.         public Object getItem(int position) {    
    15.             // TODO Auto-generated method stub    
    16.             return position;    
    17.         }    
    18.     
    19.         @Override    
    20.         public long getItemId(int position) {    
    21.             // TODO Auto-generated method stub    
    22.             return position;    
    23.         }    
    24.     
    25.         @Override    
    26.         public View getView(int position, View convertView, ViewGroup parent) {    
    27.             ImageView image=null;  //这些控件可以单独封装成一个类(Holder),便与优化  
    28.             TextView title=null;    
    29.             TextView  content=null;    
    30.             if(convertView==null){    
    31.                 convertView=LayoutInflater.from(mContext).inflate(R.layout.colorlist, null);    
    32.                 image=(ImageView) convertView.findViewById(R.id.color_image);    
    33.                 title=(TextView) convertView.findViewById(R.id.color_title);    
    34.                 content=(TextView) convertView.findViewById(R.id.color_text);    
    35.             }   
    36.             int colorPos=position%colors.length;    
    37.             convertView.setBackgroundColor(colors[colorPos]);    
    38.             title.setText(mListTitle[position]);    
    39.             content.setText(mListText[position]);    
    40.             image.setImageResource(R.drawable.portrait);    
    41.                 
    42.             return convertView;    
    43.         }    
    44.             
    45.     }    
    46.   
    47. --------------------------下面样例列表页的控件单独封装成了一个类(Holder),便与优化-----  
    48.   
    49.   
    50.  public class MyBaseAdapter extends BaseAdapter{  
    51.        
    52.            private LayoutInflater mInflater;  
    53.             public MyAdapter(Context context){  
    54.                this.mInflater = LayoutInflater.from(context);  
    55.           }  
    56.             @Override  
    57.            public int getCount() {  
    58.                 // TODO Auto-generated method stub  
    59.                 return mData.size();  
    60.             }  
    61.        
    62.             @Override  
    63.             public Object getItem(int arg0) {  
    64.                 // TODO Auto-generated method stub  
    65.                 return null;  
    66.            }  
    67.        
    68.             @Override  
    69.             public long getItemId(int arg0) {  
    70.                 // TODO Auto-generated method stub  
    71.                 return 0;  
    72.             }  
    73.        
    74.             @Override  
    75.             public View getView(int position, View convertView, ViewGroup parent) {  
    76.                    
    77.                 ViewHolder holder = null;  
    78.                 if (convertView == null) {  
    79.                     holder=new ViewHolder();   
    80.                     convertView = mInflater.inflate(R.layout.vlist2, null);  
    81.                     holder.img = (ImageView)convertView.findViewById(R.id.img);  
    82.                     holder.title = (TextView)convertView.findViewById(R.id.title);  
    83.                     holder.info = (TextView)convertView.findViewById(R.id.info);  
    84.                     holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);  
    85.                     convertView.setTag(holder);  
    86.                        
    87.                 }else {                       
    88.                     holder = (ViewHolder)convertView.getTag();  
    89.                 }  
    90.                 holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));  
    91.                 holder.title.setText((String)mData.get(position).get("title"));  
    92.                 holder.info.setText((String)mData.get(position).get("info"));  
    93.                 //给每一个列表后面的按钮添加响应事件  
    94.                 holder.viewBtn.setOnClickListener(new View.OnClickListener() {  
    95.                     @Override  
    96.                     public void onClick(View v) {  
    97.                         showInfo();                  
    98.                     }  
    99.                 });  
    100.   
    101.                 return convertView;  
    102.             }  
    103.         ------------  
    104.         public final class ViewHolder{  
    105.             public ImageView img;  
    106.             public TextView title;  
    107.             public TextView info;  
    108.             public Button viewBtn;  
    109.         } 
原文地址:https://www.cnblogs.com/YangBinChina/p/4001459.html