LIstView

来源:互联网 发布:nginx content length 编辑:程序博客网 时间:2024/06/03 15:59

android ListView及ArrayAdapter,SimpleCursorAdapter,SimpleAdapter用法示例

文章分类:移动开发

 

选自: 1 http://www.cnblogs.com/wservices/archive/2010/06/17/1759793.html

2 [原创技术] 连载(12 ):SimpleCursorAdapter 类与数据绑定

3 http://blog.sina.com.cn/s/blog_6213b4e50100lk9i.html

 

布局

LiveActivity 本身继承了关于 List 操作的众多接口,我们可以方便的重写这些操作中需要的方法来实现自己需要的功能。

如果要用 ListActivity ,则 Activity Layout 文件中必须包括一个(只能一个) ListView ,且 ListView id="@id/android:list"

如下代码,一个标准的 ListActivity Layout 文件:

  <?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

         android:orientation="vertical"

         android:layout_width="fill_parent"

         android:layout_height="fill_parent"

         android:paddingLeft="8dp"

         android:paddingRight="8dp">

     <ListView android:id="@id/android:list"

               android:layout_width="fill_parent"

               android:layout_height="fill_parent"

               android:background="#00FF00"

               android:layout_weight="1"

                android:drawSelectorOnTop="false"/>

     <TextView id="@id/android:empty"

               android:layout_width="fill_parent"

               android:layout_height="fill_parent"

               android:background="#FF0000"

               android:text="No data"/>

  </LinearLayout>

 

请注意 ListView TextView id 。前面说了, ListView Id 为固定不变的,为” @./idandroid:ost ”, ListActivity 会根据 id 自动查找 ListView 引用;但如果当 ListView 中没有值而又想提示一句话时,那么用于指定显示提示信息的 TextView id 必须为” "@id/android:empty" ,提示的信息可以通过 android:text 进行指定。

 

绑定

OK ,关于如何布局说完了,那么如何给 List 绑定值,并进行操作呢?

首先我们需要确实的是, ListView 的布局也完成了,并通过调用 setContentView( ) 进行了绑定,但直到现在我们还没有确定 ListView 中的第一行显示的格式是什么,是直接显示文字还是要“图文并茂”的显示。

Android 系统为我们提供了多种模板进行选择 (android.R.layout) ,如

  Simple_list_item_1 每项有一个 TextView

  Simple_list_item_2 每项有两个 TextView

  Simple_list_item_checked CheckView 的项

  Simple_list_item_multiple_choise 每项有一个 TextView 并可以多选

  Simple_list_item_single_choice 每项有一个 TextView ,但只能进行单选。 

 

但然,如果以上项模板还无法满足你的要求,那只能自定义模板了(相当简单,就是定义一个 layout 布局)。如果你做的 asp.net 的开发的话,是否对 dataList 控件有印象呢。如果对 DataList 有印象,那么理解 ListView 也就相当的简单了。

自定义模板可以根据自己的需要定义成任意的格式,包括图片、方案及其他可显示的 View ,不用多说,自己定义就好了,关键是如果使用并进行模板的绑定。

如何要对 ListView 进行数据绑定,必须使用到一个接口: Adapter

其中最经常与 ListView 进行配合使用的有 ArrayAdapter CursorAdapter SimpleAdapter 等。

从名称可以看出 ArrayAdapter 使用的是一个 ArrayAdapter 做为数据源, SimpleCursorAdapter 使用的是一个 Cursor 使用数据源,都比较容易理解,那么如何使用 SimpleAdapter 作为数据的适配器呢。 Ok ,从易到难。

ArrayAdapter:

  ListView listView;

  String[] data = { "Item1", "Item2",

        "Item3", "Item4", "Item5" };

  listView=(ListView)findViewById(R.id.lv);

  listView.setAdapter(new ArrayAdapter<String>(this,

     android.R.layout.simple_list_item_single_choice, data)); 

 

SimpleCursorAdapter:

SimpleCursorAdapter 类构造方法的定义。

public SimpleCursorAdapter(Context context, intlayout, Cursor c, String[] from, int[] to)

在本节的例子中会通过 SimpleCursorAdapter 类将一个数据表绑定在 ListView 上,也就是说,该 ListView 会显示数据表的全部记录。在绑定数据之前,需要先编写一个 SQLiteOpenHelper 类的子类,用于操作数据库

见附件:

         public class DBService extends SQLiteOpenHelper{}     

    由于本例不需要对 test.db 进行升级,因此,只有在 DBServie 类的 onCreate 方法中有创建数据表的代码。 DBService 类创建了一个 test.db 数据库文件,并在该文件中创建了 t_test 表。在该表中包含了两个字段: _id name 。其中 _id 是自增字段,并且是主索引。

下面来编写 Main 类。在该类的 onCreate 方法中创建了 DBService 对象,然后通过 DBService 类的 query 方法查询出 t_test 表中的所有记录,并返回 Cursor 对象。见附件

         public class Main extends Activity{}

SimpleCursorAdapter 类构造方法的第 4 个参数表示返回的 Cursor 对象中的字段名,而第 5 个参数表示要将该字段的值赋给哪个组件。该组件在第 2 个参数指定的布局文件中定义。

 

注意:在绑定数据时, Cursor 对象返回的记录集中必须包含一个叫“ _id ”的字段,否则将无法完成数据绑定。也就是说 SQL 语句不能是 select name from t_contacts 。如果在数据表中没有“ _id ”字段,可以采用其他的方法来处理。详细处理方法见本章的实例 39

 

小知识:数据库文件存到哪了?

    光看到本节的例子建立了 SQLite 数据库文件,那么数据库文件被放到哪个目录了呢。如果使用 SQLiteOpenHelper 类的 getReadableDatabase getWritableDatabase 方法获得 SQLiteDatabase 对象,那么系统会在手机内存的 /data/data/<packagename>/databases 目录中创建数据库文件。当然,使用这两个方法也只能打开这个目录中的数据库文件。

 

SimpleAdapter:

simpleAdapter 的构造函数 如下:

SimpleAdapter(Context context, List <? extends Map <String, ?>> data, int resource, String[] from, int[] to)

一个 SimlpleAdapter 是这个工作的。假设将 SimpleAdapter 用于 ListView 。那么 ListView 的每一个列表项就是 resource 参数值指定的布局。而 data 参数就是要加载到 ListView 中的数据。我们先看每一个列表项,假设列表项所对应的布局文件中包含了两个组件: TextView EditText id 分别为 textview edittext 。那么在加载列表项时,需要通过组件的 id data 参数中 List 元素中的 Map 对象对应。因此, from 参数 Map 对象的 key ,而 to 表示组件的 id ,例如,本例中的参数值为 from = new String[]{"textview", "edittext"} to = new int[]{R.id.textview R.id.edittext} 。意思就是将 Map 对象中 key textview value 绑定到 R.id.textview 上, edittext 也类似。

现在来看 data 参数,一个 ListView 由多个列表项组成。每一个列表项由一个 Map 对象提供数据,而多个列表项则由 List 对象提供多个 Map 对象。 OK ,就是这么简单,只要了解了它们的工作原理,一切就可以搞定。如果还不太明白,自己做个例子吧。 good luck

这是我做的一个小例子,你如果有什么不明白可以做一下,就知道了。

见附件 simpleAdapter.xml 文件 ,TestSimpleAdapter

原创粉丝点击