package wb.android.autocomplete; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.CursorAdapter; import android.widget.FilterQueryProvider; import android.widget.Filterable; import android.widget.ListView; import android.widget.TextView; public class AutoCompleteAdapter extends CursorAdapter implements Filterable, FilterQueryProvider { private final QueryListener mQueryListener; private final CharSequence mTag; private final MyClickListener mClickListener; private final ItemSelectedListener mItemSelectedListener; private final int mCol; private String mLastString; public interface ItemSelectedListener { public void onItemSelected(CharSequence text, CharSequence tag); } public interface QueryListener { public Cursor getAutoCompleteCursor(CharSequence text, CharSequence tag); } @SuppressWarnings("deprecation") private AutoCompleteAdapter(Activity activity, Cursor cursor, QueryListener mQueryListener, CharSequence mTag, ItemSelectedListener itemSelectedListener, int col) { super(activity, cursor); this.mQueryListener = mQueryListener; this.mTag = mTag; this.mLastString = ""; setFilterQueryProvider(this); this.mClickListener = new MyClickListener(); mItemSelectedListener = itemSelectedListener; mCol = col; } public static AutoCompleteAdapter getInstance(Activity activity, CharSequence mTag, QueryListener queryListener) { return getInstance(activity, mTag, queryListener, null, 0); } public static AutoCompleteAdapter getInstance(Activity activity, CharSequence mTag, QueryListener queryListener, ItemSelectedListener itemSelectedListener) { return getInstance(activity, mTag, queryListener, itemSelectedListener, 0); } public static AutoCompleteAdapter getInstance(Activity activity, CharSequence mTag, QueryListener queryListener, ItemSelectedListener itemSelectedListener, int col) { Cursor cursor = queryListener.getAutoCompleteCursor("", mTag); return new AutoCompleteAdapter(activity, cursor, queryListener, mTag, itemSelectedListener, col); } public void reset() { this.mLastString = ""; onPause(); } public final void onPause() { Cursor cursor = getCursor(); if (cursor != null && !cursor.isClosed()) { cursor.close(); } } @Override public void bindView(View view, Context context, Cursor cursor) { String text = cursor.getString(mCol); if (text.trim().equalsIgnoreCase(mLastString.trim())) { view.getRootView().setVisibility(View.INVISIBLE); //TODO: Push on item selected... } else { ((TextView) view).setText(text); view.getRootView().setVisibility(View.VISIBLE); } } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { final LayoutInflater inflater = LayoutInflater.from(context); if (mItemSelectedListener != null && parent instanceof ListView) { // Should always be the case (but to prevent against updates, etc) ((ListView) parent).setOnItemClickListener(mClickListener); } final TextView view = (TextView) inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false); String item = cursor.getString(mCol); view.setText(item); return view; } @Override public CharSequence convertToString(Cursor cursor) { return cursor.getString(mCol); } private class MyClickListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mItemSelectedListener.onItemSelected(((TextView)view).getText(), mTag); } } @Override public Cursor runQuery(CharSequence constraint) { mLastString = (constraint == null) ? "" : constraint.toString(); return mQueryListener.getAutoCompleteCursor(mLastString, mTag); } }