自定义挤压头部的listview

来源:互联网 发布:常州seo 编辑:程序博客网 时间:2024/04/27 22:52
package com.handcar.view;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.View;import android.widget.ListAdapter;import android.widget.ListView;/** * 自定义挤压头部的listview *  * @author blue *  */public class PinnedHeaderListView extends ListView{public interface PinnedHeaderAdapter{public static final int PINNED_HEADER_GONE = 0;public static final int PINNED_HEADER_VISIBLE = 1;public static final int PINNED_HEADER_PUSHED_UP = 2;int getPinnedHeaderState(int position);void configurePinnedHeader(View header, int position, int alpha);}private static final int MAX_ALPHA = 255;private PinnedHeaderAdapter mAdapter;private View mHeaderView;private boolean mHeaderViewVisible;private int mHeaderViewWidth;private int mHeaderViewHeight;public PinnedHeaderListView(Context context){super(context);}public PinnedHeaderListView(Context context, AttributeSet attrs){super(context, attrs);}public PinnedHeaderListView(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);}protected void onLayout(boolean changed, int left, int top, int right, int bottom){super.onLayout(changed, left, top, right, bottom);if (mHeaderView != null){mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);configureHeaderView(getFirstVisiblePosition());}}protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (mHeaderView != null){measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec);mHeaderViewWidth = mHeaderView.getMeasuredWidth();mHeaderViewHeight = mHeaderView.getMeasuredHeight();}}public void setPinnedHeaderView(View view){mHeaderView = view;if (mHeaderView != null){setFadingEdgeLength(0);}requestLayout();}public void setAdapter(ListAdapter adapter){super.setAdapter(adapter);mAdapter = (PinnedHeaderAdapter) adapter;}public void configureHeaderView(int position){if (mHeaderView == null){return;}int state = mAdapter.getPinnedHeaderState(position);switch (state){case PinnedHeaderAdapter.PINNED_HEADER_GONE:{mHeaderViewVisible = false;break;}case PinnedHeaderAdapter.PINNED_HEADER_VISIBLE:{mAdapter.configurePinnedHeader(mHeaderView, position, MAX_ALPHA);if (mHeaderView.getTop() != 0){mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight);}mHeaderViewVisible = true;break;}case PinnedHeaderAdapter.PINNED_HEADER_PUSHED_UP:{View firstView = getChildAt(0);            if(firstView == null){                return;            }int bottom = firstView.getBottom();int headerHeight = mHeaderView.getHeight();int y;int alpha;if (bottom < headerHeight){y = (bottom - headerHeight);alpha = MAX_ALPHA * (headerHeight + y) / headerHeight;} else{y = 0;alpha = MAX_ALPHA;}mAdapter.configurePinnedHeader(mHeaderView, position, alpha);if (mHeaderView.getTop() != y){mHeaderView.layout(0, y, mHeaderViewWidth, mHeaderViewHeight + y);}mHeaderViewVisible = true;break;}}}protected void dispatchDraw(Canvas canvas){super.dispatchDraw(canvas);if (mHeaderViewVisible){drawChild(canvas, mHeaderView, getDrawingTime());}}}







0 0
原创粉丝点击