Last active
August 29, 2015 14:11
-
-
Save vml-rmott/d05e93b55411f2517004 to your computer and use it in GitHub Desktop.
ResourceCursorAdapter with a configurable initial default value
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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