package se.emilsjolander.stickylistheaders;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.SectionIndexer;
import se.emilsjolander.stickylistheaders.WrapperViewList.LifeCycleListener;
import se.emilsjolander.stickylistheaders.sample.R;
/**
* Even though this is a FrameLayout subclass we it is called a ListView. This
* is because of 2 reasons. 1. It acts like as ListView 2. It used to be a
* ListView subclass and i did not was to change to name causing compatibility
* errors.
*
* @author Emil Sjölander
*/
public class StickyListHeadersListView extends FrameLayout {
public interface OnHeaderClickListener {
void onHeaderClick(StickyListHeadersListView l, View header,
int itemPosition, long headerId, boolean currentlySticky);
}
/**
* Notifies the listener when the sticky headers top offset has changed.
*/
public interface OnStickyHeaderOffsetChangedListener {
/**
* @param l The view parent
* @param header The currently sticky header being offset.
* This header is not guaranteed to have it's measurements set.
* It is however guaranteed that this view has been measured,
* therefor you should user getMeasured* methods instead of
* get* methods for determining the view's size.
* @param offset The amount the sticky header is offset by towards to top of the screen.
*/
void onStickyHeaderOffsetChanged(StickyListHeadersListView l, View header, int offset);
}
/**
* Notifies the listener when the sticky header has been updated
*/
public interface OnStickyHeaderChangedListener {
/**
* @param l The view parent
* @param header The new sticky header view.
* @param itemPosition The position of the item within the adapter's data set of
* the item whose header is now sticky.
* @param headerId The id of the new sticky header.
*/
void onStickyHeaderChanged(StickyListHeadersListView l, View header,
int itemPosition, long headerId);
}
/* --- Children --- */
private WrapperViewList mList;
private View mHeader;
/* --- Header state --- */
private Long mHeaderId;
// used to not have to call getHeaderId() all the time
private Integer mHeaderPosition;
private Integer mHeaderOffset;
/* --- Delegates --- */
private OnScrollListener mOnScrollListenerDelegate;
private AdapterWrapper mAdapter;
/* --- Settings --- */
private boolean mAreHeadersSticky = true;
private boolean mClippingToPadding = true;
private boolean mIsDrawingListUnderStickyHeader = true;
private int mPaddingLeft = 0;
private int mPaddingTop = 0;
private int mPaddingRight = 0;
private int mPaddingBottom = 0;
/* --- Other --- */
private OnHeaderClickListener mOnHeaderClickListener;
private OnStickyHeaderOffsetChangedListener mOnStickyHeaderOffsetChangedListener;
private OnStickyHeaderChangedListener mOnStickyHeaderChangedListener;
private AdapterWrapperDataSetObserver mDataSetObserver;
private Drawable mDivider;
private int mDividerHeight;
public StickyListHeadersListView(Context context) {
this(context, null);
}
public StickyListHeadersListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public StickyListHeadersListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// Initialize the wrapped list
mList = new WrapperViewList(context);
// null out divider, dividers are handled by adapter so they look good with headers
mDivider = mList.getDivider();
mDividerHeight = mList.getDividerHeight();
mList.setDivider(null);
mList.setDividerHeight(0);
if (attrs != null) {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,R.styleable.StickyListHeadersListView, 0, 0);
try {
// -- View attributes --
int padding = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_padding, 0);
mPaddingLeft = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingLeft, padding);
mPaddingTop = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingTop, padding);
mPaddingRight = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingRight, padding);
mPaddingBottom = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingBottom, padding);
setPadding(mPaddingLeft, mPaddingTop, mPaddingRight,
mPaddingBottom);
// Set clip to padding on the list and reset value to default on
// wrapper
mClippingToPadding = a.getBoolean(R.styleable.StickyListHeadersListView_android_clipToPadding, true);
super.setClipToPadding(true);
mList.setClipToPadding(mClippingToPadding);
// scrollbars
final int scrollBars = a.getInt(R.styleable.StickyListHeadersListView_android_scrollbars, 0x00000200);
mList.setVerticalScrollBarEnabled((scrollBars & 0x00000200) != 0);
mList.setHorizontalScrollBarEnabled((scrollBars & 0x00000100) != 0);
// overscroll
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
mList.setOverScrollMode(a.getInt(R.styleable.StickyListHeadersListView_android_overScrollMode, 0));
}
// -- ListView attributes --
mList.setFadingEdgeLength(a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_fadingEdgeLength,
mList.getVerticalFadingEdgeLength()));
final int fadingEdge = a.getInt(R.styleable.StickyListHeadersListView_android_requiresFadingEdge, 0);
if (fadingEdge == 0x00001000) {
mList.setVerticalFadingEdgeEnabled(false);
mList.setHorizontalFadingEdgeEnabled(true);
} else if (fadingEdge == 0x00002000) {
mList.setVerticalFadingEdgeEnabled(true);
mList.setHorizontalFadingEdgeEnabled(false);
} else {
mList.setVerticalFadingEdgeEnabled(false);
mList.setHorizontalFadingEdgeEnabled(false);
}
mList.setCacheColorHint(a
.getColor(R.styleable.StickyListHeadersListView_android_cacheColorHint, mList.getCacheColorHint()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mList.setChoiceMode(a.getInt(R.styleable.StickyListHeadersListView_android_choiceMode,
mList.getChoiceMode()));
没有合适的资源?快使用搜索试试~ 我知道了~
android StickyHeaderListView 分组listview,标题停靠
共84个文件
class:39个
xml:14个
java:12个
5星 · 超过95%的资源 需积分: 0 247 下载量 145 浏览量
2015-06-11
10:57:43
上传
评论
收藏 1.43MB RAR 举报
温馨提示
android StickyHeaderListView 分组listview,标题停靠
资源推荐
资源详情
资源评论
收起资源包目录
StickyHeaderListView.rar (84个子文件)
TestActivity
bin
classes.dex 745KB
res
crunch
drawable-ldpi
ic_launcher.png 3KB
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
ic_launcher.png 14KB
drawable-mdpi
ic_launcher.png 5KB
jarlist.cache 120B
dexedLibs
android-support-v4-1a7df6e2ca8e490e4a455687f52efab5.jar 236KB
classes
se
emilsjolander
stickylistheaders
StickyListHeadersListView$OnStickyHeaderOffsetChangedListener.class 463B
StickyListHeadersListView$2.class 1KB
sample
TestActivity$1$1.class 1KB
BuildConfig.class 391B
TestActivity$1.class 1KB
R$layout.class 608B
TestBaseAdapter$HeaderViewHolder.class 703B
R$id.class 635B
R$drawable.class 515B
TestBaseAdapter.class 5KB
R$attr.class 523B
R$menu.class 466B
R.class 1KB
R$array.class 465B
R$styleable.class 2KB
views
UnderlineTextView.class 2KB
R$string.class 556B
TestBaseAdapter$ViewHolder.class 685B
R$color.class 550B
TestActivity.class 7KB
R$style.class 473B
WrapperViewList$LifeCycleListener.class 335B
StickyListHeadersListView.class 29KB
StickyListHeadersListView$OnHeaderClickListener.class 423B
SectionIndexerAdapterWrapper.class 1KB
WrapperView.class 4KB
AdapterWrapper$2.class 2KB
StickyListHeadersListView$OnStickyHeaderChangedListener.class 446B
AdapterWrapper.class 7KB
StickyListHeadersListView$AdapterWrapperDataSetObserver.class 1KB
CheckableWrapperView.class 904B
WrapperViewList.class 5KB
StickyListHeadersListView$AdapterWrapperHeaderClickHandler.class 2KB
StickyListHeadersListView$WrapperViewListLifeCycleListener.class 2KB
AdapterWrapper$OnHeaderClickListener.class 327B
StickyListHeadersListView$1.class 2KB
AdapterWrapper$1.class 971B
StickyListHeadersListView$WrapperListScrollListener.class 2KB
StickyListHeadersAdapter.class 319B
resources.ap_ 46KB
TestActivity.apk 301KB
AndroidManifest.xml 809B
res
drawable-ldpi
ic_launcher.png 3KB
menu
activity_menu.xml 253B
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
ic_launcher.png 14KB
drawable
header_selector.xml 263B
values
colors.xml 183B
strings.xml 216B
attrs.xml 1KB
arrays.xml 6KB
styles.xml 337B
drawable-mdpi
ic_launcher.png 5KB
layout
header.xml 679B
test_list_item_layout.xml 326B
list_footer.xml 407B
list_header.xml 407B
main.xml 1KB
assets
gen
se
emilsjolander
stickylistheaders
sample
BuildConfig.java 183B
R.java 17KB
.settings
org.eclipse.jdt.core.prefs 177B
src
se
emilsjolander
stickylistheaders
StickyListHeadersAdapter.java 1KB
SectionIndexerAdapterWrapper.java 786B
WrapperView.java 4KB
StickyListHeadersListView.java 37KB
sample
views
UnderlineTextView.java 1KB
TestBaseAdapter.java 4KB
TestActivity.java 4KB
CheckableWrapperView.java 616B
WrapperViewList.java 5KB
AdapterWrapper.java 6KB
.project 848B
.classpath 557B
project.properties 563B
AndroidManifest.xml 809B
build.gradle 454B
libs
android-support-v4.jar 633KB
共 84 条
- 1
资源评论
- 记录美好生活2016-11-24可以运行,谢谢分享。
- Android_Gone2015-11-30不错很有用。。。
zjgwxh
- 粉丝: 9
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功