ListView分析
学以致用篇(1)

在我们查看别人的博客的时候,一个人是一个风格的.先说下我的风格,我喜欢思想类比,然后介绍知识,不太喜欢填鸭式的灌输.
如果只是想单纯的从我的博客中直接看到代码,我个人建议直接到网上搜索其他的案例,我喜欢一步一步的分析,
然后分析完一个过程,会有一个对应的例子这个样子

(1) 什么是ListView

ListView 首先就是一个View,View顾名思义,就是用来展示数据的,但是android中的view和普通的view有些区别,View不仅用来展示数据,还有对这块区域的处理,以后有时间再说这个

ListView是用来展示列表数据的,可以认作是一列多行的表格

表格的组成其实与人的身体组成类似

人是由头部,身体,脚部组成

表格呢,也是有对应的header,body和footer组成

listView同理,也是由header,body和footer组成

个人认为这就是为什么说计算机的思想是想通的

(2) 怎么用呢?

既然有ListView,并且他是用来展示数据的,那么该怎么用呢?
你想想,android中的View是有两大派系的

一大派系是直接继承View的,就是不能添加子元素的
令一大派系是继承ViewGroup的,就是可以添加子元素的,至于原因呢?自己查资料

既然ListView是可以展示列表的数据,那么肯定是继承自ViewGroup

继承自ViewGroup,我们是不是也是直接addView的方式添加呢?

能考虑到这里,我们已经入门ListView了

(3)ListView用之前的考虑

稍微深入一下:

ListView的设计呢?其实是MVC在android中很好的体现

MVC为何物

在此借鉴一下他人的博客(http://www.tuicool.com/articles/myeYNjJ)

1.什么是MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑----摘自百度百科。

M:model:指的是用来封装信息的对象。 
V:view:用来显示model中封装的信息的组件。 
C:controller:用来控制model中的信息怎么输出到view中的。

在android中最典型的MVC就是listview的显示 
M:model指你要显示的数据,如封装数据的cursor,array等等 
V:view:就是listView用来显示封装好的数据 
C:controller:就是adaptor,用来控制数据如何向listview中显示,如arrayadaptor,cursoradaptor等等

MVC可以使程序耦合性降低,视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可.同时可以让代码复用性提高,由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。

(4)MVC在ListView相关的体现

既然都提到了MVC,并且ListView是典型代表,那么ListView相关的,何为视图,何为模型,何为控制器?带着这些疑问,我来分享一下吧

刚才提到了,ListVIew是视图,因为他是View,控制器呢?android中命名为adapter(适配器,其实就是Controller,命名为Controller就更加直观了),模型呢?就是数据,自己随便创建个数组或者队列就是数据模型了(图示 : 参照最后的图片)

(5)demo

listView的入门demo已经烂大街了,就像北京的程序员一样,我就不献丑了

) {
            boolean result = false;
            if (((HeaderViewListAdapter) mAdapter).removeFooter(v)) {
                mDataSetObserver.onChanged();
                result = true;
            }
            removeFixedViewInfo(v, mFooterViewInfos);
            return result;
        }
        return false;
    }

说这么多理论的,来点实际的吧,一个比较实际的例子,在即时通讯软件中,例如微信,在有网络的时候,没有显示有网络,但是在没有网络的时候,会提示

这个实现方式呢?比较多,先说说思路
思路1: 可以采用一个把这条信息作为adapter的一个条目即可,
但是这样总感觉不太好,这是个与数据没有很明显关系的,而且每次在刷新数据的时候,都需要去通知adapter数据改变
思路2: 采用我们刚刚提到的将网络的条目放置到header中,如果有动手操作过的,就应该遇到过这个问题,如果只是单单的将这个信息放置到头部中,然后在有网络的时候,gone掉header,发现条目是gone了,但是位置还存在,这个问题怎么办呢?
这个应该是listview设计的问题吧?在stackoverflow中发现了解决的思路
思路如下: 
我们将需要改变的条目,外面再包裹一层,最外层采用包裹内容的方式,并且不设置背景等等其他属性
我们只需要改变自己想要改变内容的大小即可
(其实实现下拉刷新也可以直接采用这个方式)
连接地址:http://stackoverflow.com/questions/19656782/listview-not-contracting-when-header-view-set-to-view-gone

(2)listView的position和我们的adapter的position是否相同呢?
从第一部分分析的listView的setAdapter也便可知,在存在headView或者footerView的时候,我们设置listView中的adapter并不是我们设置的adapter,而是被包装过的HeaderViewListAdapter,,我感觉如果明明为AdapterWrapper就更加形象了,但是google的命名呢?体现了这个adapter是和header有关的.

从面向对象的角度讲,这其实是不同的东西,ListView中的position,我们就应该认为是ListView自身孩子的position,比如说有headView,headView也是我的孩子,而对于我们的adapter,只是和自己的adapter有关,因为在存在headview和footerView的时候,
我们设置的listView的setOnItemClick其实是对listView的position进行的操作
因而需要考虑headView和footerView的点击,并且要防止错位

有时间继续总结吧

安卓源码分析群: Android源码分析QQ1群号:164812238

老潘 - ListView分析 - 学以致用篇(一)的更多相关文章

  1. 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 百篇博客分析OpenHarmony源码 | v4.05

    百篇博客系列篇.本篇为: v04.xx 鸿蒙内核源码分析(任务调度篇) | 任务是内核调度的单元 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  2. Android事件传递机制详解及最新源码分析——ViewGroup篇

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴 ...

  3. 使用ML.NET实现情感分析[新手篇]后补

    在<使用ML.NET实现情感分析[新手篇]>完成后,有热心的朋友建议说,为何例子不用中文的呢,其实大家是需要知道怎么预处理中文的数据集的.想想确实有道理,于是略微调整一些代码,权作示范. ...

  4. shell日志分析进阶篇

    前面我们说了shell分析日志常用指令,现在我们随ytkah一起看看shell日志分析进阶篇,假设日志文件为ytkah.log //统计不重复抓取数量 cat ytkah.log | awk '{pr ...

  5. JUC源码分析-集合篇:并发类容器介绍

    JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...

  6. JUC源码分析-集合篇(十)LinkedTransferQueue

    JUC源码分析-集合篇(十)LinkedTransferQueue LinkedTransferQueue(LTQ) 相比 BlockingQueue 更进一步,生产者会一直阻塞直到所添加到队列的元素 ...

  7. JUC源码分析-集合篇(九)SynchronousQueue

    JUC源码分析-集合篇(九)SynchronousQueue SynchronousQueue 是一个同步阻塞队列,它的每个插入操作都要等待其他线程相应的移除操作,反之亦然.SynchronousQu ...

  8. JUC源码分析-集合篇(八)DelayQueue

    JUC源码分析-集合篇(八)DelayQueue DelayQueue 是一个支持延时获取元素的无界阻塞队列.队列使用 PriorityQueue 来实现. 队列中的元素必须实现 Delayed 接口 ...

  9. JUC源码分析-集合篇(七)PriorityBlockingQueue

    JUC源码分析-集合篇(七)PriorityBlockingQueue PriorityBlockingQueue 是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现. P ...

随机推荐

  1. VS类添加头文件注释

    VS2015参考: http://blog.csdn.net/qq395537505/article/details/50853546  修改两个文件,详细信息 VS2010: 找到VS的安装目录 E ...

  2. SSH三大框架整合配置详细步骤(2)

    4 配置Hibernate Hibernate MySql连接配置 在Hibernate中,可以配置很多种数据库,例如MySql.Sql Server和Oracle,Hibernate MySql连接 ...

  3. casperjs userAgent的一些问题

    casperjs 的options内的userAgent若设置为非正常浏览器的字符串,可能导致form无法正确提交. 表现为,this.click()失效,或evaluate(function(){$ ...

  4. 全局Timestamp管理器 检测js执行时间

    随手写了个小工具,主要为了测试不同混淆程度的javascript脚本的加载速度1. [代码]Timestamp.js (function() { if (typeof this.Timestamp = ...

  5. 六:多线程--自定义NSOperation

    一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 3 // ...

  6. luogu 4720 【模板】扩展卢卡斯

    题目大意: 求$C_n^m \mod p$,p不一定为质数 思路: 首先可以将$p$分解为$p1^{a1}*p2^{a2}*...*pk^{ak}$,对于这些部分可以使用$CRT$合并 对于每个$p_ ...

  7. WebUploader上传大文件时,上传出错问题

    上传普通文件没有问题,当文件达到一定大小的时候,上传错误,返回结果是404,我可以肯定的是路径是没有问题的.因为上传小文件等都是可以的. 然后使用webuploader的uploaderror监控错误 ...

  8. JSP+MySQL实例

    转自:https://www.yiibai.com/jsp/jsp_mysql.html 在本章中,我们将讨论如何使用JSP访问数据库(这里以MySQL数据库为例).并假设您对JDBC应用程序的工作方 ...

  9. Winpcap笔记3之打开适配器并捕获数据包

    上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const cha ...

  10. Rebel 6 破解版及使用方法

    下载地址:http://www.zeroturnaround.com/jrebel/download/     下载下来的是一个Zip压缩包,打开之后会发现一个jrebel.jar,这就是其最重要的运 ...