布局与控件-ListView知多少(上)

Posted anddlecn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布局与控件-ListView知多少(上)相关的知识,希望对你有一定的参考价值。

第9节 ListView

在应用界面当中,经常需要使用列表来展示内容。
android SDK提供了ListView控件,来实现这种效果。

ListView需要和Adapter配合使用,ListView负责内容的显示,Adapter负责为ListView提供要展示的数据。

技术分享

列表的设计采用了将数据与展示分离的模式-数视分离。ListView负责数据的展现,Adapter负责向ListView提供要展示的数据,以及每条列表上的数据如何显示。

这是程序设计中常常用到的一种设计方法。这一章节我们主要介绍ListView,而它的搭档Adapter将放到下一章节详细介绍,所以现在我们只需要知道Adapter用来存放数据、规定每条列表项长什么样子。

9.1 ListView的使用方法

使用ListView展示内容,通常分下面几个步骤,

  1. 在布局文件中设置ListView布局;

    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_view">
    </ListView>
  2. 在Activity界面创建的时候(例如onCreate()当中),通过代码获取ListView

    ListView lv = (ListView) findViewById(R.id.list_view);
  3. 创建一个Adapter负责为ListView提供数据。Android SDK提供了很多类型的AdapterArrayAdapter CursorAdapter SimpleAdapter等等,它们都是BaseAdapter的子类,简化了Adapter的使用。要显示的数据和显示这项数据项的布局要设置给Adapter

    //每一项要显示的数据是一个字符串,这里设置显示3项
    String data[] = {"a", "b", "c"};
    //指定显示的数据内容,以及显示每项内容的布局文件
    ArrayAdapter adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1 , data);

    Android SDK提供了一些常用的数据项布局方式android.R.layout.simple_list_item_1 android.R.layout.simple_list_item_2等等。我们也可以自己设计每一项的布局方式,后面会讲到。

  4. Adapter设置给ListView,数据将以列表的形式被展示,

    lv.setAdapter(adapter);
  5. 为显示的每个item添加,点击时代响应处理函数;

    lv.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //添加需要响应的操作
        }
    });

综合以上的代码,就是,

ListView lv = (ListView) findViewById(R.id.list_view);
String data[] = {"a", "b", "c"};
ArrayAdapter adapter = new ArrayAdapter<String>(context, 
                android.R.layout.simple_list_item_1 , data);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //添加需要响应的操作
    }
});

运行以后,就能看到a b c以列表的形式,在界面上展现出来了。

技术分享

9.2 ListView内容的更新

如果需要展示的数据有变化,就需要更新ListView,需要注意,

  1. 界面的更新需要在主线程进行(UI线程),如果在其他线程更新,系统有可能报错,并提示你“不能在非UI线程更新界面元素”;
  2. 修改了Adapter中要展示的数据后,需要使用AdapternotifyDataSetChanged(),界面就会刷新,看到修改的效果;

例如,初始化显示列表,并显示内容

    //要显示的数据用链表的形式保存;
    List data = new ArrayList<String>();
    data.add("a");
    data.add("b");
    data.add("c");
    //指定显示的数据内容,以及显示每项内容的布局文件
    ArrayAdapter adapter = new ArrayAdapter<String>(context, 
                    android.R.layout.simple_list_item_1 , data);
    ......
技术分享

主线程中更新数据,并刷新,

//data已经做为数据列表保存到了Adapter当中,所以向这个data添加数据,会直接添加到Adapter保存的数据列表当中。
data.add("d");
adapter.notifyDataSetChanged();
技术分享

9.3 常用效果

9.3.1 修改点按时的背景效果

列表项的背景颜色是可以根据点按的不同状态而变化的,例如点击列表项的时候,背景颜色变深一点,出于选中的状态,背景颜色与别的项不同等等。
这一切只需要为ListViewlistSelector属性设置上一个Selector就好了,例如,

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:drawable="@color/normal"/>
    <item android:state_pressed="true" android:drawable="@color/pressed"/>
</selector>

其中,@color/normalres/values/colors.xml中,被设计成,

<color name="pressed">#FF0000</color> -->红色
<color name="normal">#BED1DB</color> -->淡青色

使用的时候就像这样,

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:listSelector="@drawable/list_selector" -->设定不同状态下,列表项的背景颜色
    android:id="@+id/list_view">
</ListView>
技术分享

大多数时候,希望那些没有被选中的列表项的背景颜色能和选中了但是没有被点击的列表项颜色一致,例如上面d列表项的背景要和c列表项没有被点击时一个颜色,那么可以为ListView的背景设置一个与没有点击的一样的颜色,

<ListView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:listSelector="@drawable/list_selector"
   android:background="@color/normal" -->设置一个没有点击时的背景颜色
   android:id="@+id/list_view">
</ListView>
技术分享

这里有个非常重要的地方需要注意:对于ListView来说,只有当列表项被点击(press)或者获取焦点(focus)的时候,它对应的列表项才会被使用ListView设置的这个Selector

所以对于那些没有被点击或者没有获取焦点的数据项,即使它们满足Selector中的某些条件,Selector也将完全不起作用。

9.3.2 修改分隔线

ListView中每一个列表项之间的分隔栏是可以进行调整的,可以通过android:divider属性设定它的颜色,通过android:dividerHeight属性设定它的高度,

<ListView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:divider="#FF0000"    -->设定分隔栏的颜色
   android:dividerHeight="2dp"  -->设定分隔栏的高度
   android:id="@+id/list_view">
</ListView>
技术分享

9.3.3 添加header和footer

ListView的顶部和底部,可以各添加上自定义栏。不过添加的过程需要在代码中进行,

  1. 用java代码或者xml的方式,创建要添加到header或者footer的界面;
  2. 使用addHeaderView()将header界面添加到ListView的顶部;
  3. 使用addFooterView()将footer界面添加到ListView的顶部;
//添加header
ListView lv = (ListView) findViewById(R.id.list_view);
TextView header = new TextView(this);
header.setText("This is header.");
header.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
lv.addFooterView(header);

//添加footer
TextView footer = new TextView(this);
footer.setText("This is footer");
footer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
lv.addFooterView(footer);
技术分享

9.3.4 ScrollBar

假如列表中的数据比较多,而用户又在上下滑动列表的时候,左边会出现一个滚动条,用来指示当前看到的内容在整个列表的比例位置。

技术分享

可以通过android:scrollbars属性来设置这个bar是否需要显示,

  1. none:永远不显示;
  2. vertial:需要的时候显示在右边栏;
  3. horizontal:需要的时候显示在下边栏;
<ListView
    android:layout_width="match_parent"
    android:scrollbars="none" -->不显示
    android:layout_height="match_parent"
    android:id="@+id/list_view">
</ListView>

9.3.5 FastScroller

当列表中的数据非常的多多时候,可以通过设置android:fastScrollEnabled属性,来启动FastScroller。可以让用户拖动右边的滑块,加快浏览的速度。不过,假如列表项不能占满4个屏幕的高度,那么即使设置了android:fastScrollEnabled属性,FastScroller也是不会出现的。毕竟数据少,也就不需要Fastscroller出马了。

<ListView
    android:layout_width="match_parent"
    android:fastScrollEnabled="true" -->允许使用FastScroller
    android:layout_height="match_parent"
    android:id="@+id/list_view">
</ListView>
技术分享

Fastscroller的滑块和轨道是可以自定义的,在应用的主题中设定android:fastScrollTrackDrawableandroid:fastScrollThumbDrawable属性,就可以做出修改,

<style name="AppTheme">
    <item name="android:fastScrollTrackDrawable">@color/track</item>
    <item name="android:fastScrollThumbDrawable">@mipmap/thumb</item>   
</style>
技术分享


以上是关于布局与控件-ListView知多少(上)的主要内容,如果未能解决你的问题,请参考以下文章

片段中 ListView 的 setOnItemClickListener

布局与控件-ListView的Adapter们

在片段中添加 ListView

片段中ListView的setOnItemClickListener

Android自定义控件--下拉刷新的实现

控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析