Android ListView 分组效果实现「建议收藏」

Android ListView 分组效果实现「建议收藏」AndroidListView实现分组的功能,并且点击相应的分组可以对相应的分组展开和收缩。

大家好,又见面了,我是你们的朋友全栈君。

一. 实现的效果

       实例只是简单的显示了两个分组PC和Mobile两个分组 。

  1. 两个分组都展开(如下图)
    这里写图片描述

  2. 第一个分组展开第二个分组收缩(如下图)
    这里写图片描述

  3. 第一个分组收缩第二个分组展开(如下图)
    这里写图片描述

  4. 两个分组都收缩(如下图)
    这里写图片描述

二. 简单的一些介绍

1. 万能适配器 具体可以参考http://www.imooc.com/learn/372

1). ViewHolder: 传统的写法我们一般是会把ViewHolder写在Adapter里面,这里把ViewHolder提取出来作为一个公共的类使用这样不用每个Adpater都去写一遍ViewHolder了,所以对于每个ViewHolder类我们要知道的对象有

private SparseArray<View>   mViews       = null;
private Context             mContext     = null;
private View                mConvertView = null;
private int                 mPosition    = -1;

mViews 用来保存我们每个item布局里面的view对应的key是view的id,mContext 用来保存上下午,mConverView保存对应item的ConvertView,mPosition用来保存item对应的位置。

2). MobileBaseAdapter: 也做了稍微的优化,因为我们在写Adapter里面getView的时候很多动作都是重复的,所以对应重复的动作全部都单独提取出来提前写好了,在使用MobileBaseAdapter的时候只要实现public abstract void convert(ViewHolder viewHolder, T t); 就好了具体可以看下代码中的做法。用起来是非常简单的。

2. 具体分组的实现

       我们先要知道BaseAdapter里面的getItemViewType()函数和getViewTypeCount()函数的作用。getViewTypeCount表示ListView 每个item会缓存几个复用对象,getItemViewType则是根据position判断这个这个item对应用哪个缓存的对象,换句话说比如getViewTypeCount返回的值是3,那么每个item可能就会有0,1,2三个缓存复用的对象,这个时候getItemViewType返回的是0,这样就会用0这个对象去复用。

这样我们在来看下MobileCategoryAdapter里面的代码。

1). 内部类Category 这个没什么东西包含一个BaseAdapter对象和一些必要的方法, 因为我们在MobileCategoryAdatper里面肯定是会有List对象的。

2). 内部类CategoryListClickListener 实现了ListView的OnItemClickListener。因为我们要ListView.setOnClickListener这个类的对象。
在这个类中我们会区分当前点击的是title(点击的时候我们可能会展开和收缩该分组)还是item。然后把title(onTitleClick)和item(onItemClick)的点击的实现都暴露出去。

3). getViewTypeCount() 1+每个Category中Adpater的ViewType。加1可以想象是每个Category都有一个标题。看代码运行的效果图应该能看出来,我们上面的效果图相当于有3个ViewType。

4). getItemViewType() 根据每个position去获取ViewType。

@Override
public int getItemViewType(int position) {
int typeOffset = 1;

   for (Category category : categories) {
if (position == TITLE_POSITION) {
return VIEW_TYPE_TITLE;
}

int size = category.getAdapter().getCount() + 1;
      if (position < size) {
return typeOffset + category.getAdapter().getItemViewType(position - 1);
}
      position -= size;
typeOffset += category.getAdapter().getViewTypeCount();
}

return -1;
}

如果是标题的位置时候返回的是0类型,每个Catatory的ViewType则是慢慢的往上加的。这个应该好理解哦,for循环里面的逻辑应该也好理解就是判断当前的position是落在哪个Catogory上面或者是落在tittle上面的。仔细想下应该能想明白的。

5). getView()获取每个Item

public View getView(int position, View convertView, ViewGroup parent) {
int categoryIndex = 0;

   for (Category category : categories) {
if (position == TITLE_POSITION) {
         ViewHolder viewHolder = ViewHolder.getViewHolder(mContext, convertView, parent, mTitleLayoutId, position);
convertTitleView(viewHolder, categoryIndex);
         return viewHolder.getConvertView();
}

int size = category.getAdapter().getCount() + 1;
      if (position < size) {
return category.getAdapter().getView(position - 1, convertView, parent);
}
      position -= size;
categoryIndex++;
}

return null;
}

for循环同样是判断position是落在哪个地方如果是title上面则用定义的布局文件,如果是落在具体的某个Category上面则是用Category中的Adapter对应的getView。

就写这一点点吧,写的很简单,具体的可以去参考下代码是怎么实现的,代码应该还算是比较简单的。

三. 源码下载

代码下载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160599.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 圆柱体积公式怎么算立方米_长方体计算体积公式

    圆柱体积公式怎么算立方米_长方体计算体积公式想要求圆柱的体积必须要记住圆柱对应的公式,下面小编为大家提供圆柱体积怎么算,希望对大家有所帮助。求圆柱体积的算法求圆柱体积先要求圆基的半径。两个圆都会做,因为它们大小相同。如果你已经知道半径,你可以继续前进。如果你不知道半径,那么你可以用尺子测量圆的最宽部分,然后除以2。这将比测量直径的一半更准确。我们说,这个圆筒的半径是1英寸(2.5厘米)。把它写下来。如果你知道这个圆的直径,就把它分成2个。…

    2022年9月20日
    1
  • Easyui Datagrid的Rownumber行号显示问题

    Easyui Datagrid的Rownumber行号显示问题在Oracle中使用orderby进行查询排序时,如果排序字段中有空值(null),排序结果可能会达不到我们想要的结果。如:select*fromtestorderbyagedesc;按照age字段降序排序,结果如下:将sql语句改为select*fromtestorderbyagedescnullslast;即可将null值排到

    2022年6月12日
    72
  • java: 找不到符号「建议收藏」

    java: 找不到符号「建议收藏」java:找不到符号符号:类TypeInformationTestBase位置:程序包org.apache.flink.api.common.typeutils程序报这种错误,不是代码造成的。解决办法:0、首先要统一编码格式:file–>settings–>fileencodings1、右键–>maven–>reloadproject2、build或rebuild3、flile–>inv..

    2022年7月8日
    65
  • 图片怎么一键重命名_多个图片重命名并按指定的顺序

    图片怎么一键重命名_多个图片重命名并按指定的顺序其主要功能是将某个目录下的指定文件复制到另一个目录下,同时:1.对于目录结构,可以选择将原各级子目录合并成一个目录,或保持原目录结构。2.对于文件名,可以选择(1).保持原文件名不变,但在重名时自动更名;(2).将所有文件重新编号,新文件名=前缀+分隔字符+编号,前缀可以指定,或用子目录名为前缀;(3).去掉原文件名的头几个字符;(4).在文件名开头添加指定的字符串;(5).在第n个字符后添加…

    2025年9月12日
    2
  • android开发揭秘!全靠这份Android知识点PDF大全,附答案[通俗易懂]

    android开发揭秘!全靠这份Android知识点PDF大全,附答案[通俗易懂]Glide缓存简介Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。这两个缓存模块的作用各不相同,内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,而硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。内存缓存和硬盘缓存的相互结合才构成了Glide极佳的图片缓存效果,那么接下来我们就分别来分析一下这两种缓存的使用方法以及它们的实现原理。我认识很多优秀的Android工程师,他们丝毫

    2022年5月3日
    60
  • Docker 离线安装_docker官方中文文档

    Docker 离线安装_docker官方中文文档docker离线安装流程

    2022年9月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号