Android: ListView的使用(列表控件)

当程序中有大量的数据需要展示时,就需要用到 ListView 啦。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。

1.基本性质

(1)由于数组中的数据无法直接传递给ListView,我们需要借助适配器(Adapter)来完成。
(2)Adapter有多种,需要根据ListView不同的使用情况选择不同的适配器。主要有两种ArrayAdapter / SimpleAdapter

ListView的关键操作是制作一个符合要求的Adapter,将数据注入ListView中。

2.ArrayAdapter / SimpleAdapter

  ArrayAdapter适配器是数组适配器,只能去适配展示很简单的格局,只能展示条目Item的一个控件。

  SimpleAdapter适配器是好用适配器,可以展示比ArrayAdapter复杂一些到格局,可以展示一个条目Item的多个控件。

两者创建的参数有所不同:

(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项(item)显示的布局,data:数据源变量);

(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:所要注入的数据源,layout:每个列表项(item)显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

其中:

data要整理为符合的形式,ArrayAdapter的data形式是数组,SimpleAdapter 的形式是ArrayList<HashMap<String, Object>>。

SimpleAdapter最后两个参数,new String[]是指在已经建好的hashmap的键值所对应的数据取出,放入new int[]所对应的控件中。

ArrayAdapter:

    private String[] data = {"Sunny","Cloudy","Few Clouds","Partly Cloudy","Overcast","Windy","Calm","Light Breeze"};
        //通过泛型来指定要适配的数据类型,然后在构造函数中把适配的数据传入。
        //android.R.layout.simple_list_item_1是ListView内置的一个子项布局,里面只有一个TextView,可显示一段文本
        //data表示要适配的数据
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        ListView listView = (ListView)findViewById(R.id.list_view);
        //将构建好的适配器对象传进去
        listView.setAdapter(adapter);

SimpleAdapter:

private String[] detail={"“白灼”是粤菜的一种烹调技法,就是用滚水或汤将食物烫熟。 多数的北方人都对“白灼”有一种概念上的混淆,认为白灼就是用白水煮一下捞出,其实不然,那是对字面上的一个误解,真正的白灼虾还是有几道工序的,经过一个朋友的指点,才得以顿悟。 白灼虾其实是最简单的,无需过多调料,没有繁杂的过程,也不必耗费大量的时间,甚至不用考虑食用时的温度,不用过多思忖摆盘的装饰,搭配一个同样简约的酸咸小味碟,就可以上桌了。 特别是想吃虾又懒得太操劳的人,可以选择做这道菜,简单又新鲜。也是我最钟爱的一道保留菜谱。 作为一只基围虾,衣衫齐整的出场体面面完整,无疑是对它的最高奖赏,绅士而优雅地被人类享用当然是最好的结局。",
            "相传,烤鸭之美,是源于名贵品种的北京鸭,它是当今世界最优质的一种肉食鸭。据说,这一特种纯北京鸭的饲养,约起于千年前左右,是因辽金元之历代帝王游猎,偶获此纯白野鸭种,后为游猎而养,一直延续下来,才得此优良纯种,并培育成今之名贵的肉食鸭种。即用填喂方法育肥的一种白鸭,故名“填鸭”。不仅如此,北京鸭曾在百年以前传至欧美,经繁育一鸣惊人。因而,作为优质品种的北京鸭,成为世界名贵鸭种来源已久。"
    };
    private String[] title={"白灼虾","北京烤鸭"};
    private int[] imageid={R.drawable.pic1,R.drawable.pic2};
    List<HashMap<String, Object>> data;
   
  data
=new ArrayList<HashMap<String, Object>>(); for(int i=0;i<title.length;i++){ HashMap<String,Object> showitem = new HashMap<String,Object>(); showitem.put("name",title[i]); showitem.put("says",detail[i]); showitem.put("img",imageid[i]); data.add(showitem); } //创建SimpleAdapter SimpleAdapter adapter=new SimpleAdapter(getApplicationContext(),data,R.layout.list_item,new String[]{"name","says","img"},new int[]{R.id.text1,R.id.text2,R.id.img}); lstmenu.setAdapter(adapter);

下面是别人的代码,对每个参数有解释:

        // 使用SimpleAdapter适配器
        ListAdapter listAdapter =
                new SimpleAdapter(this, // 上下文
                                  list,         // 数据
                                  android.R.layout.simple_list_item_2, // 使用系统的布局
                                  new String[]{"id", "name"}, // 设置Map的key,数据从哪里来
                                  new int[]{android.R.id.text1, android.R.id.text2}); // 系统布局的两个控件ID,数据设置到那里去

        // 把适配器给ListView
        listView.setAdapter(listAdapter);

补充:

在J2EE中提供过一种非常好的框架–MVC框架,实现原理:数据模型M(Model)存放数据,利用控制器C(Controller)将数据显示在视图V(View)上。在Android中有这样一种高级控件,他的实现过程就类似于MVC框架。之所以称它高级,是因为他的使用不像其他控件一样,拖拽到界面上就能用,而是需要通过适配器将某些样式的数据或控件添加到其上而使用,这样的控件就是我们今天要说的AdapterView。

一:AdapterView–>V(视图)

1:作用

以列表的形式显示数据

2: 内容

AdapterView的内容一般是包含多项相同格式资源的列表

3:特点

(1)将前端显示和后端数据分离

(2)内容不能通过ListView.add的形式添加列表项,需指定一个Adapter对象,通过它获得显示数据

(3)ListView相当于MVC框架中的V(视图)

(4)Adapter相当于MVC框架中的C(控制器)

(5)数据源相当于MVC框架中的M(模型)

(6)超出屏幕显示之后,自动加上滚动条

4:分类

(1)ListView:列表,其中只能含有一个控件TextView,

(2)Spinner:下拉列表,给用户提供选择

(3)Gallery:缩略图,已经被水平的ScrollView和ViewPicker取代,但也还算常用,是一个可以把子项以中心锁定,水平滚动的列表

(4)GridView:网格图,以表格形式显示资源,可以左右滑动的

5:事件

(1)用户单击列表项事件

◆为列表加载setOnItemClieckListener监听,重写onItemClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

(2)用户长按事件

◆为列表加载setOnItemLongClieckListener监听,重写onItemLongClick(发生单击事件的列表对象ListView,被单击控件对象view,在列表中的位置position,被单击列表项的行ID)方法。

6:数据填充

借助下面的Adapter适配器对象从数据源中进行适配

二:Adapter–>C(控制器)

1:作用

把数据源中数据以某种样式(xml文件)显示在视图中。

2:分类

(1)ArrayAdapter:他只能处理列表项内容全是文本的情况。

◆数据源:数组或者List对象或者其他

(2)SimpleAdapter: 他不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。

◆数据源:只能为List<Map<“键”,“值”>>形式的数据

(3)自定义Adapter:根据xml文件中定义的样式惊醒列表项的填充,适用性最强。

(4)SimpleCursorAdapter:专门用于把游标中的数据映像到列表中(我们以后再来研究)

3:自定义Adapter

(1)创建类,继承自BaseAdapter

(2)重写其中的四个方法

①int getCount():返回的是数据源对象的个数,即列表项数

②Object getItem(int position):返回指定位置position上的列表

③long getItemId(int position):返回指定位置处的行ID

④View getView():返回列表项对应的视图,方法体中

◆实例化视图填充器

◆用视图填充器,根据Xml文件,实例化视图

◆根据布局找到控件,并设置属性

◆返回View视图

三:数据填充

1:声明AdapterView对象,根据ID利用findViewById方法找到此对象

2:声明Adapter对象,根据构造方法实例化此对象。具体如下:

(1)ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量);

(2)SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID);

(3)自定义Adapter类 adapter = new 自定义Adapter类构造方法;

3:绑定Adapter对象到Adapter上

AdapterView对象.setAdapter(Adapter对象);

 

 

参考文章:MartinDongChang

Android: ListView的使用(列表控件)

上一篇:NetCore学习笔记:二、基于Dapper的泛型Repository


下一篇:Android: SharedPreferences的简单使用(数据可持久化)