Android 列表视图(ListView)

  • Android 列表视图

    Android ListView是将多个项目分组并在垂直滚动列表中显示的视图。列表项是使用适配器从列表或数据库等源中自动提取内容的适配器自动插入列表中的。
    适配器实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁。适配器保存数据并将数据发送到适配器视图,该视图可以从适配器视图获取数据,并在不同的视图(例如微调器,列表视图,网格视图等)上显示数据。所述的ListView和GridView的是的子类适配器视图并且它们可以通过它们结合至填充适配器,其从外部源检索数据,并创建一个视图,表示每个数据条目。Android提供了Adapter的几个子类,这些子类对于检索不同类型的数据和为AdapterView(即ListView或GridView)构建视图很有用。常见的适配器是ArrayAdapter,Base Adapter,CursorAdapter,SimpleCursorAdapter,SpinnerAdapter和WrapperListAdapter。我们将看到两个适配器的单独示例。
  • ListView 属性

    以下是ListView的重要属性-
    属性 说明
    android:id 这是唯一标识布局的ID。
    android:divider 这是可绘制的或可在列表项之间绘制的颜色。
    android:dividerHeight 这指定分隔线的高度。可以是px,dp,sp,in或mm。
    android:entries 指定对将填充ListView的数组资源的引用。
    android:footerDividersEnabled 设置为false时,ListView不会在每个页脚视图之前绘制分隔线。默认值是true。
    android:headerDividersEnabled 设置为false时,ListView将不会在每个标题视图之后绘制分隔线。默认值是true。
  • ArrayAdapter

    当您的数据源是数组时,可以使用此适配器。默认情况下,ArrayAdapter通过在每个数组项上调用toString()并将其内容放置在TextView中,为每个数组项创建一个视图。假设您有一个要在ListView中显示的字符串数组,请使用构造函数初始化一个新的ArrayAdapter,以指定每个字符串和字符串数组的布局-
    
    ArrayAdapter adapter = new ArrayAdapter<String>(this,R.layout.ListView,StringArray);
    
    这是此构造函数的参数-
    • 第一个参数这是应用程序上下文。在大多数情况下,请保持此状态。
    • 第二个参数将是XML文件中定义的布局,并为数组中的每个字符串提供TextView。
    最终参数是将在文本视图中填充的字符串数组。创建数组适配器后,只需在ListView对象上调用setAdapter(),如下所示:
    
    ListView listView = (ListView) findViewById(R.id.listview);
    listView.setAdapter(adapter);
    
    您将在XML文件的res/layout目录下定义列表视图。对于我们的示例,我们将使用activity_main.xml文件。
  • ArrayAdapter 示例

    下面的示例将引导您完成简单的步骤,以展示如何使用ListView创建自己的Android应用程序。请按照以下步骤修改我们在“Hello World示例”一章中创建的Android应用程序-
    1. 您将使用Android Studio创建一个Android应用程序,并将其命名为Demo,位于com.jc2182.demo包下,如Hello World示例一章中所述。
    2. 修改res/layout/activity_main.xml文件的默认内容,以包含具有自说明属性的ListView内容。
    3. 创建一个文本视图文件res/layout/activity_listview.xml。该文件将具有显示所有列表项的设置。因此,您可以使用此文件来自定义其字体,填充,颜色等。
    4. 运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。
    以下是修改后的主要活动文件src/com.jc2182.demo/MainActivity.java的内容。该文件可以包括每个基本生命周期方法。
    
    package com.jc2182.demo;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends Activity {
    
        // Array of strings...
        String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry","WebOS","Ubuntu","Windows10","Max OS X"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, mobileArray);
    
            ListView listView = (ListView) findViewById(R.id.mobile_list);
            listView.setAdapter(adapter);
        }
    }
    
    以下是res/layout/activity_main.xml文件的内容-
    
    <LinearLayout 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"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <ListView
            android:id="@+id/mobile_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        </ListView>
    
    </LinearLayout>
    
    以下是res/layout/activity_listview.xml文件的内容-
    
    <?xml version="1.0" encoding="utf-8"?>
    <!--  Single List Item Design -->
    
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/label"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:padding="10dip"
       android:textSize="16dip"
       android:textStyle="bold" >
    </TextView>
    
    让我们尝试运行刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后工具栏中单击“运行”图标。Android studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-
  • SimpleCursorAdapter

    当您的数据源是数据库Cursor时,可以使用此适配器。使用SimpleCursorAdapter时,必须指定要用于Cursor中的每一行的布局,以及Cursor中的哪些列应插入到布局的哪些视图中。例如,如果要创建一个人的姓名和电话号码列表,则可以执行查询,该查询返回一个Cursor,其中包含每个人的一行以及姓名和电话号码的列。然后,您创建一个字符串数组,该字符串数组指定每个结果在布局中要从游标中的哪些列,以及一个整数数组,该整数数组指定应放置各列的对应视图-
    
    String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
    int[] toViews = {R.id.display_name, R.id.phone_number};
    
    实例化SimpleCursorAdapter时,传递用于每个结果的布局,包含结果的Cursor以及这两个数组-
    
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0); 
    ListView listView = getListView();
    listView.setAdapter(adapter);
    
    然后,SimpleCursorAdapter使用提供的布局为Cursor中的每一行创建一个视图,方法是将“ from Columns”项插入到相应的“ toViews”视图中。