MVP模式在Android中的应用之图片展示选择功能的框架设计

前言:虽然安卓出现的时间比其它平台软件比较晚,但是在我们的安卓开发中,一样可以使用我们所熟知的设计模式来给它一个合理、完善的结构,这样,才可以使我们在平常开发的时候减少冗余代码的发生,真正的提高效率。

平常,我们可能会遇到这样的需求:在一个页面中用来展示图片或者文字(我们称之为"大湿胸"),而另一个页面除了和大湿胸长得一模一样之外,它还有一个功能是选择(我们称之为"二湿弟"),遇到这种情况你会怎么做呢?当类似于这样的情况在你的APP中有很多种怎么办呢?你会怎么选择?是一遍遍的拷贝粘贴,还是先静下来想想如何设计它呢?


好,如果你选择的是第一种,可能下面的话就有些不太适合你了,可以直接关闭了。

如果你选择的是第二种,请跟我来,我们一起来看看这个功能该如何设计。

先来一张设计概要UML图(高清大图请移步:http://download.csdn.net/detail/u011064099/9277071):

这张图的所展现出的设计使用了MVP模式,即IView为我们的View,AbstIData为我们的Model,Presenter则是Presenter。对于怎么使用它们,这篇文章对它进行了概要说明。

好,我来解释一下这张图,我们看到的一整大块的蓝色是包,表示这属于同一系列的东西,从左上角开始看起,这个包被定义为界面,也就是说它只是负责界面的绘制以及响应用户的操作,AbstIData则表示我们的数据包,里面有4项实现类,表示从4中不同的渠道获取数据。我们的核心则是Presenter,它里面定义了我们数据以及界面的组合方式。它们共同继承IConnect接口,用于相互之间的通讯。

为了符合设计原则,我们的抽象标准则放入了与我们实际功能有关的部分,它们是一一对应的:ActivityA集成了RecyclerView,则我们使用的Presenter也是与RecyclerView有关系的,所以它实现了IRecyclerView接口,这个接口中定义了RecyclerView所必须的拥有的要素,以便在实例化的时候可以从外部注入,它为RecyclerPresenter。


为了既有图片展示,又有选择功能,我们的核心所在则是左下角这一块:图片类型适配器这个类它是与图片有关操作的一个抽象类,我们可以继承它,以便可以定义很多种图片的展示效果,在图片类型适配器的内部放置了一个图片选择功能辅助类,它专门用来处理图片选择之类的问题,比如图片的选择与不选择的界面处理,以及获取被选中的结果等等,总之图片的选择功能全部由它来进行操作。它可以使用反射的方式来与适配器内部进行逻辑挂钩,比如对展示布局进行选择控件的添加等等。这里使用了桥梁模式,所以我们的选择样式就不用单独去做了,只用把它们之间的功能组合一下就可以。

中间下部的是我们平常所知道的ViewHolder,每个布局则需要去对应不同的ViewHolder,如果是遇到选择的功能,则可能ViewHolder类的个数要翻一倍了,所以这里最好是使用万能的ViewHolder。右下部分则是我们RecyclerView需要使用的LayoutManager,这里我们在组装Presenter的时候就可以直接对它进行定义。


所以对于我们的图片展示选择的这个例子来说,我们的核心部分是RecyclerPresenter,我们在定义它的子类的时候,会定义一切可自定义的东西,比如:数据来源,数据解析方式,使用什么样的适配器,使用什么样的ViewHolder,使用什么样的LayoutManager,我们需要它们里面进行精妙复杂的组合,最终提供给ActivityA去使用。

使用示例:

class 用于展示网络数据Presenter
{new NetData();//数据的输入来源new RViewAdapter(boolean 是否启动选择功能);new ViewHolder();//最好使用万能适配器new GridLayoutManager();//RecyclerView的布局方式}ShowListImageActivity.startInstance(mContext, SelectLocalPhotoPresenter.class);

好,整体的思路就是这样,在实现过程中还有不少需要调整的地方,请大家批评指正。欢迎多多讨论。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抑制过拟合之正则化与Dropout

避免过拟合: 1、增大数据集合 – 使用更多的数据,噪声点比减少(减少数据扰动所造成的影响) 2、减少数据特征 – 减少数据维度,高维空间密度小(减少模型复杂度) 3、正则化 / dropout / 数据增强…

谈谈神经网络的大规模训练优化

文 | 立交桥跳水冠军源 | 知乎大规模神经网络训练一般会涉及到几百个分布式节点同时工作,模型的参数量以及运算量往往很大,作者认为在这个task下当前的工作主要归结为以下三种:对通信本身的优化,神经网络训练通信的优化&#xff0…

LeetCode 1108. IP 地址无效化

文章目录1. 题目2. 解题1. 题目 给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。 所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.”。 示例 1:输入:address "1.1.1.1" 输出:&…

Android NDK开发入门学习笔记(图文教程,极其详尽)

以前也简单用过JNI,但是只是简单用一下,好多都不明白。最近在看源码部分,有涉及到JNI调用的,所以这次打算彻底把它搞定。 先普及一下JNI的调用关系:JAVA------------------------>JNI----------------------------…

论文浅尝 | 利用问题生成提升知识图谱问答

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识库问答。来源:NLPCC2019链接:http://tcci.ccf.org.cn/conference/2019/papers/183.pdf本文提出了一种利用问题生成提升知识图谱问答模型性能的方法(一个…

顶会论文:基于神经网络StarNet的行人轨迹交互预测算法

1.背景 民以食为天,如何提升超大规模配送网络的整体配送效率,改善数亿消费者在”吃“方面的体验,是一项极具挑战的技术难题。面向未来,美团正在积极研发无人配送机器人,建立无人配送开放平台,与产学研各方共…

python操作mysql数据库实现增删改查

python操作mysql数据库实现增删改查 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFlymSQLMySQLPostgreSQLMicrosoft …

LeetCode 654. 最大二叉树(递归)

文章目录1. 题目2. 解题1. 题目 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给…

Probe:Android线上OOM问题定位组件

配送骑手端App是骑手用于完成配送履约的应用,帮助骑手完成接单、到店、取货及送达,提供各种不同的运力服务,也是整个外卖闭环中的重要节点。由于配送业务的特性,骑手App对于应用稳定性的要求非常高,体现App稳定性的一个…

Android中使用官方提供好的功能使用说明(比如系统图库获取),也作为延生学习的学习文档

这篇文章最核心的就是去学习如何学习Android,如何去使用Android文档。 我们一般在刚开始接触开发的时候,如果遇到无法解决的问题,常常会百度,或者google去寻找答案,比如有个需求是获取系统中的图片,你可能…

再介绍一篇Contrastive Self-supervised Learning综述论文

文 | 黄浴源 | 知乎之前已经介绍过三篇自监督学习的综述:《怎样缓解灾难性遗忘?持续学习最新综述三篇!》。这是最近2020年10月arXiv上的又一篇论文"A Survey On Contrastive Self-supervised Learning"。论文地址:https…

GCN-Based User Representation Learning for Unifying Robust Recommendation and Fraudster Detection

GCN-Based User Representation Learning for Unifying Robust Recommendation and Fraudster Detection 点击率预测:其主要思想是根据用户的历史行为对一组未评级的项目进行评级预测,然后从预测评级最高的项目中选择个性化推荐。 欺诈检测:…

公开课 | 知识图谱构建与应用概述

本文转载自公众号:博文视点Broadview。 AI是新的生产力,知识图谱是AI进步的阶梯。随着近年来人工智能的进一步发展,知识图谱也取得了一系列新的进展,并在各个行业中落地应用。知识图谱的相关技术已经在搜索引擎、智能问答、…

LeetCode 217. 存在重复元素(哈希)

文章目录1. 题目2. 解题1. 题目 给定一个整数数组,判断是否存在重复元素。 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 1:输入: [1,2,3,1] 输出: true 示例 2:输入: [1,2,3,4] 输出:…

美团BERT的探索和实践

2018年,自然语言处理(Natural Language Processing,NLP)领域最激动人心的进展莫过于预训练语言模型,包括基于RNN的ELMo[1]和ULMFiT[2],基于Transformer[3]的OpenAI GPT[4]及Google BERT[5]等。下图1回顾了近…

论文浅尝 | 探索将预训练语言模型用于事件抽取和事件生成

论文笔记整理:郝凯龙,南京大学硕士链接:https://www.aclweb.org/anthology/P19-1522.pdf动机传统的 ACE 事件抽取任务依赖于人工标注的数据,耗费大量的人力并且数据量有限,数据量不足给事件抽取带来了阻碍。传统的事件…

谷歌、CMU发文:别压榨单模型了!集成+级联上分效率更高!

文 | Sherry 不是小哀集成模型(Ensemble)可以提升模型的精度,但往往面临提升计算量的困境,用级联模型(Cascade)在预测时提前中断则可解决计算量的问题。最近,谷歌和CMU的研究者对此进行了深入的…

LeetCode 219. 存在重复元素 II(哈希)

文章目录1. 题目2. 解题1. 题目 给定数组nums和常数k&#xff0c;存在不同的i、j使得nums[i] nums[j]&#xff0c;且abs(i-j) < k。 输入: nums [1,2,3,1], k 3 输出: true 示例 2:输入: nums [1,0,1,1], k 1 输出: true 示例 3:输入: nums [1,2,3,1,2,3], k 2 输出…

Android静态代码扫描效率优化与实践

背景与问题 DevOps实践中&#xff0c;我们在CI(Continuous Integration)持续集成过程主要包含了代码提交、静态检测、单元测试、编译打包环节。其中静态代码检测可以在编码规范&#xff0c;代码缺陷&#xff0c;性能等问题上提前预知&#xff0c;从而保证项目的交付质量。Andro…

还在用[CLS]?从BERT得到最强句子Embedding的打开方式!

文&#xff1a;涅生编&#xff1a;兔子酱你有尝试从 BERT 提取编码后的 sentence embedding 吗&#xff1f;很多小伙伴的第一反应是&#xff1a;不就是直接取顶层的[CLS] token的embedding作为句子表示嘛&#xff0c;难道还有其他套路不成&#xff1f;nono&#xff0c;你知道这…