`
苗振忠
  • 浏览: 59568 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

设计模式在android中的应用——适配器模式

 
阅读更多

原文地址:http://www.eoeandroid.com/thread-228482-1-1.html
适配器模式:
把一个类的接口转换为客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。
又称为:转化器模式、变压器模式或包装模式。

通俗的来说:
就像我们平常给笔记本用的充电器一样,不管外接电源是110V、220V还是360V,经过充电器的转化后,输出给笔记本的都是标准而稳定的12V电压。
如图:
Android API中的应用:
ListView与Adapter的应用就是典型的适配器模式。
如:

    //----------------------------------------------------------------------------------------------声明组件      
       //绑定Layout里面的ListView    
        ListView list = (ListView) findViewById(R.id.ListView01);    
    //----------------------------------------------------------------------------------------------设置数据源        
        //生成动态数组,加入数据    
        ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();    
        for(int i=0;i<10;i++)    
        {    
            HashMap<String, Object> map = new HashMap<String, Object>();    
            map.put("ItemImage", R.drawable.checked);    
            map.put("ItemTitle", "Level "+i);    
            listItem.add(map);    
        }  
    //----------------------------------------------------------------------------------------------导入数据源   
        //生成适配器的Item和动态数组对应的元素    
        SimpleAdapter adapter = new SimpleAdapter(this,listItem,     
            R.layout.list_items,[size=1em]        [size=1em]    
            new String[] {"ItemImage","ItemTitle"},     
            new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}    
        );    
    //----------------------------------------------------------------------------------------------适配      
        //添加并且显示    
       list.setAdapter(adapter);    

这是我们在android 开发中常用的构造一个ListView组件的方法,对于大家来说异常的熟悉,不用废话了。

很多人知道这么用,但为什么这么用?这么用的原理是什么?
明白了 “是什么” 和 “为什么” 才是我们走向成熟的标准。

下面就以ListView为样例来剖析一下他的工作原理:

结构如下:
第一步:构建BaseAdapter抽象父类

    //----------------------------------------------------------------------------------------------声明组件      
       //绑定Layout里面的ListView    
        ListView list = (ListView) findViewById(R.id.ListView01);    
    //----------------------------------------------------------------------------------------------设置数据源        
        //生成动态数组,加入数据    
        ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();    
        for(int i=0;i<10;i++)    
        {    
            HashMap<String, Object> map = new HashMap<String, Object>();    
            map.put("ItemImage", R.drawable.checked);    
            map.put("ItemTitle", "Level "+i);    
            listItem.add(map);    
        }  
    //----------------------------------------------------------------------------------------------导入数据源   
        //生成适配器的Item和动态数组对应的元素    
        SimpleAdapter adapter = new SimpleAdapter(this,listItem,     
            R.layout.list_items,[size=1em]        [size=1em]    
            new String[] {"ItemImage","ItemTitle"},     
            new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}    
        );    
    //----------------------------------------------------------------------------------------------适配      
        //添加并且显示    
       list.setAdapter(adapter);   
    

第二步:定义ListView方法的接口IListView

    public interface IListView {    
            public void setAdapter(BaseAdapter adapter);  
    }

第三步:ListView组件类

    public interface IListView {    
            public void setAdapter(BaseAdapter adapter);  
    }


至此ListView组件已经成型,接下来完成适配器Adapter类
第四步:适配器接口IAdapter

    public interface IListView {    
            public void setAdapter(BaseAdapter adapter);  
    }

第五步:生成适配器SimpleAdapter

    public class SimpleAdapter extends BaseAdapter implements IAdapter{  
            ArrayList<HashMap< String,String>> arrayList;  
            String name;  
            public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {  
                    this.arrayList=arrayList;  
                    this.name=name;  
                    this.item=new String[arrayList.size()];  
                    setData();  
            }          
            @Override  
            public void setData() {  
              for(int i=0;i<arrayList.size();i++){  
                      this.item=arrayList.get(i).get(name);  
              }                  
            }  
    }  
    

Ok,创建类结束!
应用:

    public class SimpleAdapter extends BaseAdapter implements IAdapter{  
            ArrayList<HashMap< String,String>> arrayList;  
            String name;  
            public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {  
                    this.arrayList=arrayList;  
                    this.name=name;  
                    this.item=new String[arrayList.size()];  
                    setData();  
            }          
            @Override  
            public void setData() {  
              for(int i=0;i<arrayList.size();i++){  
                      this.item=arrayList.get(i).get(name);  
              }                  
            }  
    }  


输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------

总结:
1.其实样例中的ListView与SimpleAdapter都是继承了抽象父类BaseAdapter,同时ListView又包裹了SimpleAdapter,从而实现了所谓的“适配”。

2.当然Android API中还有ArrayAdapter等其他适配器,不过原理同SimpleAdapter一样,比葫芦画瓢罢了…… ,
这同时也解释了为什么我们在写 “自定义ListView”时为什么要继承父类BaseAdapter!


3.同样的原理,不同的表现方式。

适配器模式设计原则:
1.使用对象组合,面向接口和抽象编程(万年不变)
2.“开闭”原则

使用场合:
1.软件系统结构需要升级或扩展,又不想影响原有的系统的稳定运行的时候;
2.转换类之间的差别不是太大的时候;
3.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时候。
分享到:
评论

相关推荐

    Android开发三剑客——UML、模式与测试

    在Android应用开发中,"Android开发三剑客——UML、模式与测试"是指三个关键的组成部分:统一建模语言(UML)、设计模式以及测试方法。这些元素构成了高效、可维护和高质量软件开发的基础。 **UML(统一建模语言)*...

    Android学习4——ListActivity,TabActivity

    在早期的Android版本中,TabActivity用于实现多标签页的应用界面。它是一个特殊的Activity,允许开发者在一个Activity中展示多个Tab,每个Tab可以包含不同的Fragment或Activity。然而,随着Android设计指南的更新,...

    Android 中文 API——android.widget合集(中)(50篇)(pdf格式)

    `android.widget`命名空间包含了大量用于构建用户界面的基本UI组件,这些组件是Android应用程序开发中不可或缺的一部分。通过这些组件,开发者可以轻松地创建丰富的用户界面,并实现各种复杂的交互功能。 #### 关键...

    Android项目之——漂亮的平台书架_Android.rar

    在这个名为“Android项目之——漂亮的平台书架”的项目中,我们将会探讨如何在Android平台上构建一个美观且功能齐全的电子书架应用。这个项目的核心目标是为用户提供一个友好的界面,让他们可以方便地浏览、搜索和...

    Java和Android源码设计模式

    此外,在Android系统源码中也可以看到多种设计模式的应用,如单例模式在ContextImpl类中的使用,以及观察者模式在BroadcastReceiver中的体现等。 通过学习和实践这些设计模式,不仅可以提高代码质量,还能显著提升...

    设计模式——APP项目设计

    【设计模式——APP项目设计】是针对实习招聘领域的一款移动应用,旨在解决大学生实习过程中遇到的问题,如专业不符、管理松散和找不到实习单位等。该应用与实习网网站互通,利用海量简历库资源,迅速将实习岗位推送...

    Android项目之——漂亮的平台书架.zip

    在Android平台上,构建一个美观的书架应用是一个常见的需求,特别是在教育、阅读或者图书分享类的应用中。这个项目“Android项目之——漂亮的平台书架”旨在教你如何利用Android开发技术来实现这样一个功能丰富的...

    Android源码——笑话故事android应用源码.zip

    【Android源码——笑话故事android应用源码】 这个压缩包包含了一个基于Android平台的笑话故事应用的完整源代码。分析这个源码可以帮助我们深入理解Android应用程序的开发过程,特别是涉及到UI设计、网络请求、数据...

    开源项目——MultiChoiceAdapter(可多选的适配器)

    1. **ViewHolder**:适配器通常使用ViewHolder设计模式来缓存视图,减少findViewById的调用,提高性能。 2. **数据绑定**:通过重写getView()方法,根据数据源中的状态来设置条目的选中效果,如背景色、图标等。 3...

    安卓Andriod源码——listview适配器优化重用.zip

    在Android开发中,ListView是展示大量数据常用的组件,然而,如果不进行适当的优化,它可能会成为性能瓶颈,导致应用运行缓慢,用户体验下降。本资源“安卓Andriod源码——listview适配器优化重用.zip”关注的核心...

    设计模式源码.zip

    "微软示例数据库脚本.rar"可能包含了一些与设计模式相关的数据库操作示例,这在数据库驱动的应用程序中尤为重要,因为数据访问和处理通常涉及到事务处理、数据缓存等设计模式,如工厂模式用于创建数据库连接,策略...

    Android项目之——漂亮的平台书架(实用1).zip

    这个“Android项目之——漂亮的平台书架(实用1)”的压缩包提供了这样的源码,可以帮助开发者理解如何构建一个具有吸引力的图书管理应用。 首先,我们要了解这个项目的核心技术栈。作为Java源码,它主要基于Java语言...

    Android应用源码基于 ——MyDate 好看的日历,效果明显.zip

    在Android应用开发中,日历组件是不可或缺的一部分,它能够帮助用户查看、管理以及规划时间。本项目"Android应用源码基于 ——MyDate 好看的日历,效果明显"提供了一个定制化的日历视图,旨在提高用户体验并提供独特...

    Android UI_常用组件之 Spinner与适配器模式

    本篇文章将详细介绍Android UI中的一个常用组件——`Spinner`及其与适配器模式的应用。 #### Spinner 组件简介 `Spinner`是Android系统提供的一个下拉列表组件,它主要用于展示一系列选项供用户选择,非常适合于...

    Android源码——蓝牙聊天的应用源码.7z

    这个“Android源码——蓝牙聊天的应用源码.7z”压缩包提供了一款蓝牙聊天应用的完整源代码,可以帮助开发者深入理解如何实现此类应用程序。以下是基于该源码的关键知识点的详细解释: 1. **蓝牙API的使用**: - ...

    安卓Android源码——WordPress for Android.zip

    9. **权限管理**:Android 6.0及更高版本引入了运行时权限,开发者需要在应用中动态请求权限。 10. **测试**:单元测试、集成测试和UI自动化测试是确保代码质量的关键。JUnit、Espresso和Mockito是常用的测试框架。...

    安卓Android源码——简单的图片轮播.zip

    总之,这个项目涉及到了Android应用开发中的基本组件使用、适配器模式、图片加载策略以及动画效果的实现,对于初学者来说,是学习Android UI设计和交互实现的好例子。通过对源码的分析和实践,开发者可以更深入理解...

    安卓Android源码——Andriod日程管理软件源码.zip

    这篇文档将深入解析《安卓Android源码——Andriod日程管理软件源码》的相关知识点,帮助你理解和学习如何在Android平台上开发一个日程管理应用。 首先,Android是Google开发的开源操作系统,主要应用于移动设备,如...

    Android源码——超炫的图片浏览器.7z

    通过研究这个源码,开发者可以学习到如何在Android平台上创建一个高性能、用户友好的图片浏览应用,同时也可了解最佳实践和设计模式在实际项目中的应用。对于初学者来说,这是一个很好的学习资源,能够提升他们在...

    安卓Android源码——多选库.zip

    Action Bar是Android的一种设计模式,通常位于屏幕顶部,显示应用的标识、标题和可操作的选项,它是Android 3.0(API级别11)引入的。ActionBarSherlock库使得开发者能够在Android 2.1及以上版本的设备上实现Action ...

Global site tag (gtag.js) - Google Analytics