ListActivity

    ListActivity是一个专门显示ListView的Activity类,它内置了ListView对象,只要我们设置了数据源,就会自动地显示出来。

 

使用custom view for screen layout

     虽然ListActivity内置了ListView对象,但我们依然可以使用custom view,通过在onCreate()里面调用setContentView(resources id)

    不过要注意的是,在自定义的Layout里面,要设置ListView对象的id为"@android:id/list";在Java代码里使用android.R.id.list

    下面的例子,通过添加一个id为android:empty的TextView,当ListView里面没有data的时候,就会显示"No data"。

    自定义的View (listview.xml):

<? 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" >

         < ListView android:id="@id/android:list"
                 android:layout_width ="fill_parent"
                 android:layout_height ="fill_parent"
                 android:layout_weight="1"
         />

         < TextView android:id="@id/android:empty"
                 android:layout_width ="fill_parent"
                 android:layout_height ="wrap_content"
                 android:text ="No data"
                 android:textColor ="#ff0000"
         />
LinearLayout >

    加载Layout:

@Override
public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.listview);

         //没有设置data source
}  

Row Layout

官方提供了多种ListItem的Layout (R.layout),以下是较为常用的,更多的请查看API DOC的R.layout http://androidappdocs.appspot.com/reference/android/R.layout.html

  • android.R.layout.simple_list_item_1   一行text
  • android.R.layout.simple_list_item_2   一行title,一行text
  • android.R.layout.simple_list_item_single_choice   单选按钮
  • android.R.layout.simple_list_item_multiple_choice   多选按钮
  • android.R.layout.simple_list_item_checked    checkbox

我们可以自定义自己的Layout (list_item.xml):

<? xml version ="1.0" encoding ="utf-8" ?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
         android:orientation ="horizontal"
         android:layout_width ="fill_parent"
         android:layout_height ="fill_parent" >

         < ImageView android:id ="@+id/icon"
                 android:layout_width ="48dip"
                 android:layout_height ="48dip" />

         < TextView android:id ="@+id/text"
                 android:layout_gravity ="center_vertical"
                 android:layout_width ="0dip"
                 android:layout_weight ="1"
                 android:layout_height ="wrap_content" />

LinearLayout >

 使用时,以R.layout.list_item引用就行了。可以参考http://androidappdocs.appspot.com/resources/tutorials/views/hello-listview.html。

 

绑定数据

    通过调用SetListAdapter(ListAdapter adapter)就可实现。我们可以implements ListAdapter来自定义自己的数据源。API内置了几个implements ListAdapter的Adapter:BaseAdapterSimpleAdapter (以Map的形式存储静态数据),SimpleCursorAdapter (用于游标查询的结果)等等。通常我们更多地extends BaseAdapter来编写自己的Adapter类,因为BaseAdapter类是其他Apdater类的基类。扩展BaseAdapter类一般都需要重写以下方法

    int     getCount()                   获取当前Adapter的Items数目

    Object getItem(int position)     获取相应position的Item

    long     getItemId(int position)  获取相应position的Item在List中的row id

    View    getView(int position, View convertView, ViewGroup parent) 获取在指定position所要显示的data的View

    详细内容可以查看BaseAdapter类的继承android.widget.Adapter的方法,有时也需要重写ListAdapter的boolean isEnabled(int position)来实现某些效果。

    接下来看看几个绑定数据的例子:

    1. 使用ArrayAdapter

public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         //参考ArrayAdapter的构造函数
        setListAdapter( new ArrayAdapter( this,
                         android.R.layout.simple_list_item_1,
                        mStrings));

         //在ListView上输入字母,就会自动筛选出以此内容开头的Item
        getListView().setTextFilterEnabled( true);
}

private String[] mStrings = { "A", "Android", "机器人", "Google"};

 

    2. 使用SimpleCursorAdapter

    这是Sample里面List3例子,通过读取通讯录android.provider.Contacts.Phones的资料,显示出来。 protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         // Get a cursor with all phones
        Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
         startManagingCursor(c);
        
         // Map Cursor columns to views defined in simple_list_item_2.xml
        ListAdapter adapter = new SimpleCursorAdapter( this,
                        android.R.layout.simple_list_item_2, c,
                                         new String[] { Phones.NAME, Phones.NUMBER },
                                         new int[] { android.R.id.text1, android.R.id.text2 });
        setListAdapter(adapter);
}  

    3. ListItem为单选按钮

public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         //参考ArrayAdapter的构造函数
        setListAdapter( new ArrayAdapter( this,
                         android.R.layout.simple_list_item_single_choice,
                        mStrings));

         final ListView listView = getListView();
        listView.setItemsCanFocus( false);
         listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设置单选模式
}

private String[] mStrings = { "A", "Android", "机器人", "Google"};

 

    4. ListItem为多选按钮

    把例子3的设置为android.R.layout.simple_list_item_multiple_choice以及选择模式ListView.CHOICE_MODE_MULTIPLE。

 

更多的例子可以参考官方的Sample,在此列出相关List的示例说明:

List1 - 使用ArrayAdapter并setTextFilterEnabled(true)

List2 - 使用SimpleCursorAdapter读取通讯录People.NAME

List3 - 使用SimpleCursorAdapter读取通讯录Phones,两行显示Item

List4 - 使用自定义Adapter以及自定义ItemView

List5 - 带有separator的ListView,通过自定义Adapter,重写boolean isEnabled(int position)

List6 - 使用自定义Adapter以及自定义ItemView,可伸展隐藏内容

List7 - 使用SimpleCursorAdapter读取数据

List8 - 展现使用setEmptyView效果

List9 - 涉及OnScrollListener

List10 - ListItem为单选按钮

List11 - ListItem为多选按钮

List12 - 可以动态添加ListItem

List13 - 如何加快操作显示,during scrolls or flings的时候

List14 - 如何编写高效的List Adapter

 

其中List14,官方告诉我们:

To work efficiently the adapter implemented here uses two techniques:

 * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary

 * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary

  还告诉了我们 ViewHolder类的作用:

 * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by

 * getView(). This data structures contains references to the views we want to bind data to, thus

 * avoiding calls to findViewById() every time getView() is invoked.

 

    另外在以上的例子里面了解到,使用自定义Adapter,当数据发生变化后需要调用notifyDataSetChanged()来刷新ListView,但在List12的例子,使用ArrayAdapter却没有调用这方法,而随后自己写代码,在发生的异常里面了解到BaseAdapter,ArrayAdapter是会调用自己的notifyDataSetChanged()。可以查看后面的文章《有关Android线程的学习》里面的例子!

  

ListView的事件响应

    通常我们响应ListItem的点击事件:protected void onListItemClick(ListView l, View v, int position, long id) ,在此不详细讲了,理解该函数里面的参数意义就行了。

更多相关文章

  1. .Net 转战 Android(安卓)4.4 日常笔记(10)--PullToRefresh下拉刷新
  2. 实现简单的Android的播放视频功能
  3. Android(安卓)自定义View及其在布局文件中的使用示例(二)
  4. android创建文件夹
  5. Java/Android引用类型及其使用分析
  6. Android使用ADB启动应用程序
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 还在为android图标适配烦恼?字体图标你值
  2. Android 上传图片到后台的一直方式Base64
  3. RecyclerView的使用详解
  4. Android常用UI之AlertDialog
  5. android Button 样式
  6. Android中监听Home键的4种方法总结
  7. Android动态加载技术初探
  8. Android中的树状(tree)列表
  9. 我的android 第14天 - 使用SQLiteDatabas
  10. android 高级工程师成长之路(Android高手