Day 10 | 进阶清单元件 - ViewHolder

View的重复利用

由於每一个项目都会有一个新的View,当项目增加时,View也会越来越多导致效能低落。

ViewHolder

藉由设计一个新类别来储存View中的所有元件,并以画面中可呈现的数量产生View实体,将资讯进行替换,以实现重复利用。

由於View是由Adapter产生,所以ViewHolder会设计在Adapter内。

Adapter产生View的过程

  1. 系统计算清单元件可容纳的项目数量
  2. 呼叫getView()方法取得每个项目的View
  3. 当使用者滚动时,就会再呼叫getView()产生新的View

ViewHolder的设计逻辑

将滚动後产生的新View视为冗余,只要把即将离开清单元件的View作为下一个即将进入清单元件的View的容器,并将内容替换,必免产生新的View,这样的设计称为「画面复用」。

  1. 建立一个ViewHolder类别,里面存放画面的元件

    private class ViewHolder(v: View){
    	//连结画面中的元件
    	val img_photo = v.findViewById<ImageView>(R.id.img_photo)
    	val tv_msg = v.findViewById<TextView>(R.id.tv_msg)
    }
    
  2. 改写getView()方法

    override fun getView(position: Int,convertView: View?,parent: ViewGroup): View{
    	val view: View
    	val holder: ViewHolder
    
    	if (convertView == null){
    		//依据传入Layout建立画面
    		view = View.inflate(parent.context, layout, null)
    		holder = ViewHolder(view)
    		//为View加上标签以重复使用
    		view.tag = holder
    } else {
    		holder = convertView.tag as ViewHolder
    		view = convertView
    }
    		//回传此项目的画面
    		return view
    }
    

<<:  【D10】市场热络程度:每日市场成交资讯

>>:  Day01网页设计入门笔记-前言

Day 8 : 字串处理

字串处理感觉满多东西可以讲的,这次就讲讲我平时会用到的一些简易功能好了: 字串的大小写处理 pyth...

客户抱怨 v.s. 客户开发

自从到了美国之後,原本预期要来好好开发海外市场的,果然事情没有这麽顺利,既有客户所遇到的 Bug 跟...

大数据平台:分散式协调

分散式系统是解决网际网路业务承载量问题的基本方法,服务器的记忆体、硬碟故障、服务器之间的网路线路故障...

[Day17] Flutter - 实作篇:专案架构 (Domain Driven Design)

前言 Hi, 我是鱼板伯爵身为一个软件工程师,我们最常见的问题就是变动的需求。而程序码变更,就会有机...

[13th-铁人赛]Day 3:Modern CSS 超详细新手攻略 - Box Model

现在我们手上有了武器(css基本语法),只是刚创建角色拿到的新手包里面那种,所以在打怪前记得先来补充...