课程目标
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. 利用IT++搭建通信仿真平台

    IT++ is a C++ library of mathematical, signal processing and communication classes and functions.也就是 ...

  2. JDBC的介绍

    JDBC详解   1.JDBC是什么? JDBC(JAVA DataBase Connection)即JAVA数据库连接技术,JDBC API是一个Java API,可以访问任何类型表列数据,特别是存 ...

  3. 浅析js前端发展及mvvm的选型

    最近终于下定决心学点前端的东西,然而各种框架,让人眼花缭乱. 先总结一下js前端的发展史 1.刀耕火种,原始时代 这个时候用DOM原生API来操html元素,估计getElementBy之类的函数满天 ...

  4. beeline执行hql过程中出现错误,权限不足

    使用beeline执行hql查询时,出现以下错误: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec ...

  5. Hibernate- 开发环境准备

    数据库:两张表,两者通过publisher_id构成关联关系. Book(图书表) CREATE TABLE `t_book` ( `id` int(11) NOT NULL AUTO_INCREME ...

  6. Ubuntu之音效调节

    sudo add-apt-repository ppa:nilarimogard/webupd8 sudo apt-get update sudo apt-get install pulseaudio ...

  7. MFC 窗体样式修改

    窗体创建之后,如何设置窗体的样式呢? 一般情况下使用GetWindowLongW与SetWindowLongW即可实现窗体样式的修改或者使用ModifyStyle. 关于MFC存在GetWindowL ...

  8. python print 不换行

    #!/usr/bin/python # -*- coding: UTF- -*- ,): ,i+): print "%d * %d = %2d\t" % (j, i, i*j), ...

  9. 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询

    MySQL数据库-索引.limit分页.执行计划.慢日志查询 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获 ...

  10. java面试题------40个Java集合面试问题和答案

    Java集合框架为Java编程语言的基础,也是Java面试中非常重要的一个知识点. 这里,我列出了一些关于Java集合的重要问题和答案. 1.Java集合框架是什么?说出一些集合框架的长处? 每种编程 ...