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

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

程序员文章站 2023-11-20 18:27:52
 在开发中,我们经常使用到listview这个控件。android的api也提供了许多创建listview适配器的快捷方式。例如arrayadapter、simp...

 在开发中,我们经常使用到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; 
    } 
}