跟我学Android之十一 列表和适配器

本章内容

第1节  列表类视图概述

第2节  列表视图ListView

第3节  下拉视图Spinner

本章目标

理解MVC模式的设计思想。

了解AdapterView
的继承关系图。

掌握掌握使用各类适配器显示列表数据。

掌握列表视图ListView的用法。

掌握下拉视图Spinner的用法。

列表控件是界面设计中一种常用的控件

u主要用于展现一系列数据项供用户选择或浏览,比如:

?收件箱中的邮件标题列表

?通讯录中的联系人列表

?注册用户时的城市选择列表

uAndroid系统中提供了多种形式的列表展现

?单选列表

?多选列表

?可展开列表

Android列表采用了MVC的设计模式

u用户前端界面与后端的数据分离

uMVC设计模式的思想如下

?视图模块负责显示用户界面和响应用户动作

?模型模块负责管理维护数据

?控制器负责执行业务逻辑

AdapterView具有如下特征。

uAdapterView继承了 ViewGroup,它的本质是容器。

uAdapterView可以包括多个“列表顼”,并将多个“列表项”以合适的形式示出来。

uAdapterView显示的多个“列表项”由Adapter提供。调用AdapterView的setAdapter(Adapter)方法设置 Adapter即可。

常用列表视图

ListView(列表视图)

Spinner(下拉视图)

GridView(网格视图)

ExpandableListView(可展开的列表组件)

适配器在列表控件中的用途

u适配器就是列表控件的模型

?为列表控件提供数据

?为列表项提供了显示视图

适配器的基类是android.widget.Adapter

u定义了数据提供者的标准

u提供了很多子类实现了多种数据的提供手段,常用的实现类如下

?ArrayAdapter:简单、易用的Adapter.通常用于将数组或List集合的多个值包装成多个列表项。

?SimpleAdapter:并不简单、功能强大的Adapter。可用于将List集合的多个对象包装成多个列表项。

?BaseAdapter通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

ListView控件用于以列表形式显示数据

uListView采用MVC模式将前端显示和后端数据进行了分离

?ListView装载数据时并不使用ListView本身的方法

?通过指定一个Adapter对象给ListView提供数据

uListView显示效果如下

与列表相关的主要事件有两个

uItemSelected(列表项被选中时发生)

?通过列表控件的setOnItemSelectedListener()实现监听

uItemClick(单击列表项时发生)

?通过列表控件的setOnItemClickListener()实现监听

uItemLongClick(长按列表项时发生)

?通过列表控件的setOnItemLongClickListener()实现监听

使用数组作为数据源

<ListView
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:entries="@array/fruits"
	android:divider="#f00"
	android:dividerHeight="2px"
	android:headerDividersEnabled="false"
	/>
</LinearLayout>

ArrayAdapter通过数组为列表控件提供数据,构造ArrayAdapter的对象

<span style="font-size:14px;">String [] data = getResources().getStringArray(R.array.data);
ArrayAdapter<String> adapter =
        new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1, data);
</span>

?第二个参数表示为列表控件提供列表项的显示视图

?第三个参数即为适配器所需要的数组数据

u使用ArrayAdapter对象作为列表控件的数据源

<span style="font-size:14px;">ListView lv = (ListView)findViewById(R.id.listview);
lv.setAdapter(adapter);
</span>

设置可多选的ListView

<span style="font-size:14px;">final String[] arr1 = { "孙悟空", "猪八戒", "沙和尚" ,"白骨精"};
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
		 (this, android.R.layout.simple_list_item_multiple_choice, arr1);
list1.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
		// 为ListView设置Adapter
		list1.setAdapter(adapter1);
</span>

SimpleAdapter概述

SimpleAdapter可以用于显示复杂数据

uSimpleAdapter可以在列表的一项中提供和显示多个数据

uSimpleAdapter需要自定义数据结构和显示视图布局

uSimpleAdapter的构造需要5个参数

?context:为使用SimpleAdapter的上下文

?data:为用于显示的具体数据

l这是一个map对象的list,list中的每一项是一个map

lmap中的每一项对应着列表项显示视图中的一个内容

?resource:用于显示具体数据的布局资源

?from:data数据中map所包含的每一个项中key的名字的数组

?to:map中的每一个key的内容所对应的显示视图的资源id的数组

使用SimpleAdapter显示复杂数据需要设计好数据内容

u不过视图如何复杂,列表的每一项内容由多个数据字段构成

u在提供数据的时候,需要为每一个数据字段设计一个名字

?字段名字和具体数据构成键值对,存放在map对象中

List<Map<String, Object>> listItems =
				new ArrayList<Map<String, Object>>();
for (int i = 0; i < names.length; i++)
{
Map<String, Object> listItem = new HashMap<String, Object>();
	listItem.put("header", imageIds[i]);
	listItem.put("personName", names[i]);
	listItem.put("desc", descs[i]);
	listItems.add(listItem);
}

显示复杂列表

u首先需要为复杂数据结构定义用于显示的列表项布局

?布局文件:R.layout.simple_item

?该文件包含一个头像ImageView,名字TextView,简介TextView

显示复杂列表,然后在ListView中使用SimpleAdapter

SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
			R.layout.simple_item,
			new String[] { "personName", "header" , "desc"},
			new int[] { R.id.name, R.id.header , R.id.desc });
ListView list = (ListView) findViewById(R.id.mylist);
// 为ListView设置Adapter
list.setAdapter(simpleAdapter);

系统内置列表项

Android为列表控件提了一些基本的列表项布局

u布局基本都在android.R.layout中

?android.R.layout.simple_list_item_1

?android.R.layout.simple_list_item_2

?android.R.layout.simple_list_item_checked

?android.R.layout.simple_list_item_multiple_choice

?android.R.layout.simple_list_item_single_choice

列表项的常见规划设计

u在实际应用中,列表项显示设计往往是多种多样的

u一些常见的设计效果如下:

创建自定义适配器

u编写自定义适配器,选择继承android.widget.BaseAdapter

u通常为适配器关联一个list,用于数据的提供

u覆盖public int getCount()方法,用于告知列表有多少项数据

public int getCount() {
        return dataList.size();
}

u覆盖getView()方法,用于向列表提供列表项的显示视图

View getView (int position, View convertView, ViewGroup parent)

?列表项视图通常有两种方法

l通过布局资源定义,然后采用动态加载的方法使用

l通过程序实现布局

创建自定义适配器,

getView()方法覆盖示例

public View getView(int position, View convertView, ViewGroup parent) {
        String ns = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater li = (LayoutInflater)context.getSystemService(ns);
        View layout = li.inflate(R.layout.simple_item, null);

        TextView titleView = (TextView)layout.findViewById(R.id.title);
        TextView bodyView = (TextView)layout.findViewById(R.id.body);
        Mail m = dataList.get(position);
        titleView.setText(m.getTitle());
        bodyView.setText(m.getMessage());
       return layout;
}

使用自定义适配器实现动态显示数据

u所谓动态显示就是在运行过程中通过程序增删改列表项

u在自定义适配器中添加增删改数据的方法

?在改变数据完成后一定要通知视图

public void addMail(Mail m) {
        dataList.add(m);
        notifyDataSetChanged();
}

Spinner控件用于显示一个下拉列表

uSpinner采用MVC模式将前端显示和后端数据进行了分离

?Spinner装载数据时并不使用Spinner本身的方法

?通过指定一个Adapter对象给Spinner提供数据

uSpinner显示效果如下

创建Spinner

uSpinner相当于Android系统中的combobox(下拉选择框)

uSpinner同样使用Adapter提供数据显示

u在布局中使用<Spinner>标签布局

<Spinner  android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

u在Activity中获取Spinner对象

Spinner  spinner = (Spinner)findViewById(R.id.spinner);

利用Spinner显示数据

u在资源中准备要显示的数据数组

 <string-array name="moviearray">
        <item>狮子王</item>
        <item>丛林大冒险</item>
        <item>米老鼠和唐老鸭</item>
        <item>黑猫警长</item>
    </string-array>

u通过ArrayAdapter给Spinner提供数据显示

String [] data = getResources().getStringArray(R.array.moviearray);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,
        android.R.layout.simple_spinner_item, data);
s.setAdapter(adapter);

实现带图片的Spinner

u需要自定义Spinner的列表项视图

u使用自定义列表项视图的办法有多种

?通过自定义适配器来使用

?通过继承ArrayAdapter,覆盖getDropDownView()方法

实现带图片的Spinner,通过覆盖getDropDownView()方法实现自定义视图

ArrayAdapter<CharSequence> adapter =
        new ArrayAdapter<CharSequence>(this, android.R.layout.spinner_item, p) {
        @Override
        public View getDropDownView(int position, View convertView, ViewGroup parent) {
                View view = getLayoutInflater().inflate(R.layout.spinner_item, parent, false);
                TextView label = (TextView) view.findViewById(R.id.label);
                label.setText(getItem(position));
                if (spinner.getSelectedItemPosition() == position) {
                        label.setTextColor(getResources().getColor(R.color.selected_fg));
                        view.setBackgroundColor(getResources().getColor(R.color.selected_bg));
                        view.findViewById(R.id.icon).setVisibility(View.VISIBLE);
                }
                return view;
        }
};

后一定要通知视图

时间: 2024-10-11 11:52:34

跟我学Android之十一 列表和适配器的相关文章

处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

一.前言 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项目没人做,被拉去写服务端,所以迟迟没时间继续学习大安卓,想了想自己的安卓水平和公司的专业安卓璟博比起来依旧差距挺大,于是乎我要加把劲赶上才行,所以继续翻开李刚疯狂讲义系列,看到Gallery这个控件了,大致功能是横向滚动查看列表项,再仔细看了一下居然过时了,官方推荐用ViewPager来替代,还没学就过时了,有点不爽,干脆新的旧的一起学习一下,也好进行一下比较吧.废话不多说,首先是已经过时的Gallery. 二.画廊视图Gall

【边做项目边学Android】知识点:Adapter适配器

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 View(ListView,GridView)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关的所有接口.类的完整层级图.在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展.比较常用的有 BaseAdapter,Simple

从零开始学android&lt;ListView数据列表显示组件.二十一.&gt;

与滚动视图(ScrollView)类似的还有一种列表组件(ListView),可以将多个组件加入到ListView之中以达到组件的滚动显示效果,ListView组件本身也有对应的ListView类支持,可以通过操作ListView类以完成对此组组件的操作,ListView类的继承结构如下所示: java.lang.Object ? android.view.View ? android.view.ViewGroup ? android.widget.AdapterView<T extends a

一起学android之如何获取手机程序列表以及程序相关信息并启动指定程序 (26)

效果图: 程序列表: 启动程序,获取程序信息: 代码如下: 创建一个AppInfo类来表示应用程序 <pre name="code" class="java">public class AppInfo { public CharSequence title;// 程序名 public CharSequence packageName; // 程序包名 Intent intent;// 启动Intent public Drawable icon;// 程序

处女男学Android(十四)---Android 重量级数据存储之SQLite

前言 不知不觉的Android基础系列已经写了十三篇了,这是第十四篇~上一篇blog记录了Android中的一种数据存储方案,即共享参数(Sharedpreferences)的使用(处女男学Android(十三)---Android 轻量级数据存储之SharedPreferences).最近初学如何在Android中应用SQLite,写了一个基于ListView的增删查的小例子,本篇blog就记录一下我学习到的如何在Android中操作SQLite持久化客户端数据. 初始化SQLite 关于SQ

一起学android之利用回调函数onCreateDialog实现加载对话框(23)

效果图: 有时候我们需要去做一个Activity启动时的数据加载对话框,关于对话框的各种实现可以通过一起学android之对话框 Dialog的创建(7)来完成,在这里另外介绍一个,利用onCreateDialog回调方法来实现,当然这个方法标记已经过 时了,但我们还是可以使用这个方法来实现我们想要的功能.具体请参看代码: public class MainActivity extends Activity { @SuppressWarnings("deprecation") @Ove

android 获取相册列表的实现(三)

该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能. 该项目最大特色: 1.获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取. 2.使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的.同时,通过引用第三方

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean