Skip to content

Instantly share code, notes, and snippets.

@vml-rmott
Last active August 29, 2015 14:11
Show Gist options
  • Save vml-rmott/d05e93b55411f2517004 to your computer and use it in GitHub Desktop.
Save vml-rmott/d05e93b55411f2517004 to your computer and use it in GitHub Desktop.
ResourceCursorAdapter with a configurable initial default value
package com.vml.example;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.ResourceCursorAdapter;
import android.view.View;
import android.view.ViewGroup;
/**
* Ryan Mott - VML, Inc.
* 2014-12-10
*
* Inserts a placeholder item at the top of the adapter unrelated to
* the cursor. Used to provide a default item on spinner widgets
* that may represent the initial "unselected" state.
*/
public abstract class DefaultItemCursorAdapter extends ResourceCursorAdapter {
private boolean mDefaultSelectable = false;
private Object mDefaultItem = null;
private long mDefaultItemId = -1;
private int mRealCount = 0;
public DefaultItemCursorAdapter(Context context, int layout, Cursor c, int flags) {
super(context, layout, c, flags);
}
public boolean isDefaultSelectable() {
return mDefaultSelectable;
}
final public void setDefaultSelectable(boolean mDefaultSelectable) {
this.mDefaultSelectable = mDefaultSelectable;
}
public long getDefaultItemId() {
return mDefaultItemId;
}
public void setDefaultItemId(long mDefaultItemId) {
this.mDefaultItemId = mDefaultItemId;
}
public Object getDefaultItem() {
return mDefaultItem;
}
public void setDefaultItem(Object mDefaultItem) {
this.mDefaultItem = mDefaultItem;
}
@Override
public int getCount() {
mRealCount = super.getCount();
int count = mRealCount;
if (mRealCount > 1) count++;
return count;
}
private int fixPosition(int position) {
if (mRealCount > 1) position--;
return position;
}
@Override
public Object getItem(int position) {
position = fixPosition(position);
if (position < 0) return mDefaultItem;
return super.getItem(position);
}
@Override
public long getItemId(int position) {
position = fixPosition(position);
if (position < 0) return mDefaultItemId;
return super.getItemId(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
position = fixPosition(position);
if (position < 0) {
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindDefaultView(v, mContext, mDefaultItemId, mDefaultItem);
return v;
}
return super.getView(position, convertView, parent);
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
position = fixPosition(position);
if (position < 0) {
View v;
if (convertView == null) {
v = newDropDownView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindDefaultView(v, mContext, mDefaultItemId, mDefaultItem);
return v;
}
return super.getDropDownView(position, convertView, parent);
}
@Override
public boolean isEnabled(int position) {
position = fixPosition(position);
if (position < 0) return mDefaultSelectable;
return super.isEnabled(position);
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
public abstract void bindDefaultView(View view, Context context, long id, Object item);
}
package com.vml.example;
import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.widget.TextView;
/**
* Ryan Mott - VML, Inc.
* 2014-12-10
*
* Inserts a placeholder item at the top of the adapter unrelated to
* the cursor. Allow the placeholder to reflect it is not selectable.
* Probably requires the spinner item layout to include `android:duplicateParentState="true"`
*/
public class SimpleDefaultItemCursorAdapter extends DefaultItemCursorAdapter {
private final String mDefaultText;
private final String mColumnName;
public SimpleDefaultItemCursorAdapter(Context context, int layout, Cursor c, int flags, String columnName, String defaultText) {
super(context, layout, c, flags);
mDefaultText = defaultText;
mColumnName = columnName;
}
@Override
public void bindDefaultView(View view, Context context, long id, Object item) {
((TextView) view.findViewById(android.R.id.text1)).setText(mDefaultText);
view.setEnabled(isDefaultSelectable());
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
((TextView) view.findViewById(android.R.id.text1)).setText(cursor.getString(cursor.getColumnIndex(mColumnName)));
view.setEnabled(true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment