StickyListHeaders 的使用说明(带按字母顺序排列的索引栏)
最编程
2024-04-06 08:38:22
...
有些同学可能没用过这个SckyListHeadersListView 先发个效果图,图片是从别的地方拷贝过来的
网络异常,图片无法展示
|
以下的几个类 直接拷贝到项目中 备用。
import java.lang.reflect.Field; import java.util.ArrayList; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SectionIndexer; /** * @author Emil Sjölander */ public class StickyListHeadersListView extends ListView { public interface OnHeaderClickListener { public void onHeaderClick(StickyListHeadersListView l, View header, int itemPosition, long headerId, boolean currentlySticky); } public OnScrollListener mOnScrollListenerDelegate; private boolean mAreHeadersSticky = true; //header是否停留 private int mHeaderBottomPosition; private View mHeader; private int mDividerHeight; private Drawable mDivider; private Boolean mClippingToPadding; private final Rect mClippingRect = new Rect(); private Long mCurrentHeaderId = null; public AdapterWrapper mAdapter; private float mHeaderDownY = -1; private boolean mHeaderBeingPressed = false; private OnHeaderClickListener mOnHeaderClickListener; private Integer mHeaderPosition; private ViewConfiguration mViewConfig; private ArrayList<View> mFooterViews; private boolean mDrawingListUnderStickyHeader = false; private Rect mSelectorRect = new Rect();// for if reflection fails private Field mSelectorPositionField; private AdapterWrapper.OnHeaderClickListener mAdapterHeaderClickListener = new AdapterWrapper.OnHeaderClickListener() { @Override public void onHeaderClick(View header, int itemPosition, long headerId) { if (mOnHeaderClickListener != null) { mOnHeaderClickListener.onHeaderClick( StickyListHeadersListView.this, header, itemPosition, headerId, false); } } }; private DataSetObserver mDataSetChangedObserver = new DataSetObserver() { @Override public void onChanged() { reset(); } @Override public void onInvalidated() { reset(); } }; /** * */ public interface OnLoadingMoreLinstener { /** */ void OnLoadingMore(); } public OnLoadingMoreLinstener loadMoreListener; public void setLoadingMoreListener(OnLoadingMoreLinstener listener) { this.loadMoreListener = listener; } public OnScrollListener mOnScrollListener = new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Log.e("parent","onScrollStateChanged"); if (mOnScrollListenerDelegate != null) { mOnScrollListenerDelegate.onScrollStateChanged(view, scrollState); } if (scrollState == OnScrollListener.SCROLL_STATE_FLING) { } else if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL || scrollState == OnScrollListener.SCROLL_STATE_IDLE) { if (getLastVisiblePosition() == (getCount() - 1)) { if(loadMoreListener != null) { loadMoreListener.OnLoadingMore(); } } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.e("parent","onScroll"); if (mOnScrollListenerDelegate != null) { mOnScrollListenerDelegate.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { scrollChanged(firstVisibleItem); } } }; public StickyListHeadersListView(Context context) { this(context, null); } public StickyListHeadersListView(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.listViewStyle); } public StickyListHeadersListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); super.setOnScrollListener(mOnScrollListener); // null out divider, dividers are handled by adapter so they look good // with headers super.setDivider(null); super.setDividerHeight(0); mViewConfig = ViewConfiguration.get(context); if (mClippingToPadding == null) { mClippingToPadding = true; } try { Field selectorRectField = AbsListView.class .getDeclaredField("mSelectorRect"); selectorRectField.setAccessible(true); mSelectorRect = (Rect) selectorRectField.get(this); mSelectorPositionField = AbsListView.class .getDeclaredField("mSelectorPosition"); mSelectorPositionField.setAccessible(true); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (changed) { reset(); scrollChanged(getFirstVisiblePosition()); } } private void reset() { mHeader = null; mCurrentHeaderId = null; mHeaderPosition = null; mHeaderBottomPosition = -1; } @Override public boolean performItemClick(View view, int position, long id) { if (view instanceof WrapperView) { view = ((WrapperView) view).mItem; } return super.performItemClick(view, position, id); } @Override public void setDivider(Drawable divider) { this.mDivider = divider;
下一篇: 国内银行 CNAPS 代码查询