Andoid 采用ListView三种显示数据列表

Android系统中列表形式的显示方式应该是我们最熟悉不过的界面了,例如通讯录、通话记录、信息列表等等,例如下面的形式:

我们在开发项目需要用到这种形式显示信息时除了调用系统给我们提供的ListView控件以外我们还可以自定义该控件,因为,如果当需要显示复杂的显示列表时系统提供的这种控件不一定能满足我们的需求,在大多数情况下我们可以自定义此控件。

  今天给将介绍三种使用ListView的形式:

  首先在窗体中添加ListView控件,在代码程序执行时对控件进行初始化:

  

private ListView list_show;
list_show = (ListView) this.findViewById(R.id.list_show);

 

  1. SimpleAdapter适配器:

1     SimpleAdapter spa = new SimpleAdapter(this, data, R.layout.list_item, 
2         new String[]{"name","age","id"}, new int[]{R.id.name,R.id.age,R.id.id});

  他需要的参数包括:

    1.当前上下文对象  Context context,

    2.数据资源   List<? extends Map<String, ?>> data,

    3. 资源布局文件   int resource,

    4.String类型数组的List中数据源数据集合  String[] from,

    5.资源文件中控件的id集合  int[] to

  在上面代码初始化中我们需要的参数:

    List<HashMap<String ,Object>> data = new ArrayList<HashMap<String , Object>>();for(Student stu : students){HashMap<String , Object> item = new HashMap<String , Object>();item.put("name", stu.getName());item.put("age", stu.getAge());item.put("id", stu.getId());data.add(item);}

  在此我们需要的数据类型还是上篇代码中的Student类。

  我们已经假设students是一个List<Student>类型的集合,在代码中我是通过从SQLite数据库中读取的。经过迭代可以获取到其中的值,最后得到值的集合放入到List<HashMap<String,Object>>中。

  第三个参数是资源布局文件,也就是我们写的xml布局文件

  

 1     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2         android:layout_width="fill_parent"
 3         android:layout_height="fill_parent"
 4         android:orientation="horizontal" >
 5         
 6         <TextView
 7             android:layout_width="wrap_content"
 8             android:layout_height="wrap_content"
 9             android:id="@+id/name"
10             android:paddingLeft="50px"
11             />
12         
13         <TextView
14             android:layout_width="wrap_content"
15             android:layout_height="wrap_content"
16             android:id="@+id/age"
18 android:paddingLeft="50px" 19 /> 20 21 22 23 24 <TextView 25 android:id="@+id/id" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:paddingLeft="50px" /> 29 30 </LinearLayout>

 

    最后,设置ListView的适配器:

    

  list_show.setAdapter(spa);

  由于界面比较难看,因此在此就不截图给大家展示了,完整的程序已经打包在此共大家下载。

 

  2. SimpleCursorAdapter适配器:

    这个适配器与前面那个在名字上即可知道差别,即这个多了一个Cursor,它的数据来源是Cursor类型的:

    cursor是从数据库中查询出来的Cursor集合,注意在此不管Cursor数据源来自那儿它都不能被关闭,因为如果cursor.close()以后此对象就不存在,我们也就不能从中读取数据了。

    其他参数可以参考上面第一个或IDE中的提示,用法和第一个一样。

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor,new String[]{"name","age","id"}, new int[]{R.id.name,R.id.age,R.id.id});

    最后要记得设置ListView的适配器显示。

  

  3.自定义适配器:

    首先需要建立一个适配器类,这个类继承BaseAdapter,他会给我们生成必须的一些实现方法:

    具体在下面代码中都已经注释清楚:

  1 package com.example.adapter;
  2 
  3 import java.util.List;
  4 
  5 import com.example.sqllite.R;
  6 import com.example.sqllite.Student;
  7 
  8 import android.content.Context;
  9 import android.view.LayoutInflater;
 10 import android.view.View;
 11 import android.view.ViewGroup;
 12 import android.widget.BaseAdapter;
 13 import android.widget.TextView;
 14 
 15 public class StudentAdapter extends BaseAdapter {
 16     
 17     private List<Student> students;    //绑定的数据集
 18     private int source;    //资源文件
 19     private LayoutInflater inflater;    //布局填充器,Android的内置服务,作用:使用xml文件来生成对应的view对象
 20     
 21     public StudentAdapter(Context context,List<Student> students , int source){
 22         this.students = students;
 23         this.source = source;
 24         //得到布局填充服务
 25         inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 26     }
 27 
 28     public int getCount() {
 29         // TODO Auto-generated method stub
 30         return students.size();
 31     }
 32 
 33     public Object getItem(int arg0) {
 34         // TODO Auto-generated method stub
 35         return students.get(arg0);
 36     }
 37 
 38     public long getItemId(int arg0) {
 39         // TODO Auto-generated method stub
 40         return arg0;
 41     }
 42 
 43     //取得代表条目的view对象
 44     /* (non-Javadoc)
 45      * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
 46      * arg0    当前条目所要绑定的数据在条目中的索引值
 47      * 
 48      */
 49     public View getView(int arg0, View arg1, ViewGroup arg2) {
 50         
 51         TextView idview = null;
 52         TextView nameview = null;
 53         TextView ageview = null;
 54         
 55         // TODO Auto-generated method stub
 56         //判断是否为第一页
 57         //提供缓存机制
 58         if(arg1 == null){
 59             //为条目创建View对象,生成条目界面对象
 60             arg1 = inflater.inflate(source, null);
 61             
 62             //得到当前条目的数据
 63             idview = (TextView)arg1.findViewById(R.id.id);
 64             nameview = (TextView)arg1.findViewById(R.id.name);
 65             ageview = (TextView)arg1.findViewById(R.id.age);
 66             
 67             ViewCache cache = new ViewCache();
 68             
 69             cache.id = idview;
 70             cache.name = nameview;
 71             cache.age = ageview;
 72             
 73             //用视图标识临时存放缓存数据
 74             arg1.setTag(cache);
 75         }
 76         else{
 77             ViewCache cache = (ViewCache)arg1.getTag();
 78             idview = cache.id;
 79             nameview = cache.name;
 80             ageview = cache.age;
 81         }
 82         
 83         //得到当前条目对象
 84         Student stu = students.get(arg0);
 85         
 86         //为当前条目赋值
 87         idview.setText(stu.getId().toString());
 88         nameview.setText(stu.getName().toString());
 89         ageview.setText(stu.getAge().toString());
 90         
 91         return arg1;
 92     }
 93     
 94     private final class ViewCache{
 95         public TextView id;
 96         public TextView name;
 97         public TextView age;
 98     }
 99 
100 }

 

    不过在此有一点需要注意,我们用到了缓存,即ListView显示如果超过一整屏幕后出现下拉列表供我们往下拖动查看更多数据,但是它不会每次都生成一个界面View对象,从很大程度上减少了系统开销。关于缓存的使用大家可以查阅更多资料来了解。

   编写完了适配器我们就可以使用自定义的适配器来设计我们的ListView的适配器了:

    

     List<Student> students = dbserver.page(0, 15);  //从数据库读取数据源StudentAdapter adapter = new StudentAdapter(this.getApplicationContext(), students, R.layout.list_item);list_show.setAdapter(adapter);

 

   自此,已经可以使用我们自定义的适配器来设计我们的ListView了。

 

  此外,我们通常会编写事件来响应ListView的点击事件,注意是ListView中Item的点击事件,ListView控件其本身也有Click事件:

  

//绑定条目点击事件list_show.setOnItemClickListener(new list_listener());

 

   

    private final class list_listener implements OnItemClickListener{/* (non-Javadoc)* @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)* arg0 ListView对象* arg1 当前所点击的VIew对象* arg2    当前所点击的条目所绑定的数据在集合中的索引值* arg3 当前界面中的排列值*/public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stub//自定义适配器ListView lView = (ListView)arg0;Student stu = (Student)lView.getItemAtPosition(arg2);    //取得arg2索引对应的条目
            Toast.makeText(getApplicationContext(), stu.getId().toString(), 1).show();/*//利用SimpleCursorAdapter得到的是Cursor对象Cursor cursor = (Cursor) lView.getItemAtPosition(arg2);int id = cursor.getColumnIndex("_id");*/}}

 

  为了展示最后我们是成功的,不得不把自己设计的奇臭无比的界面献丑一下:

    

 

  自此,ListVIew的三种显示数据形式已经完成,大部分时候系统提供的ListView适配器并不能满足我们的需求,我们可以使用自定义的适配器来完成我们的项目。

转载于:https://www.cnblogs.com/fanchangfa/archive/2012/08/22/2651540.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

url采集器_Linux「第三节」-centos7.5部署数据采集器Telegraf

Telegraf采集器采集数据后&#xff0c;会存储到influxdb数据库&#xff0c;然后grafana从influxdb读取数据&#xff0c;在grafana面板上展示&#xff0c;整体的流程就是这样。下面就演示下Telegraf、influxdb、grafana相互间的配置与衔接下载Telegrafwget https://dl.influxdat…

css宋体代码_html布局中统一设置文字字体样式

html组织中对立设置装备摆设笔墨字体名堂后&#xff0c;结构部份时候须要变幻从新设置装备摆设一种字体若何完成呢&#xff1f;贪图门径&#xff1a;结构时先一般会抗衡设置装备摆设整个网页字体&#xff0c;预防差距浏览器显露不同默认字体&#xff0c;而设置装备摆设字体css属…

Asterisk队列(Queue)振铃方式(ring strategy)

队列振铃方式有&#xff1a;ringall&#xff0c;roundrobin&#xff0c;leastrecent&#xff0c;fewestcalls&#xff0c;random&#xff0c;rrmemory。 ringall是呼叫所有可到达的分机直到有接听的。 roundrobin是轮流呼叫每一个可以达到的分机。 leastrecent是呼叫最近被这…

简述用UCenter整合第三方应用程序

UCenter除了对实现用户通行&#xff0c;各个应用通用信息的存储和处理之外&#xff0c;还有一个重要的功能就是开放的接口协议&#xff0c;其他第三方应用程序通过简单修改&#xff0c;即可很容易将程序纳入UCenter体系中来&#xff0c;和其他应用共享用户以及其他数据 &#x…

西门子主程序调用子程序_S7200Smart 子程序局部变量使用教程

全新的 S7-200 SMART 带来两种不同类型的 CPU 模块&#xff0c;标准型和经济型&#xff0c;全方位满足不同行业、不同客户、不同设备的各种需求。标准型作为可扩展 CPU 模块&#xff0c;可满足对 I/O 规模有较大需求&#xff0c;逻辑控制较为复杂的应用 &#xff1b;而经济型 C…

电脑怎么结束进程_深刻了解windows系统的任务管理器,电脑高手的成长之路

伙伴们我们每天都在用电脑&#xff0c;电脑和手机已经离不开了&#xff0c;可以说手机和电脑就是我们的左膀右臂。我们用电脑的时候&#xff0c;如果电脑卡了或者反应慢了&#xff0c;我们都会想到吧任务管理器调出来看看&#xff0c;可以说调出任务管理器就像医生看病一样&…

Asterisk 1.4.42将成绝唱

随着Asterisk 1.4最后的bug维护日期已过&#xff0c;当Asterisk 1.4.41在4月26日发布之后&#xff0c;Digium随即宣布将择机发布Asterisk 1.4的最后一个版本——1.4.42。如果有什么bug需要报告的&#xff0c;有什么代码需要提交的&#xff0c;赶紧提交&#xff0c;这将是为Aste…

hdu4353 Finding Mine三角形内的点数

http://acm.hdu.edu.cn/showproblem.php?pid4353 题意&#xff1a; 求多边形面积和这个多边形内的金矿数的比值的最小值。 当xi<xj<xk时&#xff1a; 三角形内的点数|ik上方的点-(ij上方的点jk上方的点)| 1 #include <iostream>2 #include <cstdio>3 #inclu…

手机连接投影机的步骤_家用投影仪如何安装 家用投影仪安装方法【步骤详解】...

家用投影仪怎么安装 根据安装方式的不同&#xff0c;投影仪可以分为桌式正投、吊顶正投、桌式背投、吊顶背投几种。方便随时随地使用的便携式投影仪一般是桌式正投&#xff0c;这种投影方法受环境光影响较大 但如果装修时就设计成吊顶正投方式&#xff0c;不仅在性价比方面更加…

insmod 和modprobe的区别

insmod 与 modprobe 都是载入 kernel module&#xff0c;不过一般差别于 modprobe 能够处理 module 载入的相依问题。比方你要载入 a module&#xff0c;但是 a module 要求系统先载入 b module 时&#xff0c;直接用 insmod 挂入通常都会出现错误讯息&#xff0c;不过 modprob…

win7锁屏时间怎么设置_电脑锁屏时间怎么设置

以WIN10系统为例演示。1/3打开“控制面板”&#xff1b;点击“电源选项”2/3点击“更改计划设置”&#xff1b;设置锁屏时间3/3点击“保存修改”即可

Ajax原理

引用&#xff1a;http://www.cnblogs.com/xugang/archive/2007/10/16/925993.html 看了“坐断东南 笑煞之”的那篇 .net组件开发系列(二)之武林系列 太极拳 开发ajax控件 总有一种意犹味尽的感觉。没有想到 金色海洋&#xff08;jyk&#xff09;竟“晕了”&#xff0c;我感觉写…

cdh界面 hue 配置hbase_海量数据存储技术之HBase:使用HBase Shell操纵HBase

Apache HBase Shell是JRuby的IRB&#xff0c;并在此基础上加入了HBase特有的命令。JRuby是用Java实现的Ruby解释器。通过JRuby&#xff0c;你可以在JVM上直接运行Ruby程序&#xff0c;调用Java的类库。IRB即interactive ruby&#xff0c;交互式Ruby。运行HBase Shell&#xff1…

安卓 图像清晰度识别_智能车牌识别系统的常见故障和解决方法

车牌号是车辆的唯一身份标志&#xff0c;它的特殊性与重要性从而决定了车牌识别系统在智慧城市交通管理系统中成为不可或缺的重要组成部分。下面智能车牌识别系统厂家畅荧智能科技将详细为您介绍一些智能车牌识别系统常见的故障问题和对应的解决方法。智能车牌识别系统的常见故…

asterisk使用SIP相互对接

当用户数量上去,单凭一台asterisk是很能支持庞大的用户群体,所以要根据用户量来部署多台asterisk来应付实际情况的需求.但部署多台asterisk所带来的一个问题就是A服务器的用户如果Call B服务器的用户呢?其实asterisk的设计者早已帮我们解决问题,以下是通过SIP把两台asterisk对…

企业技术

缓存使用条件&#xff1a; 1.访问量大 2.数据不经常更新 缓存缺点&#xff1a;容易产生【脏数据】--- 即&#xff1a;当用户第一次访问页面&#xff0c;读取数据库&#xff0c;并将数据存入缓存后&#xff0c;在该缓存失效前&#xff0c;其他访问都是读取缓存中的数据&#xf…

post postman 传递数组对象_如何使用postman做接口测试

一&#xff0c;接口测试是什么什么是接口测试&#xff0c;不说广泛的概念&#xff0c;直接电脑打开浏览器&#xff0c;进入开发者工具(F12)随意进入一些网站可以看到下面左侧栏出现了一系列的数据&#xff1a;上面条数据都是一个单独的接口&#xff0c;点击单个接口&#xff0c…

形位公差符号大全_玩转CAD快捷键(大全),一篇文章就够了

CAD快捷键命令大全符号键&#xff08;CTRL开头&#xff09;CTRL1 PROPCLOSEOROPEN 对象特性管理器CTRL2或4 ADCENTER 设计中心CTRL3 CTOOLPALETTES 工具选项板CTRL8或QC QuickCalc 快速计算器控制键CTRLA AI_SELALL 全部选择CTRLC或CO/CP COPYCLIP或COpy 复制CTRLD或F6 COORDIN…

Ubuntu 13.10配置root登录

Ubuntu 13.10默认是不允许使用root登录的&#xff0c;要想使用root权限&#xff0c;就必须使用 sudo 命令来执行&#xff0c;很繁琐。 要解决这个问题&#xff0c;需要两个步骤&#xff1a; 1、设置root密码&#xff0c;开启root账号 ubuntu默认的root密码据说是每隔5min就…

三极管驱动(讲的比较好)

http://wenku.baidu.com/view/9861c63310661ed9ad51f350.html转载于:https://www.cnblogs.com/tureno/articles/2668968.html