【声明】

欢迎转载,但请保留文章原始出处→_→

生命壹号: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列表控件详解的更多相关文章

  1. Android开发:文本控件详解——TextView(一)基本属性

    一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...

  2. Android开发:文本控件详解——TextView(二)文字跑马灯效果实现

    一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...

  3. 【转】【Android UI设计与开发】之详解ActionBar的使用,androidactionbar

    原文网址:http://www.bkjia.com/Androidjc/895966.html [Android UI设计与开发]之详解ActionBar的使用,androidactionbar 详解 ...

  4. ToolBar控件详解

    ToolBar控件详解 在Activity中添加ToolBar 1.添加库 dependencies { ... compile "com.android.support:appcompat ...

  5. C++ CComboBox控件详解

    转载:http://blog.sina.com.cn/s/blog_46d93f190100m395.html C++ CComboBox控件详解 (2010-09-14 14:03:44) 转载▼ ...

  6. Switch控件详解

    Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...

  7. Spinner控件详解

    Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...

  8. IOS—UITextFiled控件详解

    IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...

  9. picker控件详解与使用,(实现省市的二级联动)

    picker控件详解与使用,(实现省市的二级联动) 第一步:新建一个单视图(single view)的工程, 命名为pickerTest,不要勾选下面两个选项,第一个是新版本里面的,第二个是单元测试, ...

随机推荐

  1. expect入门--自动化linux交互式命令

    很多linux程序比如passwd,ftp,scp,ssh等自身并没有提供一种静默式的执行选项,而是依赖于运行时的终端输入来进行后一步的操作比如更改密码.文件上传.下载等.虽然有些编程语言如java嵌 ...

  2. JavaScript 中有关时间对象的方法

    ECMAScript中的Date类型是在早期 Java 中的 Java.unile.Date 类基础上构建的.为此 Date 类型使用自 UTC (Coordinated Universal Time ...

  3. Silverlight的TextWrapping

    Silverlight中TextBox的TextWrapping属性,作用是获取或设置 TextBlock 对文本进行换行的方式. 默认值为 TextWrapping.NoWrap. TextWrap ...

  4. tableview直接滚动至最后一行的问题

    tableview直接滚动至最后一行 类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用sc ...

  5. JSP内置对象--request对象

    本文主要介绍JSP中的request对象 request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttri ...

  6. 【原】开发路上疑难BUG调试记录

    之前遇到棘手的BUG总是在处理过后就不管了,导致后面碰到相同问题后重复工作太多.现专门开辟一篇日志以记录接下来一路上比较棘手的“坑”的修复历程: [C++篇] 1.mt.exe : general e ...

  7. iOS开发笔记4:HTTP网络通信及网络编程

    这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法.网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的 ...

  8. linux路由表命令

    转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用 ...

  9. Python基本数据结构-字典-创建/访问/基本操作/格式化输出

  10. 在IE8等不支持placeholder属性的浏览器中模拟placeholder效果

    placeholder是一个很有用的属性,可以提示用户在input框中输入正确的内容,但是IE8以及IE8一下的浏览器不支持该属性,我们可以使用js来模拟相似的效果.下面直接上代码: <!doc ...