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

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

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

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

实现细节:

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

private List> listItems;

元素添加方式:

Map map = new HashMap();

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

Android:orientation="vertical"

Android:layout_width="fill_parent"

Android:layout_height="fill_parent">

Android:orientation="horizontal"android:layout_width="fill_parent"

Android:layout_height="wrap_content">

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:textColor="#FFFFFFFF"

Android:textSize="20px"/>

Android:layout_width="40px"

Android:layout_height="40px"

Android:background = "@drawable/shopping"/>

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:textColor="#FFFFFFFF"/>

Android:layout_width="fill_parent"

Android:layout_height="wrap_content"/>

列表项布局文件list_item.xml

Android:orientation="horizontal"android:layout_width="fill_parent"

Android:layout_height="fill_parent">

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:layout_margin="5px"/>

Android:layout_width="wrap_content"

Android:layout_height="wrap_content">

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:textColor="#FFFFFFFF"

Android:textSize="13px"/>

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:textColor="#FFFFFFFF"

Android:textSize="22px"/>

Android:orientation="horizontal"android:layout_width="fill_parent"

Android:layout_height="wrap_content">

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:layout_margin="5px"/>

Android:layout_width="wrap_content"

Android:layout_height="wrap_content"

Android:layout_margin="5px"/>

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> 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> getListItems() {

List> listItems = new ArrayList>();

for(int i = 0; i < goodsNames.length; i++) {

Map map = new HashMap();

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> 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> 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 listview自定义顶部,Android自定义Adapter的ListView的思路及代码相关推荐

  1. android 自定义顶部,Android自定义实现顶部粘性下拉刷新效果

    本文实例为大家分享了Android实现顶部粘性下拉刷新效果的具体代码,供大家参考,具体内容如下 activity_view_mv代码 xmlns:android="http://schema ...

  2. Listview 的顶部动态广告位的实现

    listview 的顶部动态广告位 就是 在listview 自动切换图片 原理就是利用 timer 和 TimerTask 来实现 代码 如下 final Timer timer = new Tim ...

  3. 移动开发技术(Android)——实验5 Android高级控件的应用

    移动开发技术--实验5 Android高级控件的应用 一.实验目的 二.实验内容 1.Spinner.ListView控件与Adapter适配器(一) 2.Spinner.ListView控件与Ada ...

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

    Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 width="650" height="200" align=&quo ...

  5. android 中自定义安装,Android开发中ListView自定义adapter的封装

    [引入] 我们一般编写listView的时候顺序是这样的: •需要展示的数据集List •为这个数据集编写一个ListView •为这个ListView编写一个Adapter,一般继承自BaseAda ...

  6. Android之自定义Adapter的ListView

    在开发中,我们经常使用到ListView这个控件. Android 的API也提供了许多创建ListView适配器的快捷方式.例如 ArrayAdapter.SimpleAdapter和SimpleC ...

  7. Android 常见界面控件(ListView、RecyclerView、自定义View篇)

    Android 常见界面控件(ListView.RecyclerView.自定义View篇) 目录 3.3 ListView的使用 3.3.1 ListView控件的简单使用 3.3.2 常用数据适配 ...

  8. Android中ListView与RadioButton结合----自定义单选列表

    有时候我们需要制作自定义的单选列表,但是会遇到一些问题,比如多选,假选问题,所以网上找了找资料,整理一个demo出来,贴一下代码: [html] view plaincopy <ListView ...

  9. Android ListView 疯狂之旅 之 《自定义下拉刷新功能的ListView》

    效果图: 一 首先创建一个类,继承ListView,编写其构造方法 public class RefreshListView extends ListView {public RefreshListV ...

最新文章

  1. Android发送短消息程序的总结
  2. AAAI 2020放榜,8800篇提交论文创纪录,接收率20.6%
  3. Scala中val, lazy, def的区别
  4. 10-20国际电极标准系统
  5. 万万没想到,钉钉居然是个AI平台
  6. ajax不执行_好程序员Java学习路线分享原生Ajax的使用
  7. 对gitShell的使用
  8. 【MSLearn 学习模块】Hi ! ⼀起来学Python
  9. 中国.NET:东莞+长沙.NET俱乐部现场花絮及合肥、苏州、上海等地活动预
  10. window下搭建Python3.7+selenium3.1.1+pycharm环境
  11. html input 字体颜色_html 元素参考整合实用收藏!前端web工程师必备!
  12. getconnectiontimeoutexception 网络问题排查_家里wifi信号差?给小白的无线排查操作指南...
  13. 【chrome】谷歌chrome浏览器离线安装包的获取及使用技巧
  14. 面向猴子编程 GO制作水印
  15. linux查询过滤文件名后缀,在linux下搜索文件 文件名后缀
  16. vue学习Day08
  17. Directx11 安装、配置、报错
  18. Instance Segmentation by Jointly Optimizing Spatial Embeddings and Clustering Bandwidth【论文解读】
  19. 利用H5SVG实现线性动画效果
  20. Activity重建之殇

热门文章

  1. 【实现一个扑克牌洗牌游戏,然后给三个玩家洗牌发牌】
  2. 股票的种类,股票分类
  3. nowcoder_B_114514_打表找规律
  4. 目标检测项目中面对高分辨率图像的滑动窗口技术(二)(代码开源,超简便API封装,直接调用进行切图及保存)
  5. mysql 字段名和保留字冲突_关于mysql字段名和保留字冲突的问题
  6. 手机导航全球升温 融合化发展成为新趋势
  7. css 0.5像素实现
  8. c语言计算每一年的母亲节是哪一天
  9. JavaScript获取变量数据类型
  10. 经验原石_哔哩哔哩经验原石怎么用