实现到原理类似于之前到文章:
/** * @author douzifly * * @Date 2011-9-13 */ /** * 可固定标题的ExpandableListView * * @author douzifly * @date 2011-9-13 */ public class PinnedExpandableListView extends ExpandableListView implements _disibledevent=>
一般情况下,通过继承该类来使用,列表标题当前的状态(可见,不可见,正在推动)由Adapter来决定,所以Adapter里面的代码就相当重要了。以下是我的一个实现:
@Override public int getPinnedHeaderState(int groupPosition, int childPosition) { final int childCount = getChildrenCount(groupPosition); if(childPosition == childCount - 1){ return PINNED_HEADER_PUSHED_UP; }else if(childPosition == -1 && !BlockListView.this.isGroupExpanded(groupPosition)){ return PINNED_HEADER_GONE; }else { return PINNED_HEADER_VISIBLE; } } @Override public void configurePinnedHeader(View header, int groupPosition, int childPosition, int alpha) { TextView pinned = (TextView) header; pinned.setText((String)getGroup(groupPosition)); }
当然需要在子类初始化的地方加上对HeaderView的配置
txtPinned = new TextView(context); txtPinned.setTextSize(mGroupTextSize); txtPinned.setBackgroundResource(mGroupBgDrawableId); AbsListView.LayoutParams lp = new AbsListView.LayoutParams(-1, -2); txtPinned.setLayoutParams(lp); txtPinned.setTextColor(Color.WHITE); setPinnedHeaderView(txtPinned); setOnPinnedHeaderClickLisenter(new _disibledevent=>
这样,上图中的效果就实现了。 需要注意的就是HeaderView并没有加入到ExpandableListView的子控件中,所以要重写dispatchDraw函数,并在里面绘制HeaderView,这样导致一个问题就是直接在HeaderView上面设置的click监听函数无效,所以需要重写onTouchEvent来模拟在HeaderView上的OnClick事件。
最新评论