布局与控件-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
展示内容,通常分下面几个步骤,
在布局文件中设置
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>
在Activity界面创建的时候(例如onCreate()当中),通过代码获取
ListView
;ListView lv = (ListView) findViewById(R.id.list_view);
创建一个
Adapter
负责为ListView
提供数据。Android SDK提供了很多类型的Adapter
,ArrayAdapter
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
等等。我们也可以自己设计每一项的布局方式,后面会讲到。将
Adapter
设置给ListView
,数据将以列表的形式被展示,lv.setAdapter(adapter);
为显示的每个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
,需要注意,
- 界面的更新需要在主线程进行(UI线程),如果在其他线程更新,系统有可能报错,并提示你“不能在非UI线程更新界面元素”;
- 修改了
Adapter
中要展示的数据后,需要使用Adapter
的notifyDataSetChanged()
,界面就会刷新,看到修改的效果;
例如,初始化显示列表,并显示内容
//要显示的数据用链表的形式保存;
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 修改点按时的背景效果
列表项的背景颜色是可以根据点按的不同状态而变化的,例如点击列表项的时候,背景颜色变深一点,出于选中的状态,背景颜色与别的项不同等等。
这一切只需要为ListView
的listSelector
属性设置上一个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/normal
在res/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
的顶部和底部,可以各添加上自定义栏。不过添加的过程需要在代码中进行,
- 用java代码或者xml的方式,创建要添加到header或者footer的界面;
- 使用
addHeaderView()
将header界面添加到ListView
的顶部; - 使用
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是否需要显示,
none
:永远不显示;vertial
:需要的时候显示在右边栏;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:fastScrollTrackDrawable
和android:fastScrollThumbDrawable
属性,就可以做出修改,
<style name="AppTheme">
<item name="android:fastScrollTrackDrawable">@color/track</item>
<item name="android:fastScrollThumbDrawable">@mipmap/thumb</item>
</style>
以上是关于布局与控件-ListView知多少(上)的主要内容,如果未能解决你的问题,请参考以下文章
片段中 ListView 的 setOnItemClickListener