我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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:酷我音乐。"}; 
   
    @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; 
    } 
   
    privatevoid checkedChange(int checkedID) { 
        hasChecked[checkedID] = !hasChecked[checkedID]; 
    } 
   
    publicboolean hasChecked(int checkedID) { 
        return hasChecked[checkedID]; 
    } 
   
    privatevoid showDetailInfo(int clickID) { 
        new AlertDialog.Builder(context) 
        .setTitle("物品详情:" + listItems.get(clickID).get("info")) 
        .setMessage(listItems.get(clickID).get("detail").toString())               
        .setPositiveButton("确定", null) 
        .show(); 
    } 
        
   
    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开发中ListView与Adapter使用要点介绍Android listview与adapter详解及实例代码Android开发中ListView自定义adapter的封装Android ListView适配器(Adapter)优化方法详解Android Adapter里面嵌套ListView实例详解Android ListView自定义Adapter实现仿QQ界面Android ListView和Adapter数据适配器的简单介绍Android UI:ListView - SimpleAdapter实例详解Android开发实现ListView和adapter配合显示图片和文字列表功能示例


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

在开发中,我们经常使用到ListView这个控件。Android的API也提供了许多创建ListView适配器的快捷方式。例如ArrayAdapter、SimpleAdapter和SimpleCursorAdapter等。但你是否发现,如
2022-06-06

Android开发中ListView自定义adapter的封装

【引入】 我们一般编写listView的时候顺序是这样的: 需要展示的数据集List 为这个数据集编写一个ListView 为这个ListView编写一个Adapter,一般继承自BaseAdapter 在BaseAdapte
2022-06-06

android 自定义ScrollView实现背景图片伸缩的实现代码及思路

用过多米音乐的都市知道, 这个UI可以上下滑动,作用嘛---无聊中可以划划解解闷,这被锤子公司老罗称谓为“情怀”,其实叫“情味”更合适。嘿嘿.如今挪动互联网开展这么迅速,市场上已不再是那早期随便敲个APP放上架就能具有几十万用户
2022-06-06

Android列表实现(3)_自定义列表适配器思路及实现代码

下面的例子为使用自定义的列表适配器来显示列表。 代码如下: View Code import android.os.Bundle; import android.app.ListActivity; import android.conte
2022-06-06

Java自定义一个变长数组的思路与代码

有时我们希望将把数据保存在单个连续的数组中,以便快速、便捷地访问数据,但这需要调整数组大小或者对其扩展,下面这篇文章主要给大家介绍了关于Java自定义一个变长数组的思路与代码,需要的朋友可以参考下
2022-12-29

android实现横屏的代码及思路

当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中来检查当前的方向,然后可以让你的SetContentView来载入不同的Layout xml.代码如下:if (thi
2022-06-06

Android 自定义dialog的实现代码

Android 自定义dialog的实现代码 搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。要点:1、设置自定义dialog的布局文件my_dialog.xm
2022-06-06

android 自定义Android菜单背景的代码

代码如下: public class MenuEx extends Activity { private static final String TAG = "android123"; @Override public void onCre
2022-06-06

Android 自定义弹性ListView控件实例代码(三种方法)

关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考: 弹性ListView 第一种方法:import
2022-06-06

Android自定义格式显示Button的布局思路

先把来源贴上 http://zrgiu.com/blog/2011/01/making-your-android-app-look-better/http://www.dibbus.com/2011/02/gradient-buttons-
2022-06-06

Android 自定义控件详解及实例代码

开发自定义控件的步骤:1、了解View的工作原理 2、 编写继承自View的子类 3、 为自定义View类增加属性 4、 绘制控件 5、 响应用户消息 6 、自定义回调函数 一、View结构原理Android系统的视图结构的设计也
2022-06-06

Android 自定义gradle property详解及实例代码

Android 自定义gradle property 在Android studio上运行项目,gradle的配置是必不可少的,但是随着项目的逐渐成长,迎面而来的就是.各种依赖包的添加,数不胜数的签名,渠道包等,整个gradle变得很乱,这
2022-06-06

android 自定义圆角button效果的实例代码(自定义view Demo)

概述 在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等。针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的。但是如果使用非常频繁,那
2022-06-06

Android中利用ViewHolder优化自定义Adapter的写法(必看)

最近写Adapter写得多了,慢慢就熟悉了。 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作。(WXD同学教我的。) 具体不分析了,直接上一份代码吧:public class MarkerItemAdapter e
2022-06-06

Android自定义相机界面的实现代码

我们先实现拍照按钮的圆形效果哈,Android开发中,当然可以找美工人员设计图片,然后直接拿进来,不过我们可以自己写代码实现这个效果哈,最常用的的是用layout-list实现图片的叠加,我们这个layout命名为btn_take_phot
2022-06-06

Android中自定义对话框(Dialog)的实例代码

1.修改系统默认的Dialog样式(风格、主题)2.自定义Dialog布局文件3.可以自己封装一个类,继承自Dialog或者直接使用Dialog类来实现,为了方便以后重复使用,建议自己封装一个Dialog类 第一步:  我们知道Androi
2022-06-06

Android-自定义控件之ListView下拉刷新的实现

自定义控件学了很久了,发现学了总是忘,于是打算用博客来记录自己学习的知识点。 今天是自定义ListView来实现下拉刷新,这些文章都是借鉴慕课网上的视频来写的. 自定义一个控件,先是看它继承于那个控件,如果我们继承View控件的话,那得让我
2022-06-06

Android程序美化之自定义ListView背景的方法

本文实例讲述了Android程序美化之自定义ListView背景的方法。分享给大家供大家参考,具体如下: 在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录