android 之ListView

本文详细介绍了Android中的ListView组件,包括其常用属性如divider、dividerHeight、scrollbars等,以及监听方法如onItemClickListener和onItemLongClickListener。还讨论了如何设置空视图、头视图和脚视图。此外,提到了ListView与ArrayAdapter、SimpleAdapter和BaseAdapter的配合使用,展示了如何通过Adapter填充数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 之ListView


ListView是什么:ListView是一个显示一个垂直滚动列表中的视图。
ListView原理视图


ListView基本用法:

1 ListView常用属性
android:divider//在列表条目之间显示的drawable或color
android:dividerHeight//用来指定divider的高度
android:scrollbars//设置右侧滚动条显示效果
android:cacheColorHint// 表明这个列表的背景始终以单一、固定的颜色绘制,可以优化绘制过程。
android:listSelector// 设置选中项显示的可绘制对象,可以是图片或者颜色属性。
android:entries//构成ListView的数组资源的引用。对于某些固定的资源,这个属性提供了比在程序中添加资源更加简便的方式
android:footerDividersEnabled//当设为false时,ListView将不会在各个footer之间绘制divider.默认为true。
android:headerDividersEnabled//当设为false时,ListView将不会在各个header之间绘制divider.默认为true。
android:choiceMode//为视图指定选择的行为。可选的类型有:none、singleChoice、multipleChoice、multipleChoiceModal。
android:drawSelectorOnTop// 若设为true,选择器将绘制在选中条目的上层。默认为false。
android:faseScrollEnabled// 设置是否允许使用快速滚动滑块。
android:scrollingCache// 设置在滚动时是否使用绘制缓存。若设为true,则将使滚动表现更快速,但会占用更内存。默认为true。
android:smoothScrollbar// 为真时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。默认该属性为真,如果你的适配器需要绘制可变高的条目,他应该设为假。当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的过程中改变大小。当设为假时,列表只使用适配器中的条目数和屏幕上的可见条目来决定滚动条的属性。
android:stackFromBottom// 设置GridView和ListView是否将内容从底部开始显示。
android:textFilterEnabled// 当设为真时,列表会将结果过滤为用户类型。前提是这个列表的Adapter必须支持Filterable接口。

android:transcriptMode//设置列表的transcriptMode.有如下选项可选:
//(1)disabled 禁用TranscriptMode,也是默认值;
//(2)normal 当新条目添加进列表中并且已经准备好显示的时候,列表会自动滑动到底部以显示最新条目;
//(3)alwaysScroll 列表会自动滑动到底部,无论新条目是否已经准备好显示.

android:addStatesFromChildren// 设置这个ViewGroup的drawable状态是否包括子View的状态。若设为true,当子View如EditText或Button获得焦点时,整个ViewGroup也会获得焦点。
android:alwaysDrawnWithCache// 设置ViewGroup在绘制子View时是否一直使用绘图缓存。默认为true。

android:descendantFocusability// 定义当寻找一个焦点View的时候,ViewGroup与其子View之间的关系。可选项为:
//(1)beforeDescendants ViewGroup会比其子View更先获得焦点;
//(2)afterDescendants 只有当无子View想要获取焦点时,ViewGroup才会获取焦点;
//(3)blockDescendants ViewGroup会阻止子View获取焦点

android:layoutAnimation//定义当ViewGroup第一次展开时的动画效果,也可人为地在第一次展开后调用。

android:persistentDrawingCache// 定义绘图缓存的持久性。有如下可选项:
//(1)none 当使用过后不保留绘图缓存
//(2)animation 在layout animation之后保留绘图缓存
//(3)scrolling 在Scroll操作后保留绘图缓存
//(4)all always保留绘图缓存


2 ListView常用监听方法
item点击事件
lv.setOnItemClickListener(new OnItemClickListener() {})
item长按事件
lv.setOnItemLongClickListener(new OnItemLongClickListener() {});



扩展: ListView相关方法
setEmptyView(); 当listview里面的数据为空的时候显示的view
2种方法
1.在xml中listview的同级布局中写empty时显示的view
1.1绘制xml布局
<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:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/list_view" />
<TextView
android:id="@+id/empty_list_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="List view is empty"
android:visibility="gone" />
</LinearLayout>
1.2.设置emptyview
ListView list= (ListView)findViewById(R.id.mylist);
TextView tv= (TextView)findViewById(R.id.myempty);
list.setEmptyView(tv);
2.在代码中添加emptyview。
2.1.将emptyview加入到当前view hierarchy上
方法1:
TextView emptyView = new TextView(context);
emptyView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
emptyView.setText(“This appears when the list is empty”);
emptyView.setVisibility(View.GONE);
((ViewGroup)list.getParent()).addView(emptyView);
方法2:
inflater = getLayoutInflater();
emptyView = inflater.inflate(R.layout.empty_view, null);
addContentView(emptyView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
list.setEmptyView(emptyView);
2.2设置emptyview
list.setEmptyView(emptyView);

setHeaderView();给listview添加一个头View
setFooterView();给listview添加一个脚view
使用:
使用ListView必须要配合Adapter适配器
--------------------------------------------------------------------------------------------------------
Adapter的分类 :1.ArrayAdapter:
在布局文件1里加入ListView
<ListView
android:id="@+id/firstListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
获得ListView对象
ListView listView = (ListView)findViewById(id);
数据源(需要展示在listview上的数据)
List<String> data = new ArrayList<String>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
用Adapter适配器把item(展示数据的view容器)和data数据源联系起来
new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,data);
参数: 1. 第一个this:context上下文对象
2. 第二个参数:系统自带展示数据的view容器或者自己定义的单条数据的容器
3. 第三个参数:需要展示在ListView上的数据
把Adapter适配器放进ListView
listView.setAdapter(adapter);
--------------------------------------------------------------------------------------------------------

2.SimpleAdapter:
2.1在布局文件里加入ListView,并在代码中找到该listview
ListView lv = (ListView) findViewById(R.id.lv);

2.2item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp" />
</LinearLayout>

2.3数据源为List<Map<String,?>>
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 10; i++) {
Map<String, Object> map = new HashMap<String, Object>();
if (i % 2 == 0) {
map.put("people", "美女" + i + "号");
map.put("img", R.drawable.woman);
} else {
map.put("people", "帅哥" + i + "号");
map.put("img", R.drawable.man);
}
data.add(map);
}


2.4构造器:new SimpleAdapter(this,数据源,xml布局文件,new String[]{key1,key2},new int[]{R.id.image,R.id.textview});
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, data,
R.layout.items, new String[] { "people", "img" }, new int[] {R.id.tv, R.id.iv });
说明:①key为数据源Map的键
②String[]和int[]必须一一对应


2.5把Adapter适配器放进ListView
listView.setAdapter(adapter);

--------------------------------------------------------------------------------------------------------
3.BaseAdapter(!)
①创建一个类MyBaseAdapter,继承BaseAdapter
②重写4个方法
getCount() //返回数据源的大小
getView() //返回每一行的view
getItem() //根据position返回一个item对象
getItemId() //根据postion返回行数
③在getView方法中去展示数据
1、 获得每一个item的View
// 1.得到布局容器对象
LayoutInflater inflater = LayoutInflater.from(context);
// 2.把布局文件装进布局容器里面,得到item的view
View view = inflater.inflate(R.layout.items, null);
2、找到item里面的控件
TextView tv = (TextView) view.findViewById(R.id.tv);
ImageView iv = (ImageView) view.findViewById(R.id.iv);
3、给每一个控件设置值
tv.setText(list.get(position).text);
iv.setImageResource(list.get(position).img);
4、记得修改return的值
return view;
--------------------------------------------------------------------------------------------------------
ListView使用总结:
1.在xml中写一个ListView,并找到listview
2.创建一个数据源
3.实例化adapter
4.设置adapter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值