Android自定义Adapter的ListView的思路及代码

时间:2021-10-04 07:10:14

 在开发中,我们经常使用到listview这个控件。android的api也提供了许多创建listview适配器的快捷方式。例如arrayadapter、simpleadapter和simplecursoradapter等。但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位。假设一行里面有一个按钮和一个图片控件,它们之间的响应操作是不一样的。若采用系统自带的适配器,就不能精确到每个控件的响应事件。这时,我们一般采取自定义适配器来实现这个比较精确地请求。

listview的创建,一般要具备两大元素:

       1)数据集,即要映射的字符串、图片信息之类。

       2)适配器,实现把要映射的字符串、图片信息映射成视图(如textview、image等组件),再添加到listview中。

实现细节:

       1、创建数据集,一般定义如下

复制代码 代码如下:

 private list<map<string, object>> listitems;


元素添加方式:

复制代码 代码如下:


       map<string, object> map = new hashmap<string, object>();      

 

  map.put("image", imgeids[i]);          //图片资源    

    map.put("title", "物品名称:");           //物品标题       

map.put("info", goodsnames[i]);      //物品名称    

    map.put("detail", goodsdetails[i]);   //物品详情      

  listitems.add(map);                         //添加一项

 

2、创建适配器

复制代码 代码如下:


       public class listviewadapter extends baseadapter{........}  //自定义的适配器一般继承baseadapter类

 

        listviewadapter = new listviewadapter(this, listitems);


3、给listview设置适配器

复制代码 代码如下:

       listview.setadapter(listviewadapter);


4、这里还有个关键点,如何把list_item.xml布局作为一个视图,添加到listview中:

复制代码 代码如下:


        layoutinflater listcontainer;   //视图容器工厂

 

        listcontainer = layoutinflater.from(context); //创建视图容器工厂并设置上下文

        convertview = listcontainer.inflate(r.layout.list_item, null);   //创建list_item.xml布局文件的视图


实例视图如下:

 

Android自定义Adapter的ListView的思路及代码

Android自定义Adapter的ListView的思路及代码

Android自定义Adapter的ListView的思路及代码

Android自定义Adapter的ListView的思路及代码

1)布局文件main.xml  

 

复制代码 代码如下:

<?xmlversion="1.0"encoding="utf-8"?>
<linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- 结算 -->
    <linearlayoutandroid:gravity="center_horizontal"
    android:orientation="horizontal"android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <textviewandroid:text="结算: "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:textcolor="#ffffffff"  
        android:textsize="20px"/>
    <imagebuttonandroid:id="@+id/imgbt_sum"  
        android:layout_width="40px"
        android:layout_height="40px"
        android:background = "@drawable/shopping"/>
    </linearlayout>

    <textviewandroid:text="商品列表: "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:textcolor="#ffffffff"/>

    <!-- 商品列表 -->  
    <listviewandroid:id="@+id/list_goods"  
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</linearlayout>


  列表项布局文件list_item.xml    
 

复制代码 代码如下:

  <?xmlversion="1.0"encoding="utf-8"?>
<linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- 商品图片 -->
    <imageviewandroid:id="@+id/imageitem"  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:layout_margin="5px"/>

    <!-- 商品信息 -->
    <linearlayoutandroid:orientation="vertical"
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content">

        <textviewandroid:id="@+id/titleitem"  
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"  
            android:textcolor="#ffffffff"
            android:textsize="13px"/>
        <textviewandroid:id="@+id/infoitem"  
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"  
            android:textcolor="#ffffffff"
            android:textsize="22px"/>
    </linearlayout>

    <!-- 购买和商品详情 -->
    <linearlayoutandroid:gravity="right"
    android:orientation="horizontal"android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <checkboxandroid:id="@+id/checkitem"  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:layout_margin="5px"/>
    <button  android:id="@+id/detailitem"  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"  
        android:layout_margin="5px"/>
    </linearlayout>
</linearlayout>
 

 

   2)代码,主代码:  

复制代码 代码如下:

package com.myandroid.test; 

import java.util.arraylist; 
import java.util.hashmap; 
import java.util.list; 
import java.util.map; 

import android.app.activity; 
import android.app.alertdialog; 
import android.content.dialoginterface; 
import android.os.bundle; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.arrayadapter; 
import android.widget.imagebutton; 
import android.widget.listview; 

publicclass mylistview extends activity { 

    private listview listview; 
    private imagebutton imgbt_sum; 
    private listviewadapter listviewadapter; 
    private list<map<string, object>> listitems; 
    private integer[] imgeids = {r.drawable.cake,  
            r.drawable.gift, r.drawable.letter, 
            r.drawable.love, r.drawable.mouse, 
            r.drawable.music}; 
    private string[] goodsnames = {"蛋糕", "礼物",  
            "邮票", "爱心", "鼠标", "音乐cd"}; 
    private string[] goodsdetails = { 
            "蛋糕:好好吃。",  
            "礼物:礼轻情重。",  
            "邮票:环游世界。",  
            "爱心:世界都有爱。", 
            "鼠标:反应敏捷。", 
            "音乐cd:酷我音乐。"}; 

    /** called when the activity is first created. */
    @override
    publicvoid oncreate(bundle savedinstancestate) { 
        super.oncreate(savedinstancestate); 
        setcontentview(r.layout.main); 

        listview = (listview)findviewbyid(r.id.list_goods);  
        imgbt_sum = (imagebutton) findviewbyid(r.id.imgbt_sum); 
        imgbt_sum.setonclicklistener(new clickevent()); 
        listitems = getlistitems(); 
        listviewadapter = new listviewadapter(this, listitems); //创建适配器 
        listview.setadapter(listviewadapter); 
    } 

    /**
     * 初始化商品信息
     */
    private list<map<string, object>> getlistitems() { 
        list<map<string, object>> listitems = new arraylist<map<string, object>>(); 
        for(int i = 0; i < goodsnames.length; i++) { 
            map<string, object> map = new hashmap<string, object>();  
            map.put("image", imgeids[i]);               //图片资源 
            map.put("title", "物品名称:");              //物品标题 
            map.put("info", goodsnames[i]);     //物品名称 
            map.put("detail", goodsdetails[i]); //物品详情 
            listitems.add(map); 
        }    
        return listitems; 
    } 

    class clickevent implements onclicklistener{ 

        @override
        publicvoid onclick(view v) { 
            // todo auto-generated method stub 
            string goodslist = ""; 
            for(int i = 0; i < listitems.size(); i++) { 
                goodslist += listviewadapter.haschecked(i)? goodsnames[i] + "  ": ""; 
            } 
            new alertdialog.builder(mylistview.this) 
            .settitle("购物清单:") 
            .setmessage("你好,你选择了如下商品:\n" + goodslist) 
            .setpositivebutton("确定", null) 
            .show(); 
        } 

    } 

 

适配器代码:

复制代码 代码如下:

package com.myandroid.test; 

import java.util.list; 
import java.util.map; 

import android.app.alertdialog; 
import android.content.context; 
import android.util.log; 
import android.view.layoutinflater; 
import android.view.view; 
import android.view.viewgroup; 
import android.widget.baseadapter; 
import android.widget.button; 
import android.widget.checkbox; 
import android.widget.compoundbutton; 
import android.widget.imageview; 
import android.widget.listview; 
import android.widget.textview; 

publicclass listviewadapter extends baseadapter { 
    private context context;                        //运行上下文 
    private list<map<string, object>> listitems;    //商品信息集合 
    private layoutinflater listcontainer;           //视图容器 
    privateboolean[] haschecked;                   //记录商品选中状态 
    publicfinalclass listitemview{                //自定义控件集合   
            public imageview image;   
            public textview title;   
            public textview info; 
            public checkbox check; 
            public button detail;        
     }   

     
    public listviewadapter(context context, list<map<string, object>> listitems) { 
        this.context = context;          
        listcontainer = layoutinflater.from(context);   //创建视图容器并设置上下文 
        this.listitems = listitems; 
        haschecked = newboolean[getcount()]; 
    } 

    publicint getcount() { 
        // todo auto-generated method stub 
        return listitems.size(); 
    } 

    public object getitem(int arg0) { 
        // todo auto-generated method stub 
        returnnull; 
    } 

    publiclong getitemid(int arg0) { 
        // todo auto-generated method stub 
        return0; 
    } 

    /**
     * 记录勾选了哪个物品
     * @param checkedid 选中的物品序号
     */
    privatevoid checkedchange(int checkedid) { 
        haschecked[checkedid] = !haschecked[checkedid]; 
    } 

    /**
     * 判断物品是否选择
     * @param checkedid 物品序号
     * @return 返回是否选中状态
     */
    publicboolean haschecked(int checkedid) { 
        return haschecked[checkedid]; 
    } 

    /**
     * 显示物品详情
     * @param clickid
     */
    privatevoid showdetailinfo(int clickid) { 
        new alertdialog.builder(context) 
        .settitle("物品详情:" + listitems.get(clickid).get("info")) 
        .setmessage(listitems.get(clickid).get("detail").tostring())               
        .setpositivebutton("确定", null) 
        .show(); 
    } 

        
    /**
     * listview item设置
     */
    public view getview(int position, view convertview, viewgroup parent) { 
        // todo auto-generated method stub 
        log.e("method", "getview"); 
        finalint selectid = position; 
        //自定义视图 
        listitemview  listitemview = null; 
        if (convertview == null) { 
            listitemview = new listitemview();  
            //获取list_item布局文件的视图 
            convertview = listcontainer.inflate(r.layout.list_item, null); 
            //获取控件对象 
            listitemview.image = (imageview)convertview.findviewbyid(r.id.imageitem); 
            listitemview.title = (textview)convertview.findviewbyid(r.id.titleitem); 
            listitemview.info = (textview)convertview.findviewbyid(r.id.infoitem); 
            listitemview.detail= (button)convertview.findviewbyid(r.id.detailitem); 
            listitemview.check = (checkbox)convertview.findviewbyid(r.id.checkitem); 
            //设置控件集到convertview 
            convertview.settag(listitemview); 
        }else { 
            listitemview = (listitemview)convertview.gettag(); 
        } 
//      log.e("image", (string) listitems.get(position).get("title"));  //测试 
//      log.e("image", (string) listitems.get(position).get("info")); 

        //设置文字和图片 
        listitemview.image.setbackgroundresource((integer) listitems.get( 
                position).get("image")); 
        listitemview.title.settext((string) listitems.get(position) 
                .get("title")); 
        listitemview.info.settext((string) listitems.get(position).get("info")); 
        listitemview.detail.settext("商品详情"); 
        //注册按钮点击时间爱你 
        listitemview.detail.setonclicklistener(new view.onclicklistener() { 
            @override
            publicvoid onclick(view v) { 
                //显示物品详情 
                showdetailinfo(selectid); 
            } 
        }); 
        // 注册多选框状态事件处理 
        listitemview.check 
                .setoncheckedchangelistener(new checkbox.oncheckedchangelistener() { 
                    @override
                    publicvoid oncheckedchanged(compoundbutton buttonview, 
                            boolean ischecked) { 
                        //记录物品选中状态 
                        checkedchange(selectid); 
                    } 
        }); 

        return convertview; 
    } 
}