Android零基础入门第38节:初识Adapter
在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter。
一、了解MVC模式
在开始学习Adapter之前我们要来了解下这个MVC模式。说起MVC模式,估计很多同学已经或多或少听说过,可能在前面的Java开发中也有所接触。
MVC全名是Model View Controller,是模型(model)、视图(view)、控制器(controller)的缩写。一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC各组件之间的关系如下图所示,可以清楚的知道各层之间的联系。
在Android开发中,比较流行的开发框架模式采用的是MVC框架模式,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。那么Android项目中哪些代码来充当M、V、C角色呢?
Android 鼓励弱耦合和组件的重用,Android 中MVC的具体体现如下:
模型(model):是应用程序的主题部分,所有的业务逻辑都应在该层(对数据库的操作、对网络等的操作都应该在model里面处理,当然对计算等操作也是必须放在该层的)。
视图层(view):是应用程序中负责生成用户界面的部分。也是整个MVC架构中用户唯一可以看到的一层,接收用户的输入,显示用户的处理结果。一般用XML文件进行界面的描述,使用的时候可以非常方便的引入。
控制层(controller):是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分。Android的控制层的重任通常落在了众多Activity的肩上,这句话也就暗含了不要在Activity中写过多代码,要通过Activity交给model业务逻辑处理层处理,这样做的另外一个原因是Android中的Activity的响应时间是5秒,如果耗时的操作放在这里,程序很容易无响应。
在MVC模式中其实控制器Activity主要是起到解耦作用,将View视图和Model模型分离,虽然Activity起到交互作用,但是一般在Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,也就是说一部分View视图和Contronller控制器Activity是绑定在一个类中的。
使用MVC模式的优点:
耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。
可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。
模块职责划分明确。主要划分层M、V、C三个模块,利于代码的维护。
什么时候适合使用MVC设计模式?当然一个小的项目且无需频繁修改需求就不用MVC框架来设计了,那样反而觉得代码过度设计,代码臃肿。一般在大型项目中,且业务逻辑处理复杂,页面显示比较多,需要模块化设计的项目使用MVC就有足够的优势了。
二、Adapter概述
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView、GridView)等地方都需要用到Adapter。
Android的适配器负责为列表组件提供数据源,也负责将单独的数据元素转换为显示在列表组件中的特定视图,如ListView的适配器关系如下图所示。
Adapter本身只是一个接口,它派生了 ListAdapter和SpinnerAdapter两个子接口,其中 ListAdapter 为 AbsListView 提供列表项,而 SpinnerAdapter 为 AbsSpinner 提供列表项。Adapter接口及其实现类的继承关系图如下图所示。
上图中标红粗线框标出的是比较常用的Adapter。从图中可以看出几乎所有的Adapter都继承了 BaseAdapter,而BaseAdapter同时实现了 ListAdapter、SpinnerAdapter 两个接口,因此 BaseAdapter 及其子类可以同时为 AbsListView、AbsSpinner提供列表项。
Adapter的几个常用实现类如下。
ArrayAdapter:简单、易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项。
SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
BaseAdapter:通常用于被扩展,扩展BaseAdapter可以对各列表项进行最大限度的定制。
那么本节先通过一个示例学习如何使用ArrayAdapter创建ListView,关于SimpleAdapter和BaseAdapter会在后续几期进行学习,而SimpleCursorAdapter会在数据库部分进行学习。
三、ArrayAdapter示例
继续使用WidgetSample工程的listviewsample模块,在app/main/res/layout/目录下创建arrayadapter_layout.xml文件,在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <!-- 设置使用绿色的分隔条 -->
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#0f0"
android:dividerHeight="2px"
android:headerDividersEnabled="false"/>
</LinearLayout>
接下来为ListView提供Adapter,Adapter决定了ListView所要显示的列表项。在java包下创建ArrayAdapterActivity.java文件,加载上面新建的布局文件,具体代码如下:
package com.jinyu.cqkxzsxy.android.listviewsample; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; public class ArrayAdapterActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.arrayadapter_layout); // 获取界面ListView组件
ListView listView = (ListView) findViewById(R.id.listview); // 定义一个数组
final String[] books = {"初识Android开发", "Android初级开发", "Android中级开发",
"Android高级开发", "Android开发进阶", "Android项目实战", "Android企业级开发"};
// 将数组包装成ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, books); // 为ListView设置Adapter
listView.setAdapter(adapter); // 为ListView绑定列表项点击事件监听器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Toast.makeText(ArrayAdapterActivity.this, "点击了" + books[position],
Toast.LENGTH_SHORT).show();
}
});
}
}
上面的程序中前面两行粗体代码创建了一个ArrayAdapter,创建ArrayAdapter时必须指定如下三个参数。
context:要使用的上下文环境,几乎创建所有组件都需要传入Context对象。
resource: 要使用的视图资源 ID,该视图将作为ArrayAdapter的列表项组件。这里使用了Android系统中自带的视图资源,系统预定义的视图资源主要有以下几种:
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: 都带有一个单选钮。
objects:要实际显示的数组或List,将负责为多个列表项提供数据。 该数组或List包含多少个元素,就将生成多少个列表项。
上面的程序中后面几行粗体代码为ListView列表项添加点击事件监听器,当用户点击某列表项的时候,就会收到onItemClick事件,然后做消息提示或者其他需要的处理。
修改启动的Activity,然后运行程序,可以看到下图左侧所示列表界面。
点击列表中的某一项的时候,会弹出消息提示,如上图右侧所示。
关于Adapter的简单了解先到这里,其他更复杂的Adapter使用后面陆续学习。
今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!
此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!
往期总结分享:
Android零基础入门第1节:Android的前世今生
Android零基础入门第2节:Android 系统架构和应用组件那些事
Android零基础入门第3节:带你一起来聊一聊Android开发环境
Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招
Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神
Android零基础入门第6节:配置优化SDK Manager, 正式约会女神
Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点
Android零基础入门第9节:Android应用实战,不懂代码也可以开发
Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio
Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌
Android零基础入门第13节:Android Studio配置优化,打造开发利器
Android零基础入门第14节:使用高速Genymotion,跨入火箭时代
Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
Android零基础入门第16节:Android用户界面开发概述
Android零基础入门第17节:TextView属性和方法大全
Android零基础入门第18节:EditText的属性和使用方法
Android零基础入门第19节:Button使用详解
Android零基础入门第20节:CheckBox和RadioButton使用大全
Android零基础入门第21节:ToggleButton和Switch使用大全
Android零基础入门第22节:ImageView的属性和方法大全
Android零基础入门第23节:ImageButton和ZoomButton使用大全
Android零基础入门第24节:自定义View简单使用,打造属于你的控件
Android零基础入门第25节:简单且最常用的LinearLayout线性布局
Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同
Android零基础入门第27节:正确使用padding和margin
Android零基础入门第28节:轻松掌握RelativeLayout相对布局
Android零基础入门第29节:善用TableLayout表格布局
Android零基础入门第30节:两分钟掌握FrameLayout帧布局
Android零基础入门第31节:少用的AbsoluteLayout绝对布局
Android零基础入门第32节:新推出的GridLayout网格布局
Android零基础入门第33节:Android事件处理概述
Android零基础入门第34节:Android中基于监听的事件处理
Android零基础入门第35节:Android中基于回调的事件处理
Android零基础入门第36节:Android系统事件的处理
Android零基础入门第37节:初识ListView
Android零基础入门第38节:初识Adapter的更多相关文章
- Android零基础入门第58节:数值选择器NumberPicker
原文:Android零基础入门第58节:数值选择器NumberPicker 上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器Nu ...
- Android零基础入门第59节:AnalogClock、DigitalClock和TextClock时钟组件
原文:Android零基础入门第59节:AnalogClock.DigitalClock和TextClock时钟组件 在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不 ...
- Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker
原文:Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker 在实际开发中,经常会遇见一些时间选择器.日期选择器.数字选择器等需求,那么从本期开始来学习And ...
- Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图
原文:Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图 前面两期学习了 ViewAnimator及其子类ViewSwitcher的使用,以及ViewSwitcher的 ...
- Android零基础入门第55节:ImageSwitcher和TextSwitcher使用
原文:Android零基础入门第55节:ImageSwitcher和TextSwitcher使用 上一期我们了解了ViewAnimator组件和ViewSwitcher组件的使用,你都掌握了吗?本期一 ...
- Android零基础入门第54节:视图切换组件ViewSwitcher
原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...
- Android零基础入门第53节:拖动条SeekBar和星级评分条RatingBar
原文:Android零基础入门第53节:拖动条SeekBar和星级评分条RatingBar 前面两期都在学习ProgressBar的使用,关于自定义ProgressBar的内容后期会继续学习的,本期先 ...
- Android零基础入门第52节:自定义酷炫进度条
原文:Android零基础入门第52节:自定义酷炫进度条 Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar. 在Android开发中 ...
- Android零基础入门第51节:进度条ProgressBar
原文:Android零基础入门第51节:进度条ProgressBar 不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有AP ...
随机推荐
- js实现表格配对小游戏
js实现表格配对小游戏 一.总结 一句话总结: 二.js实现表格配对 1.配对游戏案例说明 实例描述: 当用户点击两个相同的图案或字符后配对成功,全部配对成功后游戏获胜 案例008采用了大家常见的小游 ...
- 实际工程Quartz与Spring设计与实现一体化的热部署
1.需求说明 主要负责项目任务调度.使用Quartz.以Spring为辅助. 如今有这样一个需求:我们不知道管理员想设定过多厂时间运行主任务,须要在配置文件定义.在配置好后须要马上运行.实现热部署. ...
- JQuery通过radio,select改变隐藏显示div
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36092584/article/details/52740681 1)select下拉框控制d ...
- R 语言文件读写
1. working directory:工作目录 > getwd() > setwd("C:/data") # 设定当前工作目录 2. 读取格式化的 table &g ...
- Android菜鸟的成长笔记(19)——Service的生命周期
前面两篇文章介绍了关于Service的两种启动方式,简要总结如下: Context.startService() Context.bindService() 1. startService()的目的是 ...
- ADO.NET- 中批量添加数据的几种实现方法比较
在.Net中经常会遇到批量添加数据,如将Excel中的数据导入数据库,直接在DataGridView控件中添加数据再保存到数据库等等. 方法一:一条一条循环添加 通常我们的第一反应是采用for或for ...
- ajax的跨域请求问题:减少options请求
服务器端在Response Headers里添加字段Access-Control-Max-Age: 86400 , "Access-Control-Max-Age"表明在86400 ...
- twemproxy接收流程探索——剖析twemproxy代码正编
本文旨在帮助大家探索出twemproxy接收流程的代码逻辑框架,有些具体的实现需要我们在未来抽空去探索或者大家自行探索.在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份 ...
- DDD实战10 在项目中使用JWT的token
在使用过程中报过一个错误:The algorithm: 'HS256' requires the SecurityKey.KeySize to be greater than '128' bits 是 ...
- C# WPF 仿网易云音乐(PC)Banner动画控件
在自定义用户控件内添加3个border(左.中.右,以下分别简称为:b1.b2.b3),对border进行缩放和移动动画.往右切换时b1放大平移到b2的位置,b2缩小平移到b3的位置,b3平移到b1的 ...