ListView以垂直列表的形式显示所有列表项。

一. ListView的常用XML属性:

XML属性 描述
android:divider 设置List列表项的分割条(既可用颜色分割,也可用Drawable分割)。
android:dividerHeight 设置分割条的高度。
android:entries 指定一个数组资源,Android将根据该数组资源来生成ListView。
android:footerVDividersEnabled 如果设置为false,则不在footer View之前绘制分割条。
android:headerDividersEnabled 如果设置为false,则不在header View之前绘制分割条。

二. 使用arrays.xml创建ListView

<ListView
    android:id="@+id/myListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:entries="@array/books"
    android:divider="#ccc"
    android:dividerHeight="1dp"
    android:headerDividersEnabled="false" />

在arrays.xml文件中:

<?xml version="1.0" encoding="utf-8"?>
<reasources>
    <string-array name="books">
        <item>疯狂Android讲义</item>
        <item>Android编程指南</item>
        <item>Android和PHP开发最佳实践</item>
    </string-array>
</resources>

三. 使用Adapter创建ListView

使用Adapter创建ListView的3个步骤,如下:

  • 1) 新建一个数据适配器;
  • 2) 适配器加载数据源;
  • 3) 视图加载适配器。

3.1 使用ArrayAdapter创建ListView

ArrayAdapter方法的几种函数形式分别如下:

ArrayAdapter(Context context, int resource)
ArrayAdapter(Context context, int resource, int textViewResourceId)
ArrayAdapter(Context context, int resource, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, List<T> objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

参数解释:

context:当前上下文;

resource:当前ListView加载的每一个列表项所对应的布局文件;

objects:数据源;

textViewResourceId:一个TextView资源ID,用作ArrayAdapter的列表项对应的布局;

private ListView listView;
private ArrayAdapter<String>arrayAdapter;

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

// 1. 新建一个数据适配器
// ArrayAdapter(上下文, 当前ListView加载的每一个列表项所对应的布局文件, 数据源)
// 2. 适配器加载数据源
String[] arrayData = {"name1", "name2", "name3"};
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayData);

// 3. 视图加载适配器
listView.setAdapter(arrayAdapter);

3.2 使用SimpleAdapter创建ListVIew

SimpleAdapter的语法如下:

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

SimpleAdapter函数的参数如下:

context:当前上下文;

data:数据源(List<? extends Map > data)一个Map所组成的List集合,每一个Map都会qu对应ListView列表中的一行,每一个Map(键-值对)中的键必须包含所有在from中所指定的键;

resource:列表项的布局文件ID;

from:Map中的键名;

to:绑定数据视图中的ID,与from成对应关系;

private ListView listView;
private SimpleAdapter simpleAdapter;
private List<Map<String, Object>>dataList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

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

    // 1. 新建一个数据适配器
    /*
    * SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
    *
    * context:上下文
    * data:数据源(List<? extends Map<String, ?> > data)一个Map所组成的List集合,每一个Map都会qu对应ListView列表中的一行,每一个Map(键-值对)中的键必须包含所有在from中所指定的键
    * resource:列表项的布局文件ID
    * from:Map中的键名
    * to:绑定数据视图中的ID,与from成对应关系
    * */

    // 2. 适配器加载数据源
    dataList = new ArrayList<Map<String, Object>>();
    simpleAdapter = new SimpleAdapter(this, getData(), R.layout.item, new String[] {"pic", "title"}, new int[] {R.id.item_img, R.id.item_title});

    // 3. 视图加载适配器
    listView.setAdapter(simpleAdapter);
}

private List<Map<String, Object>> getData() {
    // 创建数据
    for(int i = 0; i < 20; i++) {
        Map<String, Object>map = new HashMap<String, Object>();
        map.put("pic", R.mipmap.ic_launcher);
        map.put("title", "项目" + i);

        dataList.add(map);
    }

    return dataList;
}

其中,R.layout.item的样式如下:(item.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/item_img"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp" />
    <TextView
        android:id="@+id/item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:textColor="#333"
        android:text="demo" />
</LinearLayout>

四. 监听ListView列表项点击事件

OnItemClickListener:处理视图中单个条目的点击事件。

实现OnItemClickListener的步骤:

  • 1 . 为Activity继承OnItemClickListener接口;
  • 2 . 为ListView加载视图监听器,如listView.setOnItemClickListener(this);
  • 3 . 重写OnItemClickListener对应的onItemClick()方法;

示例:

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    private ListView listView;
    private SimpleAdapter simpleAdapter;
    private List<Map<String, Object>>dataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        // 1. 新建一个数据适配器
        // 2. 适配器加载数据源
        dataList = new ArrayList<Map<String, Object>>();
        simpleAdapter = new SimpleAdapter(this, getData(), R.layout.item, new String[] {"pic", "title"}, new int[] {R.id.item_img, R.id.item_title});
        // 3. 视图加载适配器
        listView.setAdapter(simpleAdapter);

        // 为ListView加载视图监听器
        listView.setOnItemClickListener(this);
    }

    private List<Map<String, Object>> getData() {

        for(int i = 0; i < 20; i++) {
            Map<String, Object>map = new HashMap<String, Object>();
            map.put("pic", R.mipmap.ic_launcher);
            map.put("title", "慕课网" + i);

            dataList.add(map);
        }

        return dataList;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 获得当前列表项的对象信息
        String text= listView.getItemAtPosition(position) + "";

        Toast.makeText(this, "position = " + position + ", text = " + text, Toast.LENGTH_SHORT).show();
    }
}

效果图如下:

ListView-clickItem

五. 监听ListView滚动事件

OnScrollListener:检测滚动的变化(可以用于在视图滚动中加载数据);

public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener {

    private ListView listView;
    private SimpleAdapter simpleAdapter;
    private List<Map<String, Object>>dataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        // 1. 新建一个数据适配器
        // 2. 适配器加载数据源
        dataList = new ArrayList<Map<String, Object>>();
        simpleAdapter = new SimpleAdapter(this, getData(), R.layout.item, new String[] {"pic", "title"}, new int[] {R.id.item_img, R.id.item_title});
        // 3. 视图加载适配器
        listView.setAdapter(simpleAdapter);

        // 为ListView加载视图监听器
        listView.setOnScrollListener(this);

    }

    private List<Map<String, Object>> getData() {

        for(int i = 0; i < 20; i++) {
            Map<String, Object>map = new HashMap<String, Object>();
            map.put("pic", R.mipmap.ic_launcher);
            map.put("title", "列表项" + i);

            dataList.add(map);
        }

        return dataList;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch(scrollState) {
            // 用户在手指离开屏幕之前,由于手指用力滑了一下,视图仍然依靠惯性继续滑动
            case SCROLL_STATE_FLING:
                // 通过滑动增加5行数据
                for(int i = 0; i < 5; i++) {
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("pic", R.mipmap.ic_launcher);
                    map.put("title", "增加项" + i);
                    dataList.add(map);
                }

                // 通知UI线程重新刷新页面,更新动态数据
                simpleAdapter.notifyDataSetChanged();
                break;

            // 视图已经停止滑动
            case SCROLL_STATE_IDLE:
                break;

            // 手指没有离开屏幕,视图正在滑动
            case SCROLL_STATE_TOUCH_SCROLL:
                break;
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    }
}

效果图如下:

ListView-scroll

本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/others/mobile/707