PinnedHeaderExpandableListView
Introduction: 首先它是一个 ExpandableListView,但是它的头部可以固定,其次,在它的上面还有一个头部可以来回伸缩
AppsDemo: 百度手机卫士垃圾清理界面
Tags:
前言
Android 中,大家都用过 ListView,ExpandableListView 等,也许你还用过 PinnedHeaderListView,但是如果我说 PinnedHeaderExpandableListView,你听过吗?还有可下拉的 PinnedHeaderExpandableListView 呢?没听过也不要紧,本文就是介绍这个东西的,为了让大家有更直观的了解,先上效果图。通过效果图可以看出,首先它是一个 ExpandableListView,但是它的头部可以固定,其次,在它的上面还有一个头部可以来回伸缩,恩,这就是本文要介绍的自定义 view。为了提高复用性,这个效果我分成来了 2 个 view 来实现,第一个是 PinnedHeaderExpandableListView 来实现头部固定的 ExpandableListView,第二个 view 是 StickyLayout,这个 view 具有一个可以上下滑动的头部,最后将这 2 个 view 组合在一起,就达到了如下的效果。
接口
public interface OnHeaderUpdateListener {
/**
* 返回一个 view 对象即可
* 注意:view 必须要有 LayoutParams
*/
public View getPinnedHeader();
public void updatePinnedHeader(View headerView, int firstVisibleGroupPos);
}
public interface OnGiveUpTouchEventListener {
public boolean giveUpTouchEvent(MotionEvent event);
}
如何使用
让你的 activity 实现 OnHeaderUpdateListener, OnGiveUpTouchEventListener 两个接口, 分别为 PinnedHeaderExpandableListView 中如何绘制和更新固定的头部以及 StickyLayout 中 content 何时放弃事件处理。
@Override
public View getPinnedHeader() {
View headerView = (ViewGroup) getLayoutInflater().inflate(R.layout.group, null);
headerView.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
return headerView;
}
@Override
public void updatePinnedHeader(View headerView, int firstVisibleGroupPos) {
Group firstVisibleGroup = (Group) adapter.getGroup(firstVisibleGroupPos);
TextView textView = (TextView) headerView.findViewById(R.id.group);
textView.setText(firstVisibleGroup.getTitle());
}
@Override
public boolean giveUpTouchEvent(MotionEvent event) {
if (expandableListView.getFirstVisiblePosition() == 0) {
View view = expandableListView.getChildAt(0);
if (view != null && view.getTop() >= 0) {
return true;
}
}
return false;
}
许可协议
采用 MIT 共享协议发布
