aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders')
-rw-r--r--libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestActivity.java169
-rw-r--r--libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestBaseAdapter.java169
-rw-r--r--libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/views/UnderlineTextView.java50
3 files changed, 388 insertions, 0 deletions
diff --git a/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestActivity.java b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestActivity.java
new file mode 100644
index 000000000..dc795ff4e
--- /dev/null
+++ b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestActivity.java
@@ -0,0 +1,169 @@
+package se.emilsjolander.stickylistheaders;
+
+import android.annotation.TargetApi;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarActivity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.*;
+
+/**
+ * @author Emil Sjölander
+ */
+public class TestActivity extends ActionBarActivity implements
+ AdapterView.OnItemClickListener, StickyListHeadersListView.OnHeaderClickListener,
+ StickyListHeadersListView.OnStickyHeaderOffsetChangedListener {
+
+ private TestBaseAdapter mAdapter;
+ private DrawerLayout mDrawerLayout;
+ private ActionBarDrawerToggle mDrawerToggle;
+ private boolean fadeHeader = true;
+
+ private StickyListHeadersListView stickyList;
+
+ private Button restoreButton;
+ private Button updateButton;
+ private Button clearButton;
+
+ private CheckBox stickyCheckBox;
+ private CheckBox fadeCheckBox;
+ private CheckBox drawBehindCheckBox;
+ private CheckBox fastScrollCheckBox;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ mAdapter = new TestBaseAdapter(this);
+
+ stickyList = (StickyListHeadersListView) findViewById(R.id.list);
+ stickyList.setOnItemClickListener(this);
+ stickyList.setOnHeaderClickListener(this);
+ stickyList.setOnStickyHeaderOffsetChangedListener(this);
+// mStickyList.addHeaderView(inflater.inflate(R.layout.list_header, null));
+// mStickyList.addFooterView(inflater.inflate(R.layout.list_footer, null));
+ stickyList.setEmptyView(findViewById(R.id.empty));
+ stickyList.setDrawingListUnderStickyHeader(true);
+ stickyList.setAreHeadersSticky(true);
+ stickyList.setAdapter(mAdapter);
+
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(
+ this, /* host Activity */
+ mDrawerLayout, /* DrawerLayout object */
+ R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
+ R.string.drawer_open, /* "open drawer" description */
+ R.string.drawer_close /* "close drawer" description */
+ );
+
+ // Set the drawer toggle as the DrawerListener
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setHomeButtonEnabled(true);
+
+ restoreButton = (Button) findViewById(R.id.restore_button);
+ restoreButton.setOnClickListener(buttonListener);
+ updateButton = (Button) findViewById(R.id.update_button);
+ updateButton.setOnClickListener(buttonListener);
+ clearButton = (Button) findViewById(R.id.clear_button);
+ clearButton.setOnClickListener(buttonListener);
+
+ stickyCheckBox = (CheckBox) findViewById(R.id.sticky_checkBox);
+ stickyCheckBox.setOnCheckedChangeListener(checkBoxListener);
+ fadeCheckBox = (CheckBox) findViewById(R.id.fade_checkBox);
+ fadeCheckBox.setOnCheckedChangeListener(checkBoxListener);
+ drawBehindCheckBox = (CheckBox) findViewById(R.id.draw_behind_checkBox);
+ drawBehindCheckBox.setOnCheckedChangeListener(checkBoxListener);
+ fastScrollCheckBox = (CheckBox) findViewById(R.id.fast_scroll_checkBox);
+ fastScrollCheckBox.setOnCheckedChangeListener(checkBoxListener);
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ mDrawerToggle.syncState();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ CompoundButton.OnCheckedChangeListener checkBoxListener = new CompoundButton.OnCheckedChangeListener() {
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ switch (buttonView.getId()) {
+ case R.id.sticky_checkBox:
+ stickyList.setAreHeadersSticky(isChecked);
+ break;
+ case R.id.fade_checkBox:
+ fadeHeader = isChecked;
+ break;
+ case R.id.draw_behind_checkBox:
+ stickyList.setDrawingListUnderStickyHeader(isChecked);
+ break;
+ case R.id.fast_scroll_checkBox:
+ stickyList.setFastScrollEnabled(isChecked);
+ stickyList.setFastScrollAlwaysVisible(isChecked);
+ break;
+ }
+ }
+ };
+
+ View.OnClickListener buttonListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.restore_button:
+ mAdapter.restore();
+ break;
+ case R.id.update_button:
+ mAdapter.notifyDataSetChanged();
+ break;
+ case R.id.clear_button:
+ mAdapter.clear();
+ break;
+ }
+ }
+ };
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ Toast.makeText(this, "Item " + position + " clicked!",
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ public void onHeaderClick(StickyListHeadersListView l, View header,
+ int itemPosition, long headerId, boolean currentlySticky) {
+ Toast.makeText(this, "Header " + headerId + " currentlySticky ? " + currentlySticky,
+ Toast.LENGTH_SHORT).show();
+ }
+
+ @Override
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public void onStickyHeaderOffsetChanged(StickyListHeadersListView l, View header, int offset) {
+ if (fadeHeader && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ header.setAlpha(1 - (offset / (float) header.getMeasuredHeight()));
+ }
+ }
+} \ No newline at end of file
diff --git a/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestBaseAdapter.java b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestBaseAdapter.java
new file mode 100644
index 000000000..777b7bd57
--- /dev/null
+++ b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/TestBaseAdapter.java
@@ -0,0 +1,169 @@
+package se.emilsjolander.stickylistheaders;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+/**
+ * @author Emil Sjölander
+ */
+public class TestBaseAdapter extends BaseAdapter implements
+ StickyListHeadersAdapter, SectionIndexer {
+
+ private final Context mContext;
+ private String[] mCountries;
+ private int[] mSectionIndices;
+ private Character[] mSectionLetters;
+ private LayoutInflater mInflater;
+
+ public TestBaseAdapter(Context context) {
+ mContext = context;
+ mInflater = LayoutInflater.from(context);
+ mCountries = context.getResources().getStringArray(R.array.countries);
+ mSectionIndices = getSectionIndices();
+ mSectionLetters = getSectionLetters();
+ }
+
+ private int[] getSectionIndices() {
+ ArrayList<Integer> sectionIndices = new ArrayList<Integer>();
+ char lastFirstChar = mCountries[0].charAt(0);
+ sectionIndices.add(0);
+ for (int i = 1; i < mCountries.length; i++) {
+ if (mCountries[i].charAt(0) != lastFirstChar) {
+ lastFirstChar = mCountries[i].charAt(0);
+ sectionIndices.add(i);
+ }
+ }
+ int[] sections = new int[sectionIndices.size()];
+ for (int i = 0; i < sectionIndices.size(); i++) {
+ sections[i] = sectionIndices.get(i);
+ }
+ return sections;
+ }
+
+ private Character[] getSectionLetters() {
+ Character[] letters = new Character[mSectionIndices.length];
+ for (int i = 0; i < mSectionIndices.length; i++) {
+ letters[i] = mCountries[mSectionIndices[i]].charAt(0);
+ }
+ return letters;
+ }
+
+ @Override
+ public int getCount() {
+ return mCountries.length;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mCountries[position];
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+
+ if (convertView == null) {
+ holder = new ViewHolder();
+ convertView = mInflater.inflate(R.layout.test_list_item_layout, parent, false);
+ holder.text = (TextView) convertView.findViewById(R.id.text);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ holder.text.setText(mCountries[position]);
+
+ return convertView;
+ }
+
+ @Override
+ public View getHeaderView(int position, View convertView, ViewGroup parent) {
+ HeaderViewHolder holder;
+
+ if (convertView == null) {
+ holder = new HeaderViewHolder();
+ convertView = mInflater.inflate(R.layout.header, parent, false);
+ holder.text = (TextView) convertView.findViewById(R.id.text1);
+ convertView.setTag(holder);
+ } else {
+ holder = (HeaderViewHolder) convertView.getTag();
+ }
+
+ // set header text as first char in name
+ CharSequence headerChar = mCountries[position].subSequence(0, 1);
+ holder.text.setText(headerChar);
+
+ return convertView;
+ }
+
+ /**
+ * Remember that these have to be static, postion=1 should always return
+ * the same Id that is.
+ */
+ @Override
+ public long getHeaderId(int position) {
+ // return the first character of the country as ID because this is what
+ // headers are based upon
+ return mCountries[position].subSequence(0, 1).charAt(0);
+ }
+
+ @Override
+ public int getPositionForSection(int section) {
+ if (section >= mSectionIndices.length) {
+ section = mSectionIndices.length - 1;
+ } else if (section < 0) {
+ section = 0;
+ }
+ return mSectionIndices[section];
+ }
+
+ @Override
+ public int getSectionForPosition(int position) {
+ for (int i = 0; i < mSectionIndices.length; i++) {
+ if (position < mSectionIndices[i]) {
+ return i - 1;
+ }
+ }
+ return mSectionIndices.length - 1;
+ }
+
+ @Override
+ public Object[] getSections() {
+ return mSectionLetters;
+ }
+
+ public void clear() {
+ mCountries = new String[0];
+ mSectionIndices = new int[0];
+ mSectionLetters = new Character[0];
+ notifyDataSetChanged();
+ }
+
+ public void restore() {
+ mCountries = mContext.getResources().getStringArray(R.array.countries);
+ mSectionIndices = getSectionIndices();
+ mSectionLetters = getSectionLetters();
+ notifyDataSetChanged();
+ }
+
+ class HeaderViewHolder {
+ TextView text;
+ }
+
+ class ViewHolder {
+ TextView text;
+ }
+
+}
diff --git a/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/views/UnderlineTextView.java b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/views/UnderlineTextView.java
new file mode 100644
index 000000000..c202c00b8
--- /dev/null
+++ b/libraries/StickyListHeaders/sample/src/se/emilsjolander/stickylistheaders/views/UnderlineTextView.java
@@ -0,0 +1,50 @@
+package se.emilsjolander.stickylistheaders.views;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.widget.TextView;
+
+/**
+ * @author Eric Frohnhoefer
+ */
+public class UnderlineTextView extends TextView {
+ private final Paint mPaint = new Paint();
+ private int mUnderlineHeight = 0;
+
+ public UnderlineTextView(Context context) {
+ this(context, null);
+ }
+
+ public UnderlineTextView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public UnderlineTextView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ init(context, attrs);
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ Resources r = getResources();
+ mUnderlineHeight = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, r.getDisplayMetrics());
+ }
+
+ @Override
+ public void setPadding(int left, int top, int right, int bottom) {
+ super.setPadding(left, top, right, bottom + mUnderlineHeight);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // Draw the underline the same color as the text
+ mPaint.setColor(getTextColors().getDefaultColor());
+ canvas.drawRect(0, getHeight() - mUnderlineHeight, getWidth(), getHeight(), mPaint);
+ }
+}