在手机自带的通讯录中,我们会发现联系人被分组,按首字母索引排列,当列表向上滑动时,分组的标题栏会悬浮在列表顶部。
常用的一些app如美团的选择城市,也是使用的这种效果。
效果图如下。
关于这个效果,实现的方式有多种,这里使用PinnedHeaderListView实现固定头部的列表。
实现步骤:
(1).PinnedHeaderListView的实现
首先是PinnedHeaderAdapter接口
该接口定义了三个常量和两个方法,ListView的Adapter需要去实现该接口。接口代码如下。
其次是PinnedHeaderListView类
PinnedHeaderListView扩展自ListView,重点在于重写dispatchDraw()、onMeasure()、onLayout()方法。
在dispatchDraw方法中,绘制HeaderView。
在onMeasure()方法中,测量HeaderView的宽和高,并赋值给成员变量。
常用的一些app如美团的选择城市,也是使用的这种效果。
效果图如下。
关于这个效果,实现的方式有多种,这里使用PinnedHeaderListView实现固定头部的列表。
实现步骤:
(1).PinnedHeaderListView的实现
首先是PinnedHeaderAdapter接口
该接口定义了三个常量和两个方法,ListView的Adapter需要去实现该接口。接口代码如下。
public interface PinnedHeaderAdapter {
// Header View状态:不显示
int PINNED_HEADER_GONE = 0;
// Header View状态:显示在ListView顶部
int PINNED_HEADER_VISIBLE = 1;
// Header View状态:向上推出
int PINNED_HEADER_PUSHED_UP = 2;
// 根据当前listview中显示的首个item的位置,计算Header View的状态
// 该方法只能返回PINNED_HEADER_GONE、PINNED_HEADER_VISIBLE、PINNED_HEADER_PUSHED_UP
int getPinnedHeaderState(int position);
// 根据当前listview中显示的首个item的位置,来配置Header View
// 该项目中,主要是用来更新Header View显示的字母
void configurePinnedHeader(View header, int position, int alpha);
}
其次是PinnedHeaderListView类
PinnedHeaderListView扩展自ListView,重点在于重写dispatchDraw()、onMeasure()、onLayout()方法。
在dispatchDraw方法中,绘制HeaderView。
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mHeaderViewVisible) {
drawChild(canvas, mHeaderView, getDrawingTime());
}
}
在onMeasure()方法中,测量HeaderView的宽和高,并赋值给成员变量。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mHeaderView != null) {
measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);
mHeaderViewWidth = mHeaderView.getMeasuredWidth();
mHeaderViewHeight