diff --git a/library/res/values/attrs.xml b/library/res/values/attrs.xml index a626288f..afbd3563 100644 --- a/library/res/values/attrs.xml +++ b/library/res/values/attrs.xml @@ -2,27 +2,11 @@ - + - - - - - - - - - - - - - - - - diff --git a/library/src/se/emilsjolander/stickylistheaders/StickyListHeadersListView.java b/library/src/se/emilsjolander/stickylistheaders/StickyListHeadersListView.java index 5aec3756..5ffe670f 100644 --- a/library/src/se/emilsjolander/stickylistheaders/StickyListHeadersListView.java +++ b/library/src/se/emilsjolander/stickylistheaders/StickyListHeadersListView.java @@ -95,99 +95,61 @@ public StickyListHeadersListView(Context context, AttributeSet attrs) { public StickyListHeadersListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - // Initialize the list + // Initialize the wrapped list mList = new WrapperViewList(context); - mDivider = mList.getDivider(); - mDividerHeight = mList.getDividerHeight(); - // null out divider, dividers are handled by adapter so they look good - // with headers + // null out divider, dividers are handled by adapter so they look good with headers mList.setDivider(null); mList.setDividerHeight(0); - mList.setLifeCycleListener(new WrapperViewListLifeCycleListener()); - mList.setOnScrollListener(new WrapperListScrollListener()); - addView(mList); + // create a temporary ListView that is used to parse the attributes. + // this will ensure default parsing behaviour of ListView styles while + // still ensuring control over what attributes can be styled. + // don't pass defStyle to this list as it belongs to a frame layout. + ListView attrsList = new ListView(context, attrs); + + mDivider = attrsList.getDivider(); + mDividerHeight = attrsList.getDividerHeight(); + setPadding(attrsList.getPaddingLeft(), attrsList.getPaddingTop(), + attrsList.getPaddingRight(), attrsList.getPaddingBottom()); + mList.setFadingEdgeLength(attrsList.getVerticalFadingEdgeLength()); + mList.setHorizontalFadingEdgeEnabled(attrsList.isHorizontalFadingEdgeEnabled()); + mList.setVerticalFadingEdgeEnabled(attrsList.isVerticalFadingEdgeEnabled()); + mList.setCacheColorHint(attrsList.getCacheColorHint()); + mList.setFastScrollEnabled(attrsList.isFastScrollEnabled()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mList.setChoiceMode(attrsList.getChoiceMode()); + mList.setFastScrollAlwaysVisible(attrsList.isFastScrollAlwaysVisible()); + } + mList.setScrollBarStyle(attrsList.getScrollBarStyle()); + mList.setVerticalScrollBarEnabled(attrsList.isVerticalScrollBarEnabled()); + mList.setHorizontalScrollBarEnabled(attrsList.isHorizontalScrollBarEnabled()); + mList.setSelector(attrsList.getSelector()); + mList.setScrollingCacheEnabled(attrsList.isScrollingCacheEnabled()); if (attrs != null) { - TypedArray a = context.getTheme().obtainStyledAttributes(attrs,R.styleable.StickyListHeadersListView, 0, 0); + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.StickyListHeadersListView, 0, 0); try { - // Android attributes - if (a.hasValue(R.styleable.StickyListHeadersListView_android_padding)) { - int padding = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_padding, 0); - mPaddingLeft = padding; - mPaddingTop = padding; - mPaddingRight = padding; - mPaddingBottom = padding; - } else { - mPaddingLeft = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingLeft, 0); - mPaddingTop = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingTop, 0); - mPaddingRight = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingRight, 0); - mPaddingBottom = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_paddingBottom, 0); - } - setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, - mPaddingBottom); - - // Set clip to padding on the list and reset value to default on - // wrapper + // 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); - - // 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())); - } mList.setDrawSelectorOnTop(a.getBoolean(R.styleable.StickyListHeadersListView_android_drawSelectorOnTop, false)); - mList.setFastScrollEnabled(a.getBoolean(R.styleable.StickyListHeadersListView_android_fastScrollEnabled, - mList.isFastScrollEnabled())); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - mList.setFastScrollAlwaysVisible(a.getBoolean( - R.styleable.StickyListHeadersListView_android_fastScrollAlwaysVisible, - mList.isFastScrollAlwaysVisible())); - } - mList.setScrollBarStyle(a.getInt(R.styleable.StickyListHeadersListView_android_scrollbarStyle, 0)); - if (a.hasValue(R.styleable.StickyListHeadersListView_android_listSelector)) { - mList.setSelector(a.getDrawable(R.styleable.StickyListHeadersListView_android_listSelector)); - } - mList.setScrollingCacheEnabled(a.getBoolean(R.styleable.StickyListHeadersListView_android_scrollingCache, - mList.isScrollingCacheEnabled())); - if (a.hasValue(R.styleable.StickyListHeadersListView_android_divider)) { - mDivider = a.getDrawable(R.styleable.StickyListHeadersListView_android_divider); - } - mDividerHeight = a.getDimensionPixelSize(R.styleable.StickyListHeadersListView_android_dividerHeight, - mDividerHeight); - - // StickyListHeaders attributes mAreHeadersSticky = a.getBoolean(R.styleable.StickyListHeadersListView_hasStickyHeaders, true); mIsDrawingListUnderStickyHeader = a.getBoolean( - R.styleable.StickyListHeadersListView_isDrawingListUnderStickyHeader, - true); + R.styleable.StickyListHeadersListView_isDrawingListUnderStickyHeader, true); } finally { a.recycle(); } } - mList.setVerticalScrollBarEnabled(isVerticalScrollBarEnabled()); - mList.setHorizontalScrollBarEnabled(isHorizontalScrollBarEnabled()); + // attach some listeners to the wrapped list + mList.setLifeCycleListener(new WrapperViewListLifeCycleListener()); + mList.setOnScrollListener(new WrapperListScrollListener()); + + addView(mList); } @Override