Skip to content

Commit

Permalink
make a temporary listview for attrs
Browse files Browse the repository at this point in the history
Making a temporary attrs listview will make sure that we get the
correct default styling of the wrapped list.
  • Loading branch information
emilsjolander committed Nov 18, 2013
1 parent d2b4d0c commit dc20a8d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 89 deletions.
18 changes: 1 addition & 17 deletions library/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,11 @@
<resources>

<declare-styleable name="StickyListHeadersListView">
<!-- Android attributes -->
<!-- View attributes -->
<attr name="android:clipToPadding" />
<attr name="android:padding" />
<attr name="android:paddingLeft" />
<attr name="android:paddingTop" />
<attr name="android:paddingRight" />
<attr name="android:paddingBottom" />

<!-- ListView attributes -->
<attr name="android:fadingEdgeLength" />
<attr name="android:requiresFadingEdge" />
<attr name="android:cacheColorHint" />
<attr name="android:choiceMode" />
<attr name="android:drawSelectorOnTop" />
<attr name="android:fastScrollEnabled" />
<attr name="android:fastScrollAlwaysVisible" />
<attr name="android:listSelector" />
<attr name="android:scrollingCache" />
<attr name="android:scrollbarStyle" />
<attr name="android:divider" />
<attr name="android:dividerHeight" />

<!-- StickyListHeaders attributes -->
<attr name="hasStickyHeaders" format="boolean" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit dc20a8d

Please sign in to comment.