package edu.vanderbilt.vm.guide.ui.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; import edu.vanderbilt.vm.guide.db.GuideDBConstants; /** * Cursor Adapter of Place cursors for AutoCompleteTextViews * @author nicholasking * */ public class AutoPlaceCursorAdapter extends BaseAdapter implements Filterable { private Cursor mCursor; private List<String> mFiltered = new ArrayList<String>(); private Filter mFilter; private Context mContext; private int mNameIx; private int mIdIx; private static final float TEXT_SIZE = 16; private static final int PADDING = 8; // pixels public AutoPlaceCursorAdapter(Context context, Cursor c) { mContext = context; mCursor = c; mNameIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.NAME_COL); if (mNameIx == -1) { throw new SQLiteException("Cursor must have a name column"); } mIdIx = mCursor.getColumnIndex(GuideDBConstants.PlaceTable.ID_COL); if (mIdIx == -1) { throw new SQLiteException("Cursor must have an id column"); } synchronized (mCursor) { for (int i=0; i<mCursor.getCount(); i++) { mCursor.moveToPosition(i); mFiltered.add(mCursor.getString(mNameIx)); } } } @Override public int getCount() { return mFiltered.size(); } @Override public String getItem(int position) { return mFiltered.get(position); } /** * Currently does nothing */ @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView tv; if (convertView != null) { tv = (TextView) convertView; } else { tv = new TextView(mContext); tv.setPadding(PADDING, PADDING, PADDING, PADDING); tv.setTextSize(TEXT_SIZE); } tv.setText(mFiltered.get(position)); return tv; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new MyFilter(); } return mFilter; } private class MyFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); List<String> matches = new ArrayList<String>(); String prefix = constraint.toString().toLowerCase(); synchronized (mCursor) { for (int i=0; i<mCursor.getCount(); i++) { mCursor.moveToPosition(i); String name = mCursor.getString(mNameIx); if (name.toLowerCase().startsWith(prefix)) { matches.add(name); } } } results.count = matches.size(); results.values = matches; return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.values != null) { mFiltered = (List<String>)results.values; notifyDataSetChanged(); } } } }