使用StickyListHeadersListView开源库

使用了

StickyListHeadersListView

这个库的项目很多,因为许多电话本都是用的这个效果,而且有很多项目都使用了这个效果来实现的层级导航:

先看效果:

主要的核心代码是一个Adapter,项目的github的README.md上给了一个示例,sample下也有一个比较麻烦的实现,我主要参考了这两个才明白了使用方式:

Adapter代码:

 1 private class MyAdapter extends BaseAdapter implements StickyListHeadersAdapter{
 2
 3         private String[] mCountries;
 4         private LayoutInflater mInflater;
 5
 6         public MyAdapter(Context context) {
 7             mInflater = LayoutInflater.from(context);
 8             mCountries = context.getResources().getStringArray(R.array.countries);
 9         }
10         @Override
11         public View getHeaderView(int i, View view, ViewGroup viewGroup) {
12             Log.i("TAG","get HeaderView "+i);
13             HeaderViewHolder holder;
14
15             if (view == null) {
16                 holder = new HeaderViewHolder();
17                 view = mInflater.inflate(R.layout.header, viewGroup, false);
18                 holder.text = (TextView) view.findViewById(R.id.text1);
19                 view.setTag(holder);
20             } else {
21                 holder = (HeaderViewHolder) view.getTag();
22             }
23
24             // set header text as first char in name
25             CharSequence headerChar = mCountries[i].subSequence(0, 1);
26             holder.text.setText(headerChar);
27
28             return view;
29         }
30
31         /**
32          * 这个是用来边标记浮动headerView的一个方法,返回相同ID的将被显示为同一View
33          * @param i 当前位置
34          * @return 返回唯一ID
35          */
36         @Override
37         public long getHeaderId(int i) {
38             Log.i("TAG","get Header ID "+i +" char at "+mCountries[i].subSequence(0, 1).charAt(0));
39             return mCountries[i].subSequence(0, 1).charAt(0);
40         }
41
42         @Override
43         public int getCount() {
44             return mCountries.length;
45         }
46
47         @Override
48         public Object getItem(int position) {
49             return mCountries[position];
50         }
51
52         @Override
53         public long getItemId(int position) {
54             return position;
55         }
56
57         @Override
58         public View getView(int position, View convertView, ViewGroup parent) {
59             Log.i("TAG","get View "+ position);
60             ViewHolder holder;
61
62             if (convertView == null) {
63                 holder = new ViewHolder();
64                 convertView = mInflater.inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
65                 holder.text = (TextView) convertView.findViewById(android.R.id.text1);
66                 convertView.setTag(holder);
67             } else {
68                 holder = (ViewHolder) convertView.getTag();
69             }
70
71             holder.text.setText(mCountries[position]);
72
73             return convertView;
74         }
75
76         class HeaderViewHolder {
77             TextView text;
78         }
79
80         class ViewHolder {
81             TextView text;
82         }
83     }

主要用此标记HeaderView的就是HeaderID,返回同一ID的将会显示为同一个Header

其他的使用与ListView相同。

时间: 2024-11-02 21:53:34

使用StickyListHeadersListView开源库的相关文章

开源库BaseRecyclerViewAdapterHelper

相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便,需要我们额外的编写代码,今天就给大家介绍一个开源库BaseRecyclerViewAdapterHelper,有了它让你使用RecyclerView的时候,和ListView一样的好用! 那么你要问了,BaseRecyclerViewAdapterHelper能做什么? 优化Adapter代码(减少

【计算机视觉】OpenCV的最近邻开源库FLANN

FLANN介绍 FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库.不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制. flann::Index_类 该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引. 以下是flann::Index_类的声明: template <typename T> class #ifndef _MSC_VER FLANN_DEPRECATED #e

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...

[转]http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行

在移动开发中常用的开源库总结

1.为什么需要开源库? 我个人觉得有以下几个原因: 1>我们的项目比较赶,但是又用到一些比较复杂的模块,这些模块不是系统自带的,或者说系统自带的满足不了需求,同时在一些开源网站上面又有类似的或者是满足我哦们需求的开源项目和库,拿来就可以减少我们很多的工作量. 2>开源库从另外一方面来说就是为了提高代码的重用性,大家使用了这个开源库,然后提交一些bug,通过大家的力量完善这个开源项目. 2.我常用的开源库? 我使用的一些开源项目主要都是在github上面很热门的项目: 图片加载:Android-

C++开源库,欢迎补充

C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又突然发力,搞出C#语言,有大片的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的生命力突然被 严重地增强了.主力原因就是开源的软件.基础软件(比如并发原生支持,比如Android必定要推出原生的SDK).各种跨平台应用的出现. 开源C++库必须具有以下特点:必须是成熟的产品.跨平台的产品.相对通用的库

C++开源库大全(转)

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库

android开源库发布到jcenter图文详解与填坑

相信很多人都用过开源项目,特别是android studio普及以后,使用开源库更方便简单.而如何上传开源库到jcenter供大家方便使用,虽然网上也有教程,但还是遇坑了,最后总结一下,希望可以帮助大家. [csdn地址: http://blog.csdn.net/zhangke3016/article/details/52075159] [本文简书地址: http://www.jianshu.com/p/0acf9e05b27e]同步更新 AndroidStudio是从Maven Reposi

iOS开发&gt;学无止境 - 异步图片加载优化与常用开源库分析

作者:罗轩(@luoyibu) 网址:http://www.jianshu.com/p/3b2c95e1404f 1. 网络图片显示大体步骤:   下载图片 图片处理(裁剪,边框等) 写入磁盘 从磁盘读取数据到内核缓冲区 从内核缓冲区复制到用户空间(内存级别拷贝) 解压缩为位图(耗cpu较高) 如果位图数据不是字节对齐的,CoreAnimation会copy一份位图数据并进行字节对齐 CoreAnimation渲染解压缩过的位图 以上4,5,6,7,8步是在UIImageView的setImag