最近在做分组列表,头部悬停的效果,在github上就搜到了StickyListHeaders(https://github.com/emilsjolander/StickyListHeaders)这个库,自己动手实现了一个demo,实际效果图见文末。

引用类库:

implementation 'se.emilsjolander:stickylistheaders:2.7.0'

子布局item_pay_bill_month_body_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:id="@+id/item_body_tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="内容"
android:textSize="20sp" /> <TextView
android:id="@+id/item_body_tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="内容"
android:textSize="20sp" /> <TextView
android:id="@+id/item_body_tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="内容"
android:textSize="20sp" /> <TextView
android:id="@+id/item_body_tv4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="内容"
android:textSize="20sp" /> <TextView
android:id="@+id/item_body_tv5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="内容"
android:textSize="20sp" /> </LinearLayout>

头部布局item_pay_bill_month_header_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <TextView
android:id="@+id/item_head_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f00"
android:text="头部"
android:textSize="30sp" />
</LinearLayout>

列表适配器PayBillMonthListAdapter.java:

package com.aldx.hccraftsman.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; import com.aldx.hccraftsman.R;
import com.aldx.hccraftsman.model.PayBillMonth; import java.util.ArrayList;
import java.util.List; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; /**
* author: chenzheng
* created on: 2018/11/3 11:24
* description:
*/
public class PayBillMonthListAdapter extends BaseAdapter implements StickyListHeadersAdapter { private Context context;
private List<PayBillMonth> monthList = new ArrayList<>(); public PayBillMonthListAdapter(Context context) {
this.context = context;
} public void setItems(List<PayBillMonth> monthList) {
this.monthList = monthList;
notifyDataSetChanged();
} //设置数据的个数
@Override
public int getCount() {
return monthList.size();
} //设置item的条数
@Override
public Object getItem(int i) {
return monthList.get(i);
} //获得相应数据集合中特定位置的数据项
@Override
public long getItemId(int i) {
return i;
} //获得头部相应数据集合中特定位置的数据项
@Override
public long getHeaderId(int position) {
return monthList.get(position).yearmonth;
} //绑定内容的数据
@Override
public View getView(int i, View view, ViewGroup viewGroup) { BodyHolder bodyHolder = null;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.item_pay_bill_month_body_list, viewGroup, false);
bodyHolder = new BodyHolder(view);
view.setTag(bodyHolder);
} else {
bodyHolder = (BodyHolder) view.getTag();
}
//设置数据
bodyHolder.bodyTv.setText(monthList.get(i).name); return view;
} //绑定头部的数据
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) { HeadHolder headHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_pay_bill_month_header_list, parent, false);
headHolder = new HeadHolder(convertView);
convertView.setTag(headHolder);
} else {
headHolder = (HeadHolder) convertView.getTag();
}
//设置数据
headHolder.headTv.setText(monthList.get(position).monthName); return convertView;
} //头部的内部类
class HeadHolder {
private TextView headTv; public HeadHolder(View itemHeadView) { headTv = (TextView) itemHeadView.findViewById(R.id.item_head_tv);
}
} //内容的内部类
class BodyHolder {
private TextView bodyTv; public BodyHolder(View itemBodyView) { bodyTv = (TextView) itemBodyView.findViewById(R.id.item_body_tv1);
}
} }

 PayBillMonthListActivity.java:

package com.aldx.hccraftsman.activity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import com.aldx.hccraftsman.R;
import com.aldx.hccraftsman.adapter.PayBillMonthListAdapter;
import com.aldx.hccraftsman.model.PayBillMonth; import java.util.ArrayList;
import java.util.List; import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView; /**
* author: chenzheng
* created on: 2018/11/3 14:36
* description: 月度账单
*/
public class PayBillMonthListActivity extends BaseActivity { @BindView(R.id.back_iv)
ImageView backIv;
@BindView(R.id.layout_back)
LinearLayout layoutBack;
@BindView(R.id.title_tv)
TextView titleTv;
@BindView(R.id.right_tv)
TextView rightTv;
@BindView(R.id.layout_right)
LinearLayout layoutRight;
@BindView(R.id.stickyListView)
StickyListHeadersListView stickyListView; private String companyId;
private List<PayBillMonth> list = new ArrayList<>();
private PayBillMonthListAdapter payBillMonthListAdapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pay_bill_month_list);
companyId = getIntent().getStringExtra("companyId");
ButterKnife.bind(this); initView();
initData();
} private void initData() {
for (int i = 0; i < 10; i++) {
PayBillMonth p1 = new PayBillMonth();
p1.yearmonth = 201811;
p1.monthName = "2018年11月";
p1.name = "詹大三" + i;
list.add(p1);
}
for (int i = 0; i < 7; i++) {
PayBillMonth p1 = new PayBillMonth();
p1.yearmonth = 201810;
p1.monthName = "2018年10月";
p1.name = "刘丽丽" + i;
list.add(p1);
}
for (int i = 0; i < 2; i++) {
PayBillMonth p1 = new PayBillMonth();
p1.yearmonth = 201809;
p1.monthName = "2018年09月";
p1.name = "姜大成" + i;
list.add(p1);
}
payBillMonthListAdapter.setItems(list);
} private void initView() {
titleTv.setText("月度账单"); payBillMonthListAdapter = new PayBillMonthListAdapter(this);
stickyListView.setAdapter(payBillMonthListAdapter); } @OnClick({R.id.layout_back, R.id.layout_right})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.layout_back:
finish();
break;
case R.id.layout_right:
break;
}
} public static void startActivity(Context context, String companyId) {
Intent intent = new Intent(context, PayBillMonthListActivity.class);
intent.putExtra("companyId", companyId);
context.startActivity(intent);
}
}

页面布局activity_pay_bill_month_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <include
android:id="@+id/include_id"
layout="@layout/titlelayout_theme"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <se.emilsjolander.stickylistheaders.StickyListHeadersListView
android:id="@+id/stickyListView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

 实体类PayBillMonth:

package com.aldx.hccraftsman.model;

/**
* author: chenzheng
* created on: 2018/11/3 14:18
* description:
*/
public class PayBillMonth { public long yearmonth;
public String monthName;
public String name;
public String money;
public String time;
}

效果图:

Android StickyListHeadersListView头部悬停 分组列表实现的更多相关文章

  1. Android ExpandableListView BaseExpandableListAdapter (类似QQ分组列表)

    分组列表视图(ExpandableListView) 和ListView不同的是它是一个两级的滚动列表视图,每一个组可以展开,显示一些子项,类似于QQ列表,这些项目来至于ExpandableListA ...

  2. 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  3. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  4. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  5. [WP8.1UI控件编程]SemanticZoom控件实现分组列表

    11.1.5 SemanticZoom实现分组列表 SemanticZoom控件可以让用户实现一种更加高级的列表,这种列表可以对列表的项目进行分组,同时这个SemanticZoom控件会提供两个具有相 ...

  6. Android Studio鼠标悬停显示注释

    Android Studio鼠标悬停显示注释 在AS中配置 如果你想从网上查看注释,到这一步就操作完成. 下面说明让软件使用本地注释: 使用本地注释 以Windows为例: 找到下面文件 C:\Use ...

  7. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  8. Android水平(横向)翻页列表,类似水平GridVIew

    Android水平(横向)翻页列表,类似于水平方向的GridView,行列自定义,但要翻页切换,考虑加载性能,当Item数据很多时加载和翻页要流畅,翻页时要有动画效果,效果图如下: 实现方式: 1:翻 ...

  9. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

随机推荐

  1. Comet OJ Contest #13 简要题解

    C2 首先用并查集维护\(1\)的连通块,然后用另外一个并查集维护第\(i\)行中,第\(j\)列之后的第一个\(0\)的位置,就是如果当前位置是\(1\)那么它的父亲是它右边的格子,否则是它自己. ...

  2. C# 使用配置文件配置应用

    使用配置文件配置应用 .NET Framework 通过配置文件为开发人员和管理员提供了对应应用程序运行方式的控制权和灵活性.配置文件可以按需要更改的XML文件.管理员能够控制应用程序可以访问哪些受保 ...

  3. 在linux中设置优先使用ipv4,而不是ipv6

    背景: 有时候更新源的时候默认使用ipv6,而ipv6下载数据时候总出现问题. 所有想默认出口的时候优先使用ipv4出口访问,而不是ipv6. 要使用ipv4 连接优先而不必禁用ipv6,需要修改ga ...

  4. 【洛谷】P2261 [CQOI2007]余数求和

    题面?? 点我获得题面QAQ 我这个咕儿终于在csp初赛前夕开始学习数论了! 我是绝对不会承认之前不学数学是因为去年刚开始学OI的时候就跟yyq他们学莫比乌斯反演然后自闭的 分析 对于k mod i, ...

  5. 像母语者一样说美语 How to Improve Spoken American English - Sound like a Native Speaker

    视频讲解: 视频详情见:https://www.bilibili.com/video/av75075387/ 总结分析: 001 要点总结: 1. 本富兰克林方法: 要你写下一切听到的东西 2. 辅音 ...

  6. lnmp一键安装包 多PHP版本使用教程

    ./install.sh mphp 多PHP版本只支持LNMP模式,LNMPA.LAMP模式下不支持!要使用多PHP先安装多PHP版本,在lnmp1.4源码目录下运行:./install.sh mph ...

  7. 使用HttpClient访问WebHook

    代码: import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.c ...

  8. 004 DOM01

    一:说明 1.Js的三个部分 ECMAScripts标准:JS的基本语法 DOM:文档对象模型,操作页面的元素的 BOM:浏览器对象模型,操作浏览器 2.术语 文档:一个页面就是一个文档 元素:页面中 ...

  9. Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas

    Arthas 用户文档 — Arthas 3.1.0 文档https://alibaba.github.io/arthas/ alibaba/arthas: Alibaba Java Diagnost ...

  10. Python3基础 global 在函数内部对全局变量进行修改

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...