diff --git a/res/values/ids.xml b/res/values/ids.xml index abd10379..25044267 100644 --- a/res/values/ids.xml +++ b/res/values/ids.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/src/org/kreed/vanilla/AbstractAdapter.java b/src/org/kreed/vanilla/AbstractAdapter.java index 2cd66175..31375f16 100644 --- a/src/org/kreed/vanilla/AbstractAdapter.java +++ b/src/org/kreed/vanilla/AbstractAdapter.java @@ -43,14 +43,20 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable public static final int ONE_LINE = 0x1; private Context mContext; + private OnClickListener mExpanderListener; + private List mObjects; private Song[] mAllObjects; private ArrayFilter mFilter; + private int mLimiterField = -1; + private int mLimiterId = -1; + private CharSequence mLastFilter; + private float mSize; private int mPadding; + private int mDrawFlags; private int mMediaField; - private OnClickListener mExpanderListener; public AbstractAdapter(Context context, Song[] allObjects, int drawFlags, int mediaField) { @@ -100,8 +106,7 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable button.setImageResource(R.drawable.expander_arrow); button.setId(3); button.setLayoutParams(params); - button.setTag(R.id.list, mMediaField); - button.setTag(R.id.song, get(position)); + button.setTag(R.id.field, mMediaField); button.setOnClickListener(mExpanderListener); view.addView(button); @@ -135,6 +140,8 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable } updateText(position, (TextView)view.findViewById(1),(TextView)view.findViewById(2)); + if (mExpanderListener != null) + view.findViewById(3).setTag(R.id.id, (int)getItemId(position)); return view; } @@ -168,14 +175,19 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable { FilterResults results = new FilterResults(); - if (filter == null || filter.length() == 0) { + boolean noFilter = filter == null || filter.length() == 0; + + if (noFilter && mLimiterField == -1) { results.values = Arrays.asList(mAllObjects); results.count = mAllObjects.length; } else { - String[] words = filter.toString().split("\\s+"); - Matcher[] matchers = new Matcher[words.length]; - for (int i = words.length; --i != -1; ) - matchers[i] = createMatcher(words[i]); + Matcher[] matchers = null; + if (!noFilter) { + String[] words = filter.toString().split("\\s+"); + matchers = new Matcher[words.length]; + for (int i = words.length; --i != -1; ) + matchers[i] = createMatcher(words[i]); + } int count = mAllObjects.length; ArrayList newValues = new ArrayList(); @@ -185,14 +197,19 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable for (int i = 0; i != count; ++i) { Song song = mAllObjects[i]; - for (int j = matchers.length; --j != -1; ) { - if (matchers[j].reset(song.artist).find()) - continue; - if (mMediaField > 1 && matchers[j].reset(song.album).find()) - continue; - if (mMediaField > 2 && matchers[j].reset(song.title).find()) - continue; - continue outer; + if (mLimiterField != -1 && song.getFieldId(mLimiterField) != mLimiterId) + continue; + + if (!noFilter) { + for (int j = matchers.length; --j != -1; ) { + if (matchers[j].reset(song.artist).find()) + continue; + if (mMediaField > 1 && matchers[j].reset(song.album).find()) + continue; + if (mMediaField > 2 && matchers[j].reset(song.title).find()) + continue; + continue outer; + } } newValues.add(song); @@ -212,6 +229,7 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable protected void publishResults(CharSequence constraint, FilterResults results) { mObjects = (List)results.values; + mLastFilter = constraint; if (results.count == 0) notifyDataSetInvalidated(); else @@ -219,6 +237,17 @@ public abstract class AbstractAdapter extends BaseAdapter implements Filterable } } + public void setLimiter(int field, int id) + { + mLimiterField = field; + mLimiterId = id; + + mObjects = new ArrayList(); + notifyDataSetInvalidated(); + + getFilter().filter(mLastFilter); + } + public int getCount() { if (mObjects == null) { diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java index 7c3fd725..1b4f6310 100644 --- a/src/org/kreed/vanilla/SongSelector.java +++ b/src/org/kreed/vanilla/SongSelector.java @@ -157,9 +157,14 @@ public class SongSelector extends TabActivity implements AdapterView.OnItemClick if (view == mClearButton) { mTextFilter.setText(""); } else { - Object list = view.getTag(R.id.list); - if (list != null) - mTabHost.setCurrentTab((Integer)list); + Object fieldObj = view.getTag(R.id.field); + if (fieldObj != null) { + int field = (Integer)fieldObj; + int id = (Integer)view.getTag(R.id.id); + mTabHost.setCurrentTab(field); + for (int i = field; i != 3; ++i) + mAdapters[i].setLimiter(field, id); + } } }