ListView列表数据源——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使用后面陆续学习。

原文发布于微信公众号 - 分享达人秀(ShareExpert)

原文发表时间:2017-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android先生

Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法

即 需要2个步骤 才可 完成 一键退出 App 需求。下面,我将根据这两个步骤进行功能实现讲解。

8720
来自专栏Android研究院

Android组件化专题 - 路由框架进阶模块间的业务通信

上一篇文章,讲解了路由框架实现的原理,并实现了基本的路由框架 页面路由的跳转 Android组件化专题 - 路由框架原理。

15520
来自专栏Android干货园

Base封装(一)--我的最简MVP架构

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/73...

15910
来自专栏Android先生

Fragment全解析系列(二):正确的使用姿势

Fragment是可以让你的app纵享丝滑的设计,如果你的app想在现在基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragme...

17430
来自专栏技术小黑屋

Android中实现用户无感知处理后台崩溃

正所谓,要想没有bug,就一行代码也不写。App到了用户的手里,肯定是崩溃越少越好。Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出...

8710
来自专栏Golang语言社区

mysql_stmt_prepare failed! error(1461)Can't create more than

1461错误, mysql_stmt_prepare failed! 今天现场咨询我们问如何处理1461错误。 mysql_stmt_prepare faile...

59980
来自专栏yang0range

Activity详解(二)——异常情况下的生命周期分析

最近 无意当中看到一道面试题是关于Activity异常情况下的生命周期分析,感觉自己还有所欠缺,随即在书中寻找完整答案,特记录如下。

21640
来自专栏IT大咖说

Oracle中最容易被忽略的那些实用特性

内容来源:2017 年 04 月 08 日,ITPUB管理版版主吕海波在“DBGeeK+PG数据库技术沙龙(4月杭州站)”进行《Oracle中最容易被忽略的那些...

15160
来自专栏ASP.NET MVC5 后台权限管理系统

.Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化

我们知道资源被注册到R.java我们通过R.java就可以读取到界面中的组件。跟我们.net一样,通过ID来读取组件 知识点: 通过R.java读取组件 Mai...

19650
来自专栏程序员的诗和远方

搭建安卓开发环境(Android Studio)

最近想用业余时间学习一下android,教程,书本上以eclipse+adt居多,实际搜索一下,现在android studio好评还是比较多的,而且是goo...

73770

扫码关注云+社区

领取腾讯云代金券