欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ListView之适配器的使用 适配器ListviewArrayAdapterSimpleAdapterBaseAdapter 

程序员文章站 2022-05-22 22:59:21
...

ListView之适配器的使用,包含了ArrayAdapter,SimpleAdapter ,BaseAdapter等适配器。

 

 

1:ArrayAdapter

 

 

 

Java代码
  1. /**** 
  2.  * 
  3.  * 
  4.  * ArrayAdapter 
  5.  * @author Administrator 
  6.  * 
  7.  */  
  8. public class ArrayAdapterActivity extends Activity {  
  9.    
  10.    private ListView mListView;  
  11.     //定义一个String数组,数组里的数据就是ListView里的一项  
  12.    String[] arrayDate={"笑傲江湖","风清扬","令狐冲","岳不群","乔峰","虚竹","段誉","中神通","东邪","西毒","南帝","北丐"};  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_arrayadapter);  
  17.         initView();  
  18.     }  
  19.     private void initView() {  
  20.       mListView=(ListView)findViewById(R.id.listView1);  
  21.       //新建一个数组适配器ArrayAdapter绑定数据,参数(当前的Activity,布局文件,数据源)  
  22.       //android.R.layout.simple_list_item_1      本身自带布局  
  23.       ArrayAdapter<String>  adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,arrayDate);  
  24.       //视图(ListView)加载适配器  
  25.       mListView.setAdapter(adapter);  
  26.       mListView.setOnItemClickListener(new OnItemClickListener() {  
  27.    
  28.          @Override  
  29.          public voidonItemClick(AdapterView<?> parent, View view,  
  30.                 int position,long id) {  
  31.              
  32.             Toast.makeText(ArrayAdapterActivity.this,arrayDate[position],1).show();  
  33.              
  34.          }  
  35.       });  
  36.    }  
  37.      
  38. }  



预览效果:

 

ListView之适配器的使用
            
    
    
        适配器ListviewArrayAdapterSimpleAdapterBaseAdapter 

 

2:SimpleAdapter

 

使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。

 

归纳步骤:

 

 

 

1、准备数据源:指定由Map组成的List数据源

 

2、新建适配器,设置键值名和对应控件id,绑定数据

 

3、视图加载适配器

 

参数:

 

new SimpleAdapter(context, data, resource, from, to)

 

context ------SimpleAdapter关联的View的运行环境

 

data ---------一个Map组成的List。在列表中的每个条目对应列表中的一行,每一个map中应该包含所有在from参数中指定的键

 

resource ------ 一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID

 

from ---------- 一个将被添加到Map映射上的键名

 

to  -------------将绑定数据的视图的ID,跟from参数对应

 

 

 

代码:

 

 

 

Java代码
  1. /**** 
  2.  * 
  3.  * 
  4.  * SimpleAdapter 
  5.  * 
  6.  * @author Administrator 
  7.  * 
  8.  */  
  9. public class  SimpleAdapterActivity extends Activity {  
  10.    
  11.    private ListView mshow_list;  
  12.    String[] name = { "张三","李四","小星星","静静","明明","小张" };  
  13.    
  14.    int[] img = {R.drawable.a2, R.drawable.a3,R.drawable.a4, R.drawable.a5,R.drawable.a6,R.drawable.ic_launcher};  
  15.    protected void  onCreate(android.os.Bundle savedInstanceState) {  
  16.        
  17.       super.onCreate(savedInstanceState);  
  18.       //加载布局文件  
  19.       setContentView(R.layout.activity_simpleadapter);  
  20.       //2.获取listview控件的对象  
  21.       mshow_list=(ListView)findViewById(R.id.show_listview);  
  22.        
  23.       /** 
  24.        * 第四步:定义SimpleAdapter(并加载对应item布局文件,获得对应的keY,获得对应item布局文件中的组件的id 
  25.        * 
  26.        * 第二个参数data:数据源 
  27.        * 第三个参数resource :listView每个item对应的布局文件 
  28.        * 第四个参数 from: 
  29.        * 第五个参数to: 
  30.        *new String[]{对应的key}v 
  31.        */  
  32.       SimpleAdapter simpleAdapter=new SimpleAdapter(this, get_data(),  
  33.             R.layout.item_simple,new String[]{  
  34.          "type","age","img"},newint[]{R.id.type_txt,R.id.age_txt,R.id.img});  
  35.        
  36.       //第五步:通过setAdapter将适配器绑定到listView控件  
  37.       mshow_list.setAdapter(simpleAdapter);  
  38.              
  39.        
  40.        
  41.    };  
  42.    
  43.    /*** 
  44.     * 数据源 
  45.     * 
  46.     * 
  47.     */  
  48.    private  ArrayList<Map<String, Object>> get_data() {  
  49.       // 定义一个ArrayList的集合(集合中又封装一个map类型的集合)  
  50.       ArrayList<Map<String, Object>>data_list = new ArrayList<Map<String,Object>>();  
  51.       for (int i = 0; i<name.length; i++) {  
  52.          // key,value intstring map不能new map  
  53.          Map<String, Object> data_map = newHashMap<String, Object>();  
  54.          data_map.put("type", name[i]);  
  55.          data_map.put("age", i + 10+"岁");  
  56.          data_map.put("img", img[i]);  
  57.          // 将map集合添加(封装)到ArrayList集合中  
  58.          data_list.add(data_map);  
  59.    
  60.       }  
  61.       // 返回ArrayList集合  
  62.       returndata_list;  
  63.   
  64.    }  
  65. }  



预览效果:

 

ListView之适配器的使用
            
    
    
        适配器ListviewArrayAdapterSimpleAdapterBaseAdapter 

 

3:BaseAdapter

 

步骤

使用BaseAdapter实现复杂的ListView的步骤:

 

1 首先准备好需要显示在LiseView中的数据 ——List

 


2 然后编写2 个XML 文件 第一个文件是ListView控件所在的布局文件 第二个文件是ListVIew中每一个item的布局文件

 


3 创建一个继承自BaseAdapter的类

 


4 为ListView绑定适配器 setAdapter(继承BaseAdapter 类的实例)

 


5 用传统方式来覆写适配器的getView函数和getCount 函数(从参数convertView里映射布局文件,find各个控件填充数据)


6 加入ViewHolder类(定义n个控件的声明)用convertView.setTag(viewHolder)在View和Object之间关联,此目的是节省find多次的时间。

 

 

 

 

代码:

 

Activity.java

 

 

 

Java代码
  1. /*** 
  2.  * 
  3.  * 
  4.  * BaseAdapter 
  5.  * @author Administrator 
  6.  * 
  7.  */  
  8. public class BaseAdapterActivity extends Activity {  
  9.    
  10.    private ListView mbaseshow_listview;  
  11.    private String[] arrayDate={"东方不败","天龙八部","九阴真经","东邪","南帝","北丐"};  
  12.    private int[] img = {R.drawable.l2, R.drawable.l3,R.drawable.l1, R.drawable.a5,R.drawable.a6,R.drawable.ic_launcher};  
  13.    @Override  
  14.    protected void onCreate(Bundle savedInstanceState) {  
  15.       // TODOAuto-generated method stub  
  16.       super.onCreate(savedInstanceState);  
  17.       // 加载布局  
  18.       setContentView(R.layout.baselistview_layout);  
  19.       mbaseshow_listview =(ListView) findViewById(R.id.baseshow_listview);  
  20.       initView();  
  21.     
  22.    }  
  23.     
  24.     
  25.     
  26.    private void initView() {  
  27.       // TODOAuto-generated method stub  
  28.        MyAdapter myAdapter = new MyAdapter(this,arrayDate,img);  
  29.        //绑定适配器  
  30.         mbaseshow_listview.setAdapter(myAdapter);  
  31.         //刷新适配器  
  32.        myAdapter.notifyDataSetChanged();  
  33.        /**ListView的item点击事件 
  34.         * 
  35.         * 
  36.         *AdapterView<?> arg0:适配器 
  37.         *View arg1:表示当前item的view(视图),通过它可以获取该item中的各个组件 
  38.         *position:当前item的id, 
  39.         *arg3:表示当前的item在listview中相对位置 
  40.         * 
  41.         * 
  42.         **/  
  43.         mbaseshow_listview.setOnItemClickListener(newOnItemClickListener() {  
  44.    
  45.          @Override  
  46.          public voidonItemClick(AdapterView<?> arg0, View arg1, int position,  
  47.                 long arg3) {  
  48.             Toast.makeText(BaseAdapterActivity.this,"你点击了"+arrayDate[position],-1000).show();  
  49.              
  50.          }  
  51.       });  
  52.          
  53.         mbaseshow_listview.setOnItemLongClickListener(newOnItemLongClickListener() {  
  54.    
  55.          @Override  
  56.          public boolean onItemLongClick(AdapterView<?> arg0, View arg1,  
  57.                 int position,long arg3) {  
  58.             Toast.makeText(BaseAdapterActivity.this,"执行了长按事件",0 ).show();  
  59.             return false;  
  60.          }  
  61.       });  
  62.    }    
  63.   
  64.   
  65. BaseAdapter.java  
  66.   
  67.   
  68. public class MyAdapter extends BaseAdapter {  
  69.   
  70.    private String[] datas;  
  71.    private LayoutInflater inflater;  
  72.    private int[] imgs;  
  73.    public MyAdapter(Contextcotext, String[] datas,int[] imgs) {  
  74.       this.datas = datas;  
  75.        inflater =LayoutInflater.from(cotext);  
  76.        this.imgs=imgs;  
  77.    }  
  78.    
  79.    /** 
  80.     * 
  81.     * 返回的item总数量 
  82.     * 
  83.     */  
  84.    public intgetCount() {  
  85.       return datas.length;  
  86.    }  
  87.    
  88.    /** 
  89.     * 
  90.     * item的位置 
  91.     * 
  92.     */  
  93.    @Override  
  94.    public Object getItem(int position){  
  95.       // TODOAuto-generated method stub  
  96.       return datas[position];  
  97.    }  
  98.    
  99.    /** 
  100.     * 
  101.     * 对应每个item里面控件的id 
  102.     * 
  103.     */  
  104.    @Override  
  105.    public longgetItemId(int position) {  
  106.       // TODOAuto-generated method stub  
  107.       return position;  
  108.    }  
  109.    
  110.    @Override  
  111.    public View getView(int position,View convertView, ViewGroup parent) {  
  112.    
  113.       ViewHolde viewHolde = null;  
  114.        
  115.       if (null ==convertView) {  
  116.          // 实例化 ViewHolde对象  
  117.    
  118.       viewHolde = newViewHolde();  
  119.          convertView = inflater.inflate(  
  120.                 R.layout.item_listview,null);  
  121.          viewHolde.img=(ImageView)convertView.findViewById(R.id.img);  
  122.          viewHolde.mtype_txt =(TextView) convertView  
  123.                 .findViewById(R.id.text);  
  124.           
  125.          convertView.setTag(viewHolde);  
  126.    
  127.       }  
  128.        
  129.       else {  
  130.          viewHolde = (ViewHolde)convertView.getTag();  
  131.       }  
  132.        
  133.       viewHolde.mtype_txt.setText(datas[position]);  
  134.       viewHolde.img.setImageResource(imgs[position]);  
  135.       // 返回item视图  
  136.       returnconvertView;  
  137.    
  138.    }  
  139.    
  140.    class ViewHolde {  
  141.       TextView mtype_txt;  
  142.       ImageView img;  
  143.    }  
  144.    
  145. }  



预览效果:

ListView之适配器的使用
            
    
    
        适配器ListviewArrayAdapterSimpleAdapterBaseAdapter 

 

 

 

 

 

点击下载源码