课程目标
1.理解ListView的基础使用
2.学会熟练运用两种适配器(ArrayAdapter、SimpleAdapter)
3.学会熟练运用两种监听器(OnScrollListener、OnItemClickListener)
4.学会数量运用适配器数据的刷新(notifyDataChanged)

ListView
作用:android系统中显示列表的控件
ListView控件(每一个ListView都可以包含很多个列表项)

数据适配器
作用:把复杂的数据(数组、链表、数据库、集合等)填充在制定视图界面上
ArrayAdapter(数组适配器):用于绑定格式单一的数据
数据源:可以是集合或数组
SimpleAdapter(简单适配器):用于绑定格式复杂的数据
数据源:只能是特定泛型的集合
数据适配器是链接数据源和视图见面的桥梁
实现过程:新建适配器->添加数据源到适配器->视图加载适配器

新建一个数组适配器:ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件,数据源)
arr_adapter = new ArrayAdapter<Stirng>(this, android.R.layout.simple_list_item_1, arr_data);
视图加载适配器:listView.setAdapter()方法。

ListView with ArrayAdapter:

        String[] arrData = new String[] { "apple", "banana", "orange", "pear" };
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrData);
listView.setAdapter(arrayAdapter);

SimpleAdapetr(context, data, resource, from, to)
context:上下文
data:数据源(List<? extends Map<String,?>> data) 一个Map所组成的List集合
 每一个Map都回去对应ListView列表中的一行
 每一个Map(键-值对)中的键必须包含所有在from中所指定的键
resource:列表项的布局文件ID
from:Map中的键名
to:绑定数据视图中的Id,与from成对应关系

对于resource,我们新建一个样式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="30dp"
android:orientation="horizontal" > <ImageView
android:id="@+id/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_lena" /> <TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="30dp"
android:text="TextView"
android:gravity="left|bottom"
/> </LinearLayout>

item.xml

ListView with SimpleAdapter:

        dataList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 20; i ++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("pic", R.drawable.ic_lena);
map.put("text", "Item number : " + i);
dataList.add(map);
}
simpleAdapter = new SimpleAdapter(this, dataList, R.layout.item, new String[] {"pic", "text"}, new int[] {R.id.pic, R.id.text});
listView.setAdapter(simpleAdapter);

实现点击事件的方法:

    @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String text = "position=" + position + " item=" + listView.getItemAtPosition(position);
Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();
}

实现ListView滑动状态改变时的方法:

    @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
String scrollStatString = "";
switch (scrollState) {
case SCROLL_STATE_FLING:
scrollStatString = "用户手指离开屏幕之前,由于用力滑了一下,视图仍在继续滑动";
break;
case SCROLL_STATE_IDLE:
scrollStatString = "视图已经停止滑动";
break;
case SCROLL_STATE_TOUCH_SCROLL:
scrollStatString = "手指没有离开屏幕,试图正在滑动";
break;
}
Toast.makeText(this, scrollStatString, Toast.LENGTH_SHORT).show();
}

我们可以通过监听现在的事件是否是滑动来在ListView中新建一个Item:

            Map<String, Object> map = new HashMap<String, Object>();
map.put("pic", R.drawable.ic_lena);
map.put("text", "新增项");
dataList.add(map);

但如果直接这么操作会出错,因为虽然通知了程序新增一个Item,但是没有通知UI界面刷新,所以还需要写一行代码使当前的界面刷新:

simpleAdapter.notifyDataSetChanged();

这样就完成了一个简短的类似于下拉刷新的案例。
知识要点及注意事项
(1)SimpleAdapter的构造方法中参数较多,写的时候不要着急,要对应好的布局文件中的id
(2)监听器和适配器是通用于很多android控件上,不局限与ListView
(3)样例通过onScrollListener坚挺了用户手指滑动的动作,实际上我们常见的列表下拉刷新就是依次扩展出来的
(4)熟练运用notifyDatasetchanged。它可以动态更新视图中所包含的数据。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ListView
android1:id="@+id/listView1"
android1:layout_width="match_parent"
android1:layout_height="wrap_content" >
</ListView> </LinearLayout>

activity_main.xml

package com.example.listview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast; public class MainActivity extends FragmentActivity implements OnItemClickListener, OnScrollListener { private ListView listView;
private ArrayAdapter<String> arrayAdapter;
private SimpleAdapter simpleAdapter;
private List<Map<String, Object>> dataList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); String[] arrData = new String[] { "apple", "banana", "orange", "pear" };
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrData);
listView.setAdapter(arrayAdapter); dataList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < 20; i ++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("pic", R.drawable.ic_lena);
map.put("text", "Item number : " + i);
dataList.add(map);
}
simpleAdapter = new SimpleAdapter(this, dataList, R.layout.item, new String[] {"pic", "text"}, new int[] {R.id.pic, R.id.text});
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(this);
listView.setOnScrollListener(this);
} @Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub } @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
String scrollStatString = "";
switch (scrollState) {
case SCROLL_STATE_FLING:
scrollStatString = "用户手指离开屏幕之前,由于用力滑了一下,视图仍在继续滑动";
Map<String, Object> map = new HashMap<String, Object>();
map.put("pic", R.drawable.ic_lena);
map.put("text", "新增项");
dataList.add(map);
simpleAdapter.notifyDataSetChanged();
break;
case SCROLL_STATE_IDLE:
scrollStatString = "视图已经停止滑动";
break;
case SCROLL_STATE_TOUCH_SCROLL:
scrollStatString = "手指没有离开屏幕,试图正在滑动";
break;
}
Toast.makeText(this, scrollStatString, Toast.LENGTH_SHORT).show();
} @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String text = "position=" + position + " item=" + listView.getItemAtPosition(position);
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}

MainActivity.java

效果:

Android 使用ListView显示信息列表的更多相关文章

  1. Android在ListView显示图片(重复混乱闪烁问题)

    Android在ListView显示图片(重复混乱闪烁问题) 1.原因分析 ListView item缓存机制: 为了使得性能更优,ListView会缓存行item(某行相应的View). ListV ...

  2. Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

    本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...

  3. android scrollview listview显示不全

    原来处理方法是重写ListView import android.content.Context; import android.util.AttributeSet; import android.v ...

  4. Android 关于listView 显示不全的问题

    刚刚在项目中发现一个bug,我是用ScrollView 嵌套 ListView的,但是我的数据只能显示一条,开始我还以为是数据有错误,经过排查以后发现是正确的 百度发现 android的架构好像没有考 ...

  5. Android MaoZhuaWeiBo 好友动态信息列表数据抓取 -3

    前面2篇把大致的开发说的几乎相同了,接下来说说粉丝动态消息列表或时间线数据的抓取与解析显示,我将他所有写在了一个 类里.并以封装类对象的形式存储数据.以下看看基本的服务代码: 粉丝动态消息列表数据抓取 ...

  6. 探究Android中Listview显示错乱问题

    问题 最近在项目中遇到过一个很棘手的问题,就是ListView在滑动后就莫名其妙的显示错乱,网上查阅资料后问题很容易的就解决了,但是对于问题产生的原因仍是一知半解,所以不甘心的我定下心来,狠读源码,终 ...

  7. Android BaseAdapter ListView (明星简介列表)

    1.搭建布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...

  8. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  9. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

随机推荐

  1. Gtest创建第一个测试

    gtest测试框架是在不同平台上(Linux,Mac OS X,Windows,Cygwin,Windows CE和Symbian)为编写C++测试而生成的.它是基于xUnit架构的测试框架,支持自动 ...

  2. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  3. 【WPF/WAF】主界面(ShellWindow)引入别的界面布局

    问题:主界面如果只用一个布局文件ShellWindow.xaml,会写得很大很臃肿.需要分为多个布局文件,然后由主界面引入.参考http://waf.codeplex.com/官方的BookLibra ...

  4. C语言 · 第二大整数

    算法提高 第二大整数   时间限制:1.0s   内存限制:512.0MB      问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二 ...

  5. Linux while 获取键盘输入退出

    c 语言实现如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  6. signal(SIGPIPE, SIG_IGN) (转)

    signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...

  7. busybox内置ftp服务器用法

    参考:http://blog.chinaunix.net/uid-20564848-id-74041.html 最新的busybox已集成ftp服务器层需ftpd,使用方法如下: 方法一:# tcps ...

  8. Win2008 Server系统安装打印服务器与配置

    原文:http://60808.org/thread-20259-1-1.html 视频地址:http://edu.51cto.com/lesson/id-20163.html 本文介绍的是在Win2 ...

  9. iOS错误整理--自定义按钮,给按钮内部赋值出现的错误

    一.练习中为了实现自定义按钮,按钮中的imageView和titleLabel默认是左右排列的.在练习中自定义为上下排列. *在以下方法中重新布局按钮中的子控件 - (void)layoutSubvi ...

  10. mac安装IDEA

    Mac上安装Java7 首先我们需要去oracle下载最新的jdk,笔者拿到的最新的版本是1.7.0_45-b18,这里没有什么好说的,直接下载安装即可,安装完毕后需要在.bash_profile或者 ...