当前位置: 首页 > news >正文

泉州市知名网站建设公司如何建立一家网站

泉州市知名网站建设公司,如何建立一家网站,上海搬家公司排名,170个可带链接锚文本外链的网站论坛用一个设计模式培养高复用、低耦合思想 前言Android中的装饰者代码实现第一步#xff1a;创建装饰器DecorateAdapter第二步#xff1a;处理头部、中间内容、尾部的绑定关系第三步#xff1a;装饰器的使用第四步#xff1a;改进、直接封装一个View出来 总结 前言 一个高复用… 用一个设计模式培养高复用、低耦合思想 前言Android中的装饰者代码实现第一步创建装饰器DecorateAdapter第二步处理头部、中间内容、尾部的绑定关系第三步装饰器的使用第四步改进、直接封装一个View出来 总结 前言 一个高复用、低耦合的代码不会让你在第一次去实现代码的时候感到舒服 但是他会在你后面做扩展、和同类需求的时候直呼真香 最近写需求借用到装饰者思想做了RecyclerView的头和尾的扩展 感觉很不错赶紧拿出来说一说嘻嘻 ps本篇文章只是帮助大家在实现需求的过程中也能潜移默化的使用设计模式来优化代码 Android中的装饰者 首先一句话总结装饰者就是不通过继承的方式来扩展某个对象的功能达到我们想要实现的效果。 举两个小例子不细说因为前面已经讲过装饰者模式相关的内容 InputStream装饰者 InputStream装饰者在Android中我们经常需要读取文件或者网络流。InputStream是用于读取字节流的抽象类而Android提供了许多装饰者类来扩展InputStream的功能。 例如BufferedInputStream和DataInputStream都是InputStream的装饰者类它们添加了缓冲和数据类型转换的功能。 FileInputStream fileInputStream new FileInputStream(example.txt); BufferedInputStream bufferedInputStream new BufferedInputStream(fileInputStream); DataInputStream dataInputStream new DataInputStream(bufferedInputStream);View装饰者 Android中的UI组件都继承自View类而Android提供了装饰者类来扩展View的功能 例如可以使用LayoutInflater来给布局文件添加一些额外的装饰 LayoutInflater inflater LayoutInflater.from(context); View originalView inflater.inflate(R.layout.original_layout, parentLayout, false); ViewDecorator viewDecorator new ViewDecorator(originalView); View decoratedView viewDecorator.decorate(); parentLayout.addView(decoratedView);基于这种思想在做RecyclerView的头和尾的扩展想到了利用这种装饰者扩展的方式去加头和尾而保留中间数据层的原有属性。 代码实现 利用DecorateAdapter去装饰RecyclerView.Adapter从而扩展HeadView、FooterView 中间内容我们使用contentAdapter来表示假设就是简单的Item结构就不做代码介绍了。 第一步创建装饰器DecorateAdapter 创建装饰器DecorateAdapter并实现增加头部和尾部Item的相关方法、和成员变量 并将contentAdapter作为原始的内容列表 class DecorateAdapter(val contentAdapter: RecyclerView.AdapterRecyclerView.ViewHolder ) : RecyclerView.AdapterRecyclerView.ViewHolder(), IdecorateList {/**save head View*/private val headerList: MutableListView by lazy {mutableListOf()}/**save footer view*/private val footerList: MutableListView by lazy {mutableListOf()}/**常规方法*/............override fun getItemCount(): Int {//记得加上contentAdapter的Item条目return contentAdapter.itemCount headerList.size footerList.size}override fun addHeaderView(header: View) {if (!headerList.contains(header)) {headerList.add(header)refreshList()}}override fun removeHeaderView(header: View) {if (headerList.contains(header)) {headerList.remove(header)refreshList()}}override fun addFooterView(foot: View) {if (!footerList.contains(foot)) {footerList.add(foot)refreshList()}}override fun removeFooterView(foot: View) {if (footerList.contains(foot)) {footerList.remove(foot)refreshList()}}override fun refreshList() {notifyDataSetChanged()} }第二步处理头部、中间内容、尾部的绑定关系 处理头部、中间、尾部的不同绑定的视图也就是createHeaderViewHolder处理 /**创建头部的ViewHolder*/ private fun createHeaderViewHolder(view: View): RecyclerView.ViewHolder {return HeaderViewHolder(view) }/**创建尾部的ViewHolder*/ private fun createFooterViewHolder(view: View): RecyclerView.ViewHolder {return FooterViewHolder(view) }override fun onCreateViewHolder(parent: ViewGroup, position: Int): RecyclerView.ViewHolder {/**头部样式展示*/if (headerList.isNotEmpty() position in 0 until headerList.size) {return createHeaderViewHolder(headerList[position])}/**中间内容展示*/val startPosition if (headerList.isNotEmpty()) headerList.size else 0val endPosition if (headerList.isNotEmpty()) headerList.size contentAdapter.itemCount else contentAdapter.itemCountif (position in startPosition until endPosition) {return contentAdapter.onCreateViewHolder(parent, position)}/**尾部样式展示*/return createFooterViewHolder(footerList[position - endPosition]) /**注意这里的取值*/ }处理处理头部、中间、尾部的数据绑定也就是onBindViewHolder的处理 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {if (headerList.isNotEmpty() position in 0 until headerList.size) {return}/**中间的内容数据绑定*/val startPosition if (headerList.isNotEmpty()) headerList.size else 0val endPosition if (headerList.isNotEmpty()) headerList.size contentAdapter!!.itemCount else contentAdapter!!.itemCountif (position in startPosition until endPosition) {/**注意计算的时候要减去HeadView*/contentAdapter?.onBindViewHolder(holder, position - headerList.size)} }第三步装饰器的使用 把内容区域的ContentAdapter通过DecorateAdapter进行包装之后调用包装后的decorateAdapter进行添加HeadView decorate findViewById(R.id.rv_decorate) val decorateAdapter DecorateAdapter(ContentAdapter()) decorate.adapter decorateAdapter decorate.layoutManager LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)decorateAdapter.addHeaderView(LayoutInflater.from(this).inflate(R.layout.layout_header, decorate, false) )第四步改进、直接封装一个View出来 把装饰者封在内部 毕竟我们在调用的时候还是想当一个View直接拿来用改进一下 class decorateRecyclerView : RecyclerView {private var DecorateAdapter: DecorateAdapter? nullJvmOverloadsconstructor(context: Context, attributes: AttributeSet? null) : super(context, attributes)override fun setAdapter(adapter: AdapterViewHolder?) {DecorateAdapter DecorateAdapter(adapter!!)super.setAdapter(DecorateAdapter)}fun addHeaderView(header: View) {DecorateAdapter?.addHeaderView(header)}fun removeHeaderView(header: View) {DecorateAdapter?.removeHeaderView(header)}fun addFooterView(foot: View) {DecorateAdapter?.addFooterView(foot)}fun removeFooterView(foot: View) {DecorateAdapter?.removeFooterView(foot)} }调用 使用 decorate findViewById(R.id.rv_decorate) decorate.adapter ContentAdapter() decorate.layoutManager LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)decorate.addHeaderView(LayoutInflater.from(this).inflate(R.layout.layout_header, decorate, false) ) decorate.addFooterView(LayoutInflater.from(this).inflate(R.layout.layout_footer, decorate, false) )总结 本篇呢只是想说一下如何去潜移默化的使用设计模式去改变我们的代码。 举了一个扩展RecyclerView头和尾的例子。 如果不用设计模式的话我想你的头和尾的处理逻辑都是需要冗余在ContentAdapter中的 问题 1、那么你的ContentAdapter的定义界限是什么整个页面的业务那难免太难维护了 2、如果只需要服用ContentAdapter怎么处理粘贴复制多造一个类出来 而通过上面我们介绍的装饰者模式就能解决这两个复用、耦合的问题
http://www.yutouwan.com/news/90345/

相关文章:

  • 阿里巴巴网站做方案网站热点关键词
  • 北京做网站男生工资外贸seo网站大全
  • 做网站签合同个人网站做联盟营销
  • 网页制作网站开发中国网站备案信息查询
  • 网站建设的作业模板宽带多少钱一个月
  • 教育培训网站制作检察院网站建设标书
  • 贵州省住房和城乡建设部官方网站wordpress 没有上级目录的写权限
  • 新媒体包不包括公司网站的建设WordPress分享到微博代码
  • 公司电商网站开发上海高端工作室网站
  • 电子商务网站建设的需求制作企业网站的一般流程
  • 在线购物网站的设计与实现云南做网站多少钱
  • 凡度网络北京网站建设公司山东网站建设报价
  • 深圳外贸网站开发建设网站推广具体内容
  • 青海省建设监理协会网站注册网站借钱平台犯不犯法
  • 站长工具查询官网企业风首页中文官网模板
  • 凡科网免费网站域名注册平面网页设计
  • 做一个网站要注意什么东西wordpress镜像下载
  • 品牌网站建站目的国家化妆品备案网官网
  • 黑龙江省建设厅网站站长wordpress免费域名
  • 有网站模板怎么做网站wordpress支付宝微信支付
  • 浦东新区苏州网站建设什么语言做网站
  • 杰瑞网站建设长沙网站建设zh68
  • 网站建设和空间w网站链接如何做脚注
  • 榆林网站seo中国网站建设总部在哪里
  • 展示型网站举例网站建设都用哪些软件
  • 网站设计师培训图片进行网站开发的所有步骤
  • 产品软文范例大全seowhy问答
  • 中国室内设计网欧式seo技术培训教程
  • wordpress zzt梧州网站优化
  • 优秀的vi设计手册seo的基本内容