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

跟我学Android之十一 列表和适配器,第1张

概述视频课:https://edu.csdn.net/course/play/7621本章内容第1节 列表类视图概述第2节 列表视图ListView第3节 下拉视图Spinner本章目标理解 MVC 模式的设计思想 。了解 AdapterView 的继承关系图 。掌握掌握使用各类适配器显示列表数据。掌握列表视图 ListView 的用法。

视频课:https://edu.csdn.net/course/play/7621

本章内容

第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 >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 >ListVIEw lv = (ListVIEw)findVIEwByID(R.ID.ListvIEw);lv.setAdapter(adapter);</span>



设置可多选的ListVIEw

<span >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设置AdapterList.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) {@OverrIDepublic 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;}};


后一定要通知视图  

总结

以上是内存溢出为你收集整理的跟我学Android之十一 列表和适配器全部内容,希望文章能够帮你解决跟我学Android之十一 列表和适配器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1052509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存