原文网址:http://www.jb51.net/article/37236.htm

Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下
 

在开发中,我们经常使用到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布局文件的视图

实例视图如下:

 
 

 

 

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;  
    }  
} 

【转】Android自定义Adapter的ListView的思路及代码的更多相关文章

  1. [转]Android自定义Adapter的ListView的思路及代码

    本文转自:http://www.jb51.net/article/37236.htm 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快 ...

  2. Android 自定义Adapter 但listview 只显示第一条数据

    <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content ...

  3. android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

    adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中 ...

  4. Android 自定义Adapter实现多视图Item的ListView

    自定义Adapter实现多视图Item的ListView http://www.devdiv.com/adapter_item_listview-blog-20-7539.html 1.原理分析 Ad ...

  5. Android学习----自定义Adapter实现ListView

    前言: 对于ListView而言,自定义的Adapter对于显示复杂的界面有很大的灵活性 .使用自定义的Adapter需要继承BaseAdapter,然后重写getCount(),getView(), ...

  6. 关于自定义Adapter实现ListView的使用

    以下为使用BaseAdapter作扩展,自定义Adapter来使用ListView控件: 需要注意以下的几点: 1.自定义Adapter时,需要特别注意Adapter类中getView()方法覆盖,注 ...

  7. Android自定义组件之ListView

    1-ListView简介 在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.一个ListView通常有两个职责. (1)将数据填充到 ...

  8. Android 自定义Adapter中实现startActivityForResult的分析

    最近几天在做文件上传的时候,想在自定义Adapter中启动activity时也返回Intent数据,于是想到了用startActivityForResult,可是用mContext怎么也调不出这个方法 ...

  9. 【转】Android之自定义Adapter的ListView

    http://www.cnblogs.com/topcoderliu/archive/2011/05/07/2039862.html 在开发中,我们经常使用到ListView这个控件.Android的 ...

随机推荐

  1. SQLCLR

    hsrzyn SQLCLR   什么是SQLCLR SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Fr ...

  2. Spire.Barcode好用的条码生在组件

    由于项目的需要,今天在网上找了一下条码的组件,发现了一个简单易用的组件,使用简单,几句代码就搞定了.

  3. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  4. Eclipse中点击小猫提示Tomcat settings should be set in Tomcat Preference Page

    1.window->preference->tomcat->tomcat-version选择自己tomcat版本 tomcat home 选择tomcat安装目录,即bin的上一层 ...

  5. Asp.net MVC利用Ajax.BeginForm实现bootstrap模态框弹出,并进行前段验证

    1.新建Controller public ActionResult Index() { return View(); } public ActionResult Person(int? id) { ...

  6. oracle命令的缩写原型单词方便记忆总结

    $ORACLE_HOME/bin下的utilities解释 Binary              First Available        Description adapters        ...

  7. 段落排版--中文字间距、字母间距(letter-spacing, word-spacing)

    中文字间隔.字母间隔设置: 如果想在网页排版中设置文字间隔或者字母间隔就可以使用    letter-spacing 来实现,如下面代码: h1{ letter-spacing:50px; } ... ...

  8. html 5的localstorag

    随着我们硬件技术的发展,浏览器本身的功能也愈发的完善,从之前的cookie到现在的本地缓存机制,再到web storage,在之前html4 的时候使用cookie具有一些明显的局限,如大小限制,co ...

  9. 浮点数精确表示,java陷阱

    /** 浮点数表示问题 @author husky */ public class Change { public static void main(String[] args) { double n ...

  10. CDH5 集群安装教程

    一.虚拟机的安装和网络配置. 1.虚拟机安装. 2.安装CentOS-6.5 64位版本. 桥接模式: Master: 内存:3G: 硬盘容量40G: 4核: Slave: 内存2G: 硬盘容量30G ...