前不久注意到iOS上面的ListView都是自带悬停小标题的功能,希望在Android上面也可以实现,但是发现现有的下拉刷新框架没有这方面的实现,因此自己尝试着添加进去。
这里面的PinnedSectionListView类是修改从网络上下载的非常优秀的代码而来的。
原始github地址为:https://github.com/beworker/pinned-section-listview
我这里也实现了将它们有机的融合在一起的功能,但是由于原始框架的上拉加载动画的问题,我们没有相应的上拉加载动画。
那么这个是怎么实现的呢?
- 复制PullToRefreshListView类,重命名为PullToRefreshPinnedSectionListView,这是我们将要修改的类;
- 添加静态公共变量,ITEM和SECTION,用于标识是section还是普通的item;
/** 是普通的item */
public static final int ITEM = 0;
/** pinned的视图 */
public static final int SECTION = 1;
3.改变其中的createListView这个方法,让它返回我们的类PullToRefreshPinnedSectionListView;
protected PinnedSectionListView createListView(Context context, AttributeSet attrs) {
final PinnedSectionListView lv;
if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {
lv = new InternalPinnedListViewSDK9(context, attrs);
} else {
lv = new PinnedSectionListView(context, attrs);
}
return lv;
}
4.现在问题来了,我们需要模仿原始的PullToRefreshListView中来写符合接口要求的类,因此我们也改写我们的PinnedSectionListView类,来符合要求,首先实现接口EmptyViewMethodAccessor
主要是这两个方法:
5.仔细查看PullToRefreshListView源文件就会发现,它的InternalListView是内部类,可以很方便地实现addFooterView,而我们不是内部类,所以我将它定义为成员变量:
6.这里的setFooterFramelayout方法就是PinnedSectionListView类中的公共方法
这个图中注释掉的方法也可以放在setAdapter中(至少写一次)
7.最后,在PullToRefreshPinnedSectionListView类中,修改InternalPinnedListViewSDK9继承PinnedSectionListView就可以了。
使用方法:
我们是在PullToRefreshPinnedListActivity类中使用的,为了保持良好的统一性,我在这个类中直接定义了静态Adapter,这个adapter只需要实现PinnedSectionListAdapter接口,并且重写getViewTypeCount和getItemViewType这两个方法就可以了。
至此,我们就可以使用下拉刷新的悬浮ListView了。
对应的源码:http://download.youkuaiyun.com/detail/fengyangxiada/8919789