Android UI组件----ListView列表控件详解
【声明】
欢迎转载,但请保留文章原始出处→_→
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:http://www.cnblogs.com/smyhvae/p/3910884.html
【正文】
内容简介:
• 1、基本的XML配置
• 2、ListActivity
• 3、单选和多选模式
• 4、ListView实现图文列表
• 5、ListView刷新分页
一、基本的 XML配置:
- android:cacheColorHint="#00000000" //设置拖动背景色为透明
- android:dividerHeight="30px" //listview item之间的高度(即分格条的高度)
- android:divider="@drawable/ic_launcher" //设置listview item之间背景或者说是颜色
- android:fadingEdge="vertical" //上边和下边有黑色的阴影,值为none的话就没有阴影
- android:drawSelectorOnTop="true" 点击某条记录不放,颜色会在记录的前面,成为前景色,记录上的文字被遮住,所以点击文字不放,文字就看不到(默认为false)
- android:scrollbars="horizontal|none" //只有值为horizontal|vertical的时候(默认也是这个值),才会显示滚动条,并且会自动影藏和显示
- android:fastScrollEnabled="true" //快速滚动效果,配置这个属性,在快速滚动的时候旁边会出现一个小方块,进行快速滚动,自动隐藏和显示(如果没有出现,是因为ListView item数目不够多)
- android:listSelector="@color/pink" //istViewl item选中时的颜色
- android:entries="@array/citys" //设置列表填充的内容
在ListView中加载本地数据,有两种方式,下面举例说明:(当然了,在这之前我们需要在布局文件activity_main.xml中添加一个ListView控件)
【方式一】:在xml文件中添加静态数据的方式:
在res/values/string.xml文件中, 添加一组静态数据,作为列表中将要填充的内容,代码如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">smyh005_ListView</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string> <string-array name="names">
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
<item >生命壹号</item>
</string-array> </resources>
紧接着,在布局文件的ListView控件中,添加如下属性:
android:entries="@array/names"
然后设置一下ListView的其他属性。这样,运行后,就可以显示一个简单的列表了。
【方式二】在java代码中来添加数据:
public class MainActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
String[] names = { "生命壹号", "生命壹号", "生命壹号", "生命壹号", "生命壹号", "生命壹号" };
//第二个参数,也可以新建一个布局文件,在这个布局文件的TextView当中设置其他属性。因为每个Item本身就是一个TextView
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, names);
listView.setAdapter(adapter);
}
【事件处理】
事件处理的监听器为:OnItemClickListener。
方法举例如下:(将当前点击的那个item的文本以吐司的方式显示出来)
listView1.setOnItemClickListener(new OnItemClickListener(){ //ListView的列表项的单击事件
@Override
//第一个参数:指的是这个ListView;第二个参数:当前单击的那个item
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
System.out.println("parent="+parent.getClass());
System.out.println("view="+view.getClass()); //既然当前点击的那个item是一个TextView,那我们可以将其强制转型为TextView类型,然后通过getText()方法取出它的内容,紧接着以吐司的方式显示出来
TextView tv = (TextView)view;
Toast.makeText(MainActivity.this,tv.getText(),Toast.LENGTH_SHORT).show();//方法: Toast makeText (Context context, CharSequence text, int duration) System.out.println("position="+position);
System.out.println("id="+id); } });
上面的第12、13行代码也可以替换成下面的这行代码:(因为通过adapter的getItem方法也可以获取对应Item,返回值类型是我们之前定义好的String类型)
Toast.makeText(MainAcivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show;
运行效果如下:
二、ListActivity
(1)如果程序的窗口仅仅只需要显示一个列表,则可以让这个activity直接继承ListActivity来实现,此时已经包含了一个ListView组件,不用再重新写布局文件了。
代码举例如下:
package com.smyhvae.smyh005listview;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
public class SecondActivity extends ListActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//通过代码设置ListView中的内容
String[] names = {"生命壹号","生命壹号","生命壹号","生命壹号","生命壹号","生命壹号"};
//通过ArrayAdaper将names的内容填充进去
//方法:public ArrayAdapter (Context context, int resource, int textViewResourceId),第二个参数为布局
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names);
// adpter和ListView进行绑定
setListAdapter(adapter); //注:通过getListView()可以取出这个ListView
}
}
运行后,也能显示出一个ListView。
(2)事件处理
事件处理的方法为:onListItemClick();
ListActiviy这个类中已经包含了事件处理的监听器,所以我们只需要复写其中的onListItemClick()即可:
//重写ListActivity中的onListItemClick方法来实现列表项的单击事件
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
}
(3)ListActivity的布局默认是由一个单一的在屏幕中心的全屏幕的列表,用setcontentview()在在oncreate()设置您自己的自定义屏幕布局视图布局,必须包含一个列表视图的对象ID:"@android:id/list“
(4)自定义视图可以包含任何类型,显示另一个视图对象列表视图是空的,必须包含一个视图对象的ID:android:id/empty。
三、单选和多选模式:
单选模式:
String[] cities = { "北京", "成都", "重庆", "武汉" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, cities);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
多选模式:
String[] cities = { "北京", "成都", "重庆", "武汉" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice, cities);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
五、ListView实现图文列表:
1、使用SimpleAdapter建立复杂的列表项:
使用到的方法是:
android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
- 第2个参数data:每个Item就是一个Map,多个Map放在一个List当中。这个List是一个集合对象。,每一个map中应该包含所有在from参数中指定的键;(例如,data里放入图片和文字)
- 第3个参数resource:一个自定义列表项的布局文件的资源ID。布局文件将至少应包含在to中定义了的ID。(通俗来说,就是先定义一个Item的模板)
- 第4个参数from:一个将被添加到Map映射上的键名
- 第5个参数to:将绑定数据的视图的ID,跟from参数对应,这些应该全是TextView。
举例说明,完整版代码如下:
布局文件activity3.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="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
下面新建一个布局文件activity_main_item.xml,作为一个Item的模板:
<?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="wrap_content"
android:orientation="horizontal"
android:gravity="center" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/vae" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="20sp" />
</LinearLayout>
这个布局文件展示的效果如下:
然后,MainActivity.java的代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
//步骤1 一个列表项的内容,就是一个item
Map<String, Object> item1 = new HashMap<String, Object>();
item1.put("image", R.drawable.vae);
item1.put("name", "许嵩");
//步骤1:一个列表项的内容,就是一个item,即一个Map
Map<String, Object> item2 = new HashMap<String, Object>();
item2.put("image", R.drawable.smyh);
item2.put("name", "生命壹号"); //步骤2:把这些Map放到List当中
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
data.add(item1);
data.add(item2); //注意:第四个参数和第五个参数要一一对应
SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
R.layout.activity_main_item, new String[] { "image", "name" },
new int[] { R.id.imageView1, R.id.textView1 });
//步骤3:将List中的内容填充到listView里面去
listView.setAdapter(simpleAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
运行后,效果如下:
【工程文件】
链接:http://pan.baidu.com/s/1pJLmvJt
密码:q63j
如果item比较多的话,可以用for循环来做
2、自定义适配器BaseAdapter实现更灵活的列表:【重要】
之前使用SimpleAdapter,它的局限性在于,SimpleAdapter已经将内部的结构(即每个item)封装好了,然后按照这种格式叠加起来,无法进行额外的处理。所以,这时候可以使用BaseAdapter实现更灵活的列表。
(1)方法:实际上,就是自己写一个MyAdapter类,让它继承BaseAdapter。需要复写该类的四个方法:
- public int getCount() :通过 adapter告诉 最要在 listView(view) 中显示 多少条目 的数据。
- public Object getItem(int position)
- public long getItemId(int position)
- public View getView(int position, View convertView, ViewGroup parent):用来 显示 【每个条目时】 会被调用到的 方法。
最重要的是 getCount() 和 getView()。
(2)ListView 的优化:
- 重复使用convertView
- 使用ViewHolder提高在容器中查找组件的效率
完整版代码如下:
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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
注:为了优化,第13行的代码一定要写match_parent,而不是wrap_content,解释略。
activity_main_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="wrap_content"
android:orientation="horizontal"
android:gravity="center" > <ImageView
android:id="@+id/imageView1"
android:layout_width="81dp"
android:layout_height="81dp"
android:src="@drawable/vae" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
Mainactivity.java:
package com.smyhvae.smyh005listview4;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter(new MyAdapter());
}
// 定义的数据
private int[] images = { R.drawable.vae, R.drawable.vae, R.drawable.vae,
R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae,
R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae,
R.drawable.vae };
private String[] names = { "生命01号", "生命02号", "生命03号", "生命04号", "生命05号",
"生命06号", "生命07号", "生命08号", "生命09号", "生命10号", "生命11号", "生命12号" }; //自定义适配器
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return names.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return names[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// System.out.println("position=" + position);
// System.out.println(convertView);
// System.out.println("------------------------");
ViewHolder vh = new ViewHolder();
//通过下面的条件判断语句,来循环利用。如果convertView = null ,表示屏幕上没有可以被重复利用的对象。
if(convertView==null){
//创建View
convertView = getLayoutInflater().inflate(R.layout.activity_main_item, null);
vh.iv = (ImageView) convertView.findViewById(R.id.imageView1);
vh.tv = (TextView) convertView.findViewById(R.id.textView1);
convertView.setTag(vh);
}else{
vh = (ViewHolder)convertView.getTag();
}
vh.iv.setImageResource(images[position]);
vh.tv.setText(names[position]);
return convertView;
} } static class ViewHolder{
ImageView iv;
TextView tv;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
运行效果如下:
【工程文件】
链接:http://pan.baidu.com/s/1hqvImfM
密码:oytm
五、ListView刷新分页
这个过程说来话长,具体参考本人另外一篇博客:
Android UI组件----自定义ListView实现动态刷新
我的公众号
想学习代码之外的软技能?不妨关注我的微信公众号:生命团队(id:vitateam)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
Android UI组件----ListView列表控件详解的更多相关文章
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
- 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar
原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...
- ToolBar控件详解
ToolBar控件详解 在Activity中添加ToolBar 1.添加库 dependencies { ... compile "com.android.support:appcompat ...
- C++ CComboBox控件详解
转载:http://blog.sina.com.cn/s/blog_46d93f190100m395.html C++ CComboBox控件详解 (2010-09-14 14:03:44) 转载▼ ...
- Switch控件详解
Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...
- Spinner控件详解
Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...
- IOS—UITextFiled控件详解
IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...
- picker控件详解与使用,(实现省市的二级联动)
picker控件详解与使用,(实现省市的二级联动) 第一步:新建一个单视图(single view)的工程, 命名为pickerTest,不要勾选下面两个选项,第一个是新版本里面的,第二个是单元测试, ...
随机推荐
- expect入门--自动化linux交互式命令
很多linux程序比如passwd,ftp,scp,ssh等自身并没有提供一种静默式的执行选项,而是依赖于运行时的终端输入来进行后一步的操作比如更改密码.文件上传.下载等.虽然有些编程语言如java嵌 ...
- JavaScript 中有关时间对象的方法
ECMAScript中的Date类型是在早期 Java 中的 Java.unile.Date 类基础上构建的.为此 Date 类型使用自 UTC (Coordinated Universal Time ...
- Silverlight的TextWrapping
Silverlight中TextBox的TextWrapping属性,作用是获取或设置 TextBlock 对文本进行换行的方式. 默认值为 TextWrapping.NoWrap. TextWrap ...
- tableview直接滚动至最后一行的问题
tableview直接滚动至最后一行 类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用sc ...
- JSP内置对象--request对象
本文主要介绍JSP中的request对象 request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttri ...
- 【原】开发路上疑难BUG调试记录
之前遇到棘手的BUG总是在处理过后就不管了,导致后面碰到相同问题后重复工作太多.现专门开辟一篇日志以记录接下来一路上比较棘手的“坑”的修复历程: [C++篇] 1.mt.exe : general e ...
- iOS开发笔记4:HTTP网络通信及网络编程
这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...
- linux路由表命令
转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用 ...
- Python基本数据结构-字典-创建/访问/基本操作/格式化输出
- 在IE8等不支持placeholder属性的浏览器中模拟placeholder效果
placeholder是一个很有用的属性,可以提示用户在input框中输入正确的内容,但是IE8以及IE8一下的浏览器不支持该属性,我们可以使用js来模拟相似的效果.下面直接上代码: <!doc ...