listview的分组挤压效果实现
来源:互联网 发布:snagit是什么软件 编辑:程序博客网 时间:2024/04/28 05:40
1适配器实现SectionIndexer接口
@Override public Object[] getSections() { return new Object[0]; }//此方法是通过字母的Ascii码,与集合里的元素拼音的首字母的Ascii码做比较,返回第一个相同的索引位置(即分组位置) @Override public int getPositionForSection(int sectionIndex) { for (int i = 0; i < friends.size(); i++) { if (sectionIndex == friends.get(i).pinyin.toUpperCase().charAt(0)) { return i; } } return 0; }//此方法是通过索引位置,获取到此索引所属的分组字母 @Override public int getSectionForPosition(int position) { return friends.get(position).pinyin.toUpperCase().charAt(0); }
2在XML文件里放置一个伪item,遮挡住listview的第一个item,它用来做碰撞位移
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" > <ListView android:id="@+id/listview_main" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> <LinearLayout android:id="@+id/title_layout" android:layout_width="fill_parent" android:layout_height="30dp" android:layout_gravity="right|top" android:background="#ff303030" android:orientation="vertical" > <TextView android:id="@+id/title_layout_catalog" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="22sp" android:textColor="@android:color/white" android:background="@android:color/holo_green_light" android:gravity="center" /> </LinearLayout> <com.explam.slidelayoutdemo.QuickIndexBar android:id="@+id/quick_index" android:background="#f00" android:layout_width="30dp" android:layout_height="match_parent" android:layout_alignParentRight="true"/> <TextView android:id="@+id/tv_letter" android:visibility="invisible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/quick_index" /></RelativeLayout>
3在代码里设置listview的滚动监听,通过firstVisibleItem去判断所属分类,当(firstVisibleItem + 1 == nextSectionPosition)第一个可见条目的下一个item与判断出来的下一个分类的位置相同的时候,就要开始进行碰撞效果实现 //设置滚动监听,去实现挤压效果 mLv_main.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //通过第一个可见条目索引拿到这个位置的Ascii码,即字母A的Ascii码 int section = adapter.getSectionForPosition(firstVisibleItem); //获取第二个可见条目位置的Ascii码,可能是A,也可能是其他 int nextSection = adapter.getSectionForPosition(firstVisibleItem + 1); //通过第二个可见条目的Ascci码,拿到它的字母的位置 int nextSectionPosition = adapter.getPositionForSection(nextSection); System.out.println("next:"+(+nextSection)); float titleY = view.getY();//获取listview在容器里的Y坐标(其实就是0) //如果上次记录的可见条目索引不等于现在的滚动到的可见条目索引 if (lastVisibleIndex != firstVisibleItem) { //就将固定在顶部的伪item布局的文本设置为当前可见条目的分类名 mTitle.setText((char) section + ""); } //如果当前可见条目的下一个条目就是下一个分组字母的位置 if (firstVisibleItem + 1 == nextSectionPosition) { View firstView = view.getChildAt(0);//获取listview当前显示的第一个孩子 int bottom = firstView.getBottom();//得到第一个孩子当前的底部bottom int titleLayoutHeight = titleLayout.getHeight(); //如果bottom小于伪item的容器高度,说明要开始进行挤压碰撞了 if (bottom < titleLayoutHeight) { //求出差值,即需要设置给伪容器的y坐标,实现碰撞效果 titleY = bottom - titleLayoutHeight; } } //未满足上面的条件,就将伪容器的y坐标设置的和listview一样,满足了就设置计算的值 titleLayout.setY(titleY); lastVisibleIndex = firstVisibleItem; } });
0 0
- listview的分组挤压效果实现
- 联系人分组及分组标题挤压效果
- Android ListView 分组效果实现
- ListView分组导航+挤压动画(一)
- ListView分组导航+挤压动画(二)
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果(一)
- Android 仿联系人列表 实现ListView的A-Z字母排序和过滤搜索功能,并挤压效果
- ListView的分组实现
- ListView的分组实现
- ListView的分组实现
- 实现分组效果的
- Android ListView的A-Z字母排序、分组导航、挤压动画
- ReactNative实现ListView分组,悬浮效果
- Android抽屉效果的实现(不挤压,不覆盖)
- 自定义挤压头部的listview
- 强大的分组SectionListView, 支持自定义组头布局和分组的内容布局, 组头有挤压效果
- 强大的分组SectionListView, 支持自定义组头布局和分组的内容布局, 组头有挤压效果
- Android Listview的分组实现
- CENTOS: 把TOMCAT的8080端口换成80
- HDU5385 The path (构造最短路 BFS)
- swift地图定位(十四)使用 MKAnnotationView自定义大头针视图
- java-程序运行时间检测实例-字符串叠加与两个变量交换数据
- 存储系统_FAT文件系统
- listview的分组挤压效果实现
- /etc/bashrc和/etc/profile区别
- 研究-测试-报告_谁动了我的电池电量
- 搭建Android持续构建和自动化测试平台
- mac 下更新 .bash_profile 文件
- 第八章 复习题
- c#学习笔记之十二 使用interface和使用virtual-new的区别
- c# 面向对象的语言
- Python 朴素贝叶斯(Naive Bayes)分类