在上一节一起了解了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的具体体现如下:
在MVC模式中其实控制器Activity主要是起到解耦作用,将View视图和Model模型分离,虽然Activity起到交互作用,但是一般在Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,也就是说一部分View视图和Contronller控制器Activity是绑定在一个类中的。
使用MVC模式的优点:
什么时候适合使用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创建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时必须指定如下三个参数。
上面的程序中后面几行粗体代码为ListView列表项添加点击事件监听器,当用户点击某列表项的时候,就会收到onItemClick事件,然后做消息提示或者其他需要的处理。
修改启动的Activity,然后运行程序,可以看到下图左侧所示列表界面。
点击列表中的某一项的时候,会弹出消息提示,如上图右侧所示。
关于Adapter的简单了解先到这里,其他更复杂的Adapter使用后面陆续学习。