课程目标
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. java web 应用中包,接口的设计

    采用标准的架构:描述从低层到高层首先是系统分析,找出你需要什么功能,然后按照下面的步骤执行: 数据库层:数据库层就是SQL语句.数据库.表.视图.触发器等等的创建和管理.这一层和JAVA无关,但是却是 ...

  2. 支持移动触摸设备的简洁js幻灯片插件

    lory是一款支持移动触摸设备的简洁的js幻灯片插件.该幻灯片插件可以通过纯js调用,也可以将该幻灯片插件作为jQuery插件来使用.该幻灯片的过渡动画具有硬件加速功能,并且可以定制是否使用easin ...

  3. nio入门教程

    1.通过拿NIO和传统IO做对比来了解NIO 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字 ...

  4. [Kernel]内核版本添加字符和内核版本'+'解决

    转自:http://blog.csdn.net/adaptiver/article/details/7225980 之前每次由于git仓库编译出来每次都带有'+', 导致都需要使用git archiv ...

  5. 机器学习:Mean Shift聚类算法

    本文由ChardLau原创,转载请添加原文链接https://www.chardlau.com/mean-shift/ 今天的文章介绍如何利用Mean Shift算法的基本形式对数据进行聚类操作.而有 ...

  6. 【DataStructure】Linked Data Structures

    Arrayss work well for unordered sequences, and even for ordered squences if they don't change much. ...

  7. 嘿, 你知道吗, 再也不需要for循环了!

    做一个优雅的程序员 JavaScript是一门优雅的语言, 这个'优雅'体验在JS逻辑层次处于高段位的水平, 什么意思呢, 就是一个js应用的主线剧情一定全部是函数式表达的高层可读逻辑, 还是不懂? ...

  8. 商务导航路由配置 2——端口映射 内网通过公网IP访问设置

  9. 几个Tab,滑动门,选项卡,图片切换

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. 【转】ImageView的Scaletype参数设置

    ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等. 设置的方式包括: 1. 在layout xml中定义Android:s ...