欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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;