7、ListView的几种适配器及自定义适配器

2023-10-30

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">ListView是我们在Android应用开发中常用的组件,它通过列表的形式展示数据,具有很强的可扩展性,通常使用还会给每一项绑定一个点击时间,用于处理相应的请求,ListView在电商的商品列表中是必不可少的,下面我们介绍几种常用的使用方法。</span>
          列表的显示需要三个元素:
          1.ListVeiw   用来展示列表的View。
          2.适配器       用来把数据映射到ListView上的中介。
          3.数据           具体的将被映射的字符串,图片,或者基本组件。
android中我们常用的有3中不同的适配器,分别是:
1.ArrayAdapter   使用最为简单,以数据集合为基础,只显示一行文本。
2.SimpleAdapter  具有很好的扩种行,可以自定义出各种各样的布局。
3.SimpleCursorAdapter   可以方便的把数据库的内容通过列表的形式展现出来
另外,我们通常自己写一个继承自BaseAdapter(基础适配器)的适配器,用于将设计思路更加的符合规范,数据与视图分离开来,像MVC一样。
下面我们逐一介绍着几种方式:
(一)、ArrayAdapter适配器
ArrayAdapter可以实现简单的数据与ListView的绑定,我们逐步实现ListView。
1、在布局文件中加入一个ListView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</RelativeLayout>

2、在Activity中分别获取列表、数据、适配器。
public class MainActivity extends Activity {

private ListView myListView;//列表
private List<String> itemList;//数据

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
myListView = (ListView) findViewById(R.id.listView);
//ArrayAdapter中有三个参数
//Context context 指定现在的上下文
//int textViewResourceId 指定一个包含textview的布局文件,显示每行的信息
//List<String> objects 在listview上显示的数据信息
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, itemList);//适配器
}

public void initData() {
itemList = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
itemList.add("测试数据" + i);
}
}
}

3、看一下实现的效果
可以看到,listView中的每一项都只显示了一行信息,这种适配器,在需要显示每项内容只有一个时比较常用,一般我们的listView中每项都有较多的内容,所以还需要更加充实的适配器。
(二)、SimpleAdapter适配器
      这是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。你可以指定由Map组成的List(比如ArrayList)类型的数据。在ArrayList中的每个条目对应List中的一行。Maps包含每一行的数据。你可以指定一个XML布局以指定每一行的视图,根据Map中的数据映射关键字到指定的视图。绑定数据到视图分两个阶段,首先,如果设置了SimpleAdapter.ViewBinder,那么这个设置的ViewBinder的setViewValue(android.view.View, Object, String)将被调用。如果setViewValue的返回值是true,则表示绑定已经完成,将不再调用系统默认的绑定实现。如果返回值为false,视图将按以下顺序绑定数据:
• 如果View实现了Checkable(例如CheckBox),期望绑定值是一个布尔类型。
• TextView.期望绑定值是一个字符串类型,通过调用setViewText(TextView, String)绑定。
• ImageView,期望绑定值是一个资源id或者一个字符串,通过调用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)绑定数据。
  如果没有一个合适的绑定发生将会抛出IllegalStateException。
1、在布局文件中加入一个ListView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</RelativeLayout>
2、自定义一个ListView每一项的布局,里面放一个图片和两个文本。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white" >

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:padding="5dp"
        android:scaleType="fitXY"
        android:src="@drawable/bank_boc" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/item_image"
        android:layout_marginLeft="10dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/item_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="标题"
            android:textColor="#000"
            android:textSize="25sp" />

        <TextView
            android:id="@+id/item_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="内容"
            android:textColor="#222"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>

效果如下:
3、在Activity中使用SimpleAdapter
public class SimpleAdapterListActivity extends Activity {

private ListView myListView;
private List<HashMap<String, Object>> data;
private final String TITLE = "title";
private final String IMAGE = "image";
private final String DATA = "data";

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView) findViewById(R.id.listView);

initData();
// 参数:
// context  SimpleAdapter关联的View的运行环境
// data    一个Map组成的List。在列表中的每个条目对应列表中的一行,每一个map中应该包含所有在from参数中指定的键
// resource 一个定义列表项的布局文件的资源ID。布局文件将至少应包含那些在to中定义了的ID
// from 一个将被添加到Map映射上的键名
// to     将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView
SimpleAdapter simAdapter = new SimpleAdapter(
SimpleAdapterListActivity.this, data, R.layout.item_listsimple,
new String[] { TITLE, DATA, IMAGE }, new int[] {
R.id.item_title, R.id.item_data, R.id.item_image });
myListView.setAdapter(simAdapter);
}

public void initData() {
data = new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < 20; i++) {
HashMap<String, Object> mapItem = new HashMap<String, Object>();
mapItem.put(TITLE, "标题" + i);
mapItem.put(DATA, "介绍" + i);
switch (i % 3) {
case 0:
mapItem.put(IMAGE, R.drawable.bank_boc);
break;
case 1:
mapItem.put(IMAGE, R.drawable.bank_fjnx);
break;
case 2:
mapItem.put(IMAGE, R.drawable.bank_visa);
break;
default:
break;
}
data.add(mapItem);
}
}
}

4、看一下效果
(三)、SimpleCursorAdapter适配器
SimpleCursorAdapter是android中专门为连接数据库与视图产生的,我们下面测试下使用SimpleCursorAdapter取到手机中的联系人。
1、在布局文件中加入一个ListView组件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</RelativeLayout>
2、在Activity中添加相应代码
public class SimpleCursorActivity extends Activity {

private ListView myListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView)findViewById(R.id.listView);
@SuppressWarnings("deprecation")
Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
        startManagingCursor(cursor);
        ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor, new String[]{People.NAME}, new int[]{android.R.id.text1});
        myListView.setAdapter(listAdapter);
}
}

3、读取联系人要用到权限,在AndroidMenifest.xml中添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>

4、在模拟器中加入一条联系人数据,可以看到运行后效果
(四)、自定义适配器
     在我们实际的应用中,通常使用自定义适配器,自定义适配器继承BaseAdapter,下面我们使用自定义的Adapter来实现(二)中介绍的SimpleAdapter的效果,
1、Activity的界面文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

</RelativeLayout>

2、ListView每一项的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white" >

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:padding="5dp"
        android:scaleType="fitXY"
        android:src="@drawable/bank_boc" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/item_image"
        android:layout_marginLeft="10dp"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/item_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="标题"
            android:textColor="#000"
            android:textSize="25sp" />

        <TextView
            android:id="@+id/item_data"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="内容"
            android:textColor="#222"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>

3、定义一个java类,用来存放在listItem中的每项数据
public class ListItemModel {

private String title;
private String data;
private int rid;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}

public int getRid() {
return rid;
}

public void setRid(int rid) {
this.rid = rid;
}

}

4、自定义适配器
public class MyListAdapter extends BaseAdapter {

private List<ListItemModel> listItems;
private LayoutInflater layoutInflater;

public MyListAdapter(Context context) {
layoutInflater = LayoutInflater.from(context);
}

public List<ListItemModel> getListItems() {
return listItems;
}

public void setListItems(List<ListItemModel> listItems) {
this.listItems = listItems;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return listItems.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ListItemView myListItemView;
if (convertView == null) {
myListItemView = new ListItemView();
convertView = layoutInflater
.inflate(R.layout.item_listsimple, null);
myListItemView.setTv_title((TextView) convertView
.findViewById(R.id.item_title));
myListItemView.setTv_data((TextView) convertView
.findViewById(R.id.item_data));
myListItemView.setIv_image((ImageView) convertView
.findViewById(R.id.item_image));
convertView.setTag(myListItemView);
} else {
myListItemView = (ListItemView) convertView.getTag();
}
myListItemView.getTv_title()
.setText(listItems.get(position).getTitle());
myListItemView.getTv_data().setText(listItems.get(position).getData());
myListItemView.getIv_image().setImageResource(
listItems.get(position).getRid());

return convertView;
}

class ListItemView {
private TextView tv_title;
private TextView tv_data;
private ImageView iv_image;

public TextView getTv_title() {
return tv_title;
}

public void setTv_title(TextView tv_title) {
this.tv_title = tv_title;
}

public TextView getTv_data() {
return tv_data;
}

public void setTv_data(TextView tv_data) {
this.tv_data = tv_data;
}

public ImageView getIv_image() {
return iv_image;
}

public void setIv_image(ImageView iv_image) {
this.iv_image = iv_image;
}
}
}

5、Activity中添加数据和适配器,并与ListView绑定
public class MyAdapterActivity extends Activity {

private ListView listView;
private String[] str_titles = { "自定义标题1", "自定义标题2", "自定义标题3", "自定义标题4",
"自定义标题5", "自定义标题6", "自定义标题7", "自定义标题8", "自定义标题9" };
private String[] str_datas = { "我的内容1", "我的内容2", "我的内容3", "我的内容4", "我的内容5",
"我的内容6", "我的内容7", "我的内容8", "我的内容9" };
private int[] rids = { R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa, R.drawable.bank_boc, R.drawable.bank_fjnx,
R.drawable.bank_visa };

private List<ListItemModel> myListItems;
private MyListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
myListItems = new ArrayList<ListItemModel>();
initData();
adapter = new MyListAdapter(MyAdapterActivity.this);
adapter.setListItems(myListItems);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
Toast.makeText(MyAdapterActivity.this, "点击了" + position, 1000)
.show();
}
});
}

public void initData() {
for (int i = 0; i < str_titles.length; i++) {
ListItemModel lm = new ListItemModel();
lm.setTitle(str_titles[i]);
lm.setData(str_datas[i]);
lm.setRid(rids[i]);
myListItems.add(lm);
}
}

}

6、看一下实现的效果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7、ListView的几种适配器及自定义适配器 的相关文章

随机推荐

  • C语言const限定词基本用法

    它限定一个变量不允许被改变 产生静态作用 使用const在一定程度上可以提高程序的安全性和可靠性 另外 在观看别人代码的时候 清晰理解const所起的作用 对理解对方的程序也有一定帮助 1 作用 防止误操作只读内存 像这种 Hello 字符
  • git拉取dev分支及git的基本常用命令

    新项目必做的操作 就是拉取远程仓库的代码 一般的开发是在dev分支上开发 但是默认拉下来了master分支 需要拉取dev分支怎么拉取呢 拉取dev分支代码 指定分支也可以 1 首先进入到你需要拉代码的文件里面 如果新项目第一次拉代码建议新
  • pandas的read_excel 报错:OverflowError: date value out of range‘ 的解决办法

    pandas的read excel 报错 OverflowError date value out of range 的解决办法 首先 报错了要进行原因分析 导致这个错误的原因是将文件中的数值读成了日期 解决办法 尝试1 pip insta
  • 关于Android无法用SmsManager发送短信的问题

    关于Android无法用SmsManager发送短信的问题 我使用的是如下代码 SmsManager smsManager SmsManager getDefault PendingIntent pi PendingIntent getAc
  • 解决element-ui中table表格row-style改变当前行样式失效问题

    前言 这个问题点 要注意的是element ui版本 版本不同解决方案也不同 我也收到好多私信说没解决 后来自己测试了一下 发现的确受版本影响 大家使用时仔细看element ui文档中的 是不是object格式的 最近在使用vue ele
  • 操作系统接口--OS

    操作系统接口 接口 连接两个东西 信号转换 屏蔽细节 接口需要实现什么 要知道调用它的是什么东西 背后是怎么完成这件事情的 计算机调用接口的三种方式 1 命令行 命令行 其实就是一个c函数 当我们操作系统启动后 会执行一个函数 该函数在目录
  • 【深度学习】logistic回归模型

    目录 神经网络 数据 符号准备 logistic回归 损失函数和代价函数 梯度下降法 向量化 神经网络 我们学习深度学习的目的就是用于去训练神经网络 而神经网络是什么呢 我们先来看下面一个基础的生物上的神经元的图片 通常来说 神经元就是处理
  • feign 传输文件

    1 pom文件
  • android源码分析!程序员怎样优雅度过35岁中年危机?送大厂面经一份!

    最近跟我的一些读者交流 有一位读者的经历让我记忆深刻 有一次和大学同学聚会 和几个在BAT的同学聊了聊技术 发现自己在创业公司这几年 完全是吃老本的状态 没有什么机会精进技术 同样是工作了三年 和同学的差距越来越大 我继续问他 他说真正让他
  • StringBuilder的用法

    StringBuilder简介 StringBuilder 最早出现在JDK1 5 是一个字符拼接的工具类 它和StringBuffer一样都继承自父类AbstractStringBuilder 在AbstractStringBuilder
  • “华为杯”研究生数学建模竞赛2020年-【华为杯】B题:降低汽油精制过程中的辛烷值损失模型(附优秀论文及python代码)

    目录 摘 要 1 问题重述 1 1 问题背景 1 2 需要解决问题 2 问题假设 3 符号说明
  • 第二章 感知机

    感知机 perceptron 是二类分类的线性分类模型 它包括输入空间 输出空间 模型结构 参数空间和假设空间 感知机学习旨在求出将训练数据进行线性划分的分离超平面 为此导入基于误分类的损失函数 利用梯度下降法对损失函数进行极小化 求得感知
  • STL的一些基本背景了解。

    STL源代码的头文件一般都是内联模式的 现在简单的把stl的集中类型进行分类说明一下 1 容器类 一般分为关联式容器和顺序式容器 典型的例子的就是vector为典型的顺序式容器 对于stl来说主要采用向量 链表 二叉树以及他们的组合为底层存
  • pandas中iloc()函数

    pandas中iloc 函数 DataFrame iloc 纯基于整数位置的索引 import pandas as pd mydict a 1 b 2 c 3 d 4 a 100 b 200 c 300 d 400 a 1000 b 200
  • TensorFlow数据归一化

    TensorFlow数据归一化 1 tf nn l2 normalize l2 normalize x dim epsilon 1e 12 name None output x sqrt max sum x 2 epsilon 2 使用sc
  • 【送书活动】深入浅出SSD:固态存储核心技术、原理与实战

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • 博士研究生如何做创新性研究?(蒲慕明院士)

    读文献不要只看文献描述的工作 What was done 还有四个 W 你也应知道 是谁做的 Who did it 什么时候做的 When 在哪里做的 Where 为什么会做这工作 Why 想了解重要的创新工作的来龙去脉 你就要读科学史 读
  • 全面深入了解python(一)

    全面深入了解python 一 写在开始前 此教程不是基础教程 在看之前你需要有一定的python基础 不然你可能无法理解教程到底教了哪些东西 环境 python版本是3 6 5 gt 3 4即可 1 Python数据模型 数据模型其实是对P
  • 高级排序技巧:提升Python中排序算法的效率和灵活性

    排序是计算机科学中常见的操作之一 它可以对数据进行按照特定顺序排列的操作 Python提供了多种排序算法 如冒泡排序 插入排序 选择排序等 然而 在处理大规模数据或对特定需求有限制时 我们需要使用更高级的排序技巧来提高算法的效率和灵活性 本
  • 7、ListView的几种适配器及自定义适配器

    span style font family none background color rgb 255 255 255 ListView是我们在Android应用开发中常用的组件 它通过列表的形式展示数据 具有很强的可扩展性 通常使用还会