日常的开发工作经常需要ListView作为布局的组件,而且很多时候都会遇到需要自定义ListView的情况。

也有些问题并不需要自定义的ListView,基于原生的ListView就能实现,但需要灵活处理Adapter。

我们现在就遇到一个棘手的问题:原本的下拉刷新ListView是单个item的刷新,现在要改成一行两个item,照道理来讲,这应该是一个GridView,但是要考虑兼容以往的下拉刷新效果,要重新定义一个这样的GridView是比较困难的,因为打算基于原生的ListView进行改造,因为原本的下拉刷新ListView本身就是ListView的子类。

一个明显的改变就是在Adapter的getCount()。

这个方法返回的是ListView一共要显示的item的数目,但是因为现在已经改成一行显示两个item,所以实际显示的数目应该除以2的,但考虑到如果数据源是奇数的问题,所以代码如下:

   @Override
public int getCount() {
int size = list.size();
if(size % 2 == 0){
return size / 2;
}else{
return size / 2 + 1;
}
}

然后我们在处理getView的时候必须要注意,现在这个position代表的意思和以前不一样。

以前的position为0的时候,表示是第一个元素,但这里我们在getCount里面处理过了,所以返回0其实是表示返回第一个和第二个元素。

如果position为0,取的是0和1,如果为1,取的是2和3,为2,取的是4和5。。。以此类推,我们在取的时候,要position * 2和position * 2 + 1,表示取出一行左边和右边的item的数据。

我们必须注意奇数时候取到最后一个数据的情况。

我们可以判断position * 2 + 1是否小于数据的数量,如果大于,说明是取到最后一个数据了,就要隐藏掉右边的Item。

这样我们就实现了一个ListView一行显示两列的情况。

涉及到getCount中的修改,一般都是类似这种,一行显示多个item的情况,但是我们并不建议在处理类似的情况的时候搞得这么复杂,如果能够用GrideView或者RecyclerView就用,如果是类似我们这种,因为之前的业务关系,导致必须在已有的ListView上修改,就可以采取这种做法。

ListView作为一个可滑动的控件,有很多效果都要求在滑到某个位置时候要做出某种响应。这类效果的实现可以很复杂,也可以稍微简单,视具体情况而言。

我们遇到的需求是要求ListView在某个控件滑出屏幕的时候,标题栏要显示某个控件。

这个需求并不算是特别复杂,我们只要判断滑出屏幕的控件的坐标位置就行。

所有可以滑动的控件的滑动监听都可以在onScroll方法里。

要判断某个控件是否滑出屏幕,我们先要知道屏幕的范围。

 Point p = new Point();
getWindowManager().getDefaultDisplay().getSize(p);
int screenWidth = p.x;
int screenHeight = p.y;
Rect rect = new Rect(0, 0, screenWidth, screenHeight);

这个Rect就是屏幕的坐标范围。

然后我们获取某个控件的坐标范围。

int[] location = new int[2];
view.getLocationInWindow(location);

这个控件的坐标范围就放在location里面。

然后我们判断某个控件是否在某个范围可见,也就是Rect内可见,可以调用这个方法:

view.getLocalVisibleRect(rect)

任何复杂的效果,都是建立在基础控件的基本属性和方法上,虽然实现上会比较琐屑,但是我们看到的那些简单的方法调用,其封装的实现也是很琐屑的。

Android中涉及到控件的一些特别效果,尤其是涉及到坐标变化,都需要我们特别细心的对待,只要找到思路,还是有方法实现的。

利用ListView的基本方法实现效果的更多相关文章

  1. 利用TabHost制作QQ客户端标签栏效果(低版本QQ)

    学习一定要从基础学起,只有有一个好的基础,我们才会变得更加的perfect 下面小编将利用TabHost制作QQ客户端标签栏效果(这个版本的QQ是在前几年发布的)…. 首先我们看一下效果: 看到这个界 ...

  2. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  3. ListView与.FindControl()方法的简单练习 #2 -- ItemUpdting事件中抓取「修改后」的值

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_201 ...

  4. ListView的setSelectionFromTop()方法与setSelection()方法的联系

      通常,app中的数据都是以ListView的形式展示的.默认地,把“新”数据添加到数据列表的尾部. 但是,如果是IM类型的app,比如查看历史消息这个模块.新数据并不是插到数据列表的尾部,而是插到 ...

  5. [DevExpress]利用LookUpEdit实现类似自动提示效果

    原文:[DevExpress]利用LookUpEdit实现类似自动提示效果 关键代码: public static void BindWithAutoCompletion(this LookUpEdi ...

  6. linux利用sendmail发送邮件的方法

    Linux利用sendmail发送邮件, 方法1 安装sendmail即可使用, mail -s "test" user@sohu.com bin/mail会默认使用本地sendm ...

  7. 反射中的一个问题点:利用Method执行main方法特殊的地方

    利用Method执行main方法 问题: 启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个m ...

  8. UWP 取消GridView、ListView鼠标选中、悬停效果

    因为经常碰到ListView或者ListBox之类的选中.鼠标悬停样式和自己设置的主题颜色不搭,这时就需要改变这些样式了. 而这里我通过ListView来说明,大致思路其实就是重新定义Item的Tem ...

  9. ListView中pointToPosition()方法使用具体演示样例

    MainActivity例如以下: package cc.testpointtoposition; import java.util.ArrayList; import java.util.HashM ...

随机推荐

  1. 使用pango-Cairo列出系统中的有效字体

    使用pango-Cairo列出系统中的有效字体,代码来源于gtk-app-devel-list fonts list using pango #include <glib.h> #incl ...

  2. Groonga 3.0.8 发布,全文搜索引擎

    Groonga 3.0.8 改进了管理界面的可用性,支持 groonga_query_log_path 指令(groonga-httpd) 提供基于 nginx 的 HTTP 服务功能,改进了 del ...

  3. C# - JSON详解

    最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列 ...

  4. 用JQ仿造百度书籍预售页面的单屏滚页效果

    今天的项目需要做到一个介绍页面,我主动提出走单屏滚页的风格,毕竟交互性好,逼格也高,具体效果可以参照百度知道书籍预售页面. 其实现效果就大概是这样的: 还是老样子,所有步骤文件可以从我的Github上 ...

  5. javascript的执行和预解析

    很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...

  6. C#中的线程四(System.Threading.Thread)

    C#中的线程四(System.Threading.Thread) 1.最简单的多线程调用 System.Threading.Thread类构造方法接受一个ThreadStart委托,改委托不带参数,无 ...

  7. Nim语言的模块化编程

    前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ...

  8. 有强迫症的我只能自己写一个json格式化工具

    缘由 为什么博客园的markdown解析出问题了啊?好奇怪啊! 一直以来在编码规范界有2大争论不休的话题,一个是关于是用空格缩进还是tab缩进的问题,一个是花括号是否换行的问题,笔者是tab缩进和花括 ...

  9. Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

    使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...

  10. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...