package com.gueei.demos.markupDemo.viewModels; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.widget.Filter; import gueei.binding.Observable; import gueei.binding.collections.TrackedCursorCollection; import gueei.binding.cursor.*; import gueei.binding.observables.StringObservable; /** * User: =ra= * Date: 09.08.11 * Time: 9:46 */ public class FilterCursorList { private final Context mContext; private final Uri mTrackingUri = Uri.parse("content://com.gueei.demos/masters"); private Cursor mCursorSrc; public FilterCursorList(Activity activity) { mContext = activity; CursorSrc = new TrackedCursorCollection<FilteredCursorRowModel>(FilteredCursorRowModel.class); mCursorSrc = mContext.getContentResolver().query(mTrackingUri, new String[]{"_ID", "Name", "detailsCount"}, null, null, null); activity.startManagingCursor(mCursorSrc); CursorSrc.setCursor(mCursorSrc); CursorSrc.setContentObserverTrackingUri(mContext, mTrackingUri, false); } public final StringObservable FilterText = new StringObservable(); public final TrackedCursorCollection<FilteredCursorRowModel> CursorSrc; public final Observable<Filter> CursorFilter = new Observable<Filter>(Filter.class, new Filter() { private Cursor filteredCursor; private static final char S_QUOTES = '\''; private static final char S_PERC_SIGN = '%'; //!! view model fails on percentage sign @Override protected FilterResults performFiltering(CharSequence constraint) { if (constraint == null || constraint.length() == 0) { return null; } String filterString = "lower(Name) like " + S_QUOTES + S_PERC_SIGN + constraint.toString().toLowerCase() + S_PERC_SIGN + S_QUOTES; filteredCursor = mContext.getContentResolver() .query(mTrackingUri, new String[]{"_ID", "Name", "detailsCount"}, filterString, null, null); ((Activity) mContext).startManagingCursor(filteredCursor); FilterResults result = new FilterResults(); result.count = filteredCursor.getCount(); result.values = filteredCursor; return result; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results == null) { CursorSrc.setCursor(mCursorSrc); } else { CursorSrc.setCursor(filteredCursor); } CursorSrc.setContentObserverTrackingUri(mContext, mTrackingUri, false); } }); public static class FilteredCursorRowModel extends RowModel { public IdField Id = new IdField("_ID"); public StringField Name = new StringField("Name"); public IntegerField SubItemsCount = new IntegerField("detailsCount"); @Override public long getId(int defaultId) { return Id.get(); } } }