Pim Reijersen
Pim Reijersen

Reputation: 1133

No results with custom ArrayAdapter Filter

I'm using the ArrayAdapter on a AutoCompleteTextView. results.values has the expected value but I get no list on the UI.

public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
    private final Object mLock = new Object();
    private CustomFilter mFilter;
    public ArrayList<String> mItems;
    public ArrayList<String> mFiltered;

    public CustomArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mItems = new ArrayList<String>();
        mFiltered = new ArrayList<String>();
    }

    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new CustomFilter();
        }
        return mFilter;
    }

    @Override
    public void add(String s) { 
        mItems.add(s);
    }

    private class CustomFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (mItems == null) {
                synchronized (mLock) {
                    mItems = new ArrayList<String>();
                }
            }

            if (constraint == null || constraint.length() == 0) {
                synchronized (mLock) {
                    results.values = mItems;
                    results.count = mItems.size();
                }
            } else {
                final ArrayList<String> newItems = new ArrayList<String>();

                for (int i = 0; i < mItems.size(); i++) {
                    final String item = mItems.get(i);
                    if(item.contains(constraint)) {
                        newItems.add(item);
                    }
                }
                results.values = newItems;
                results.count = newItems.size();
            }

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            mFiltered.clear();
            mFiltered.addAll((ArrayList<String>) results.values);
            notifyDataSetChanged();
        }

    }
}

Upvotes: 4

Views: 9599

Answers (3)

Levi Saturnino
Levi Saturnino

Reputation: 221

There are some days I have been researching on the net about how to do research in arraylist with hashmap and luckily I came across this post.

I made my adaptation to arraylist > and it worked. And now I'm sharing with you, you will know there is someone like the same question using ArrayList and HashMap. Thank you Pim Reijersen!

public class CategoriaAdapterModel extends BaseAdapter implements Filterable {

private Activity context;
private ArrayList<HashMap<String, String>> mDataShown;
private ArrayList<HashMap<String, String>> mAllData;
private Filter mFilter;
private LayoutInflater inflater;
DownloadImagemUtil downloader;

public CategoriaAdapterModel(Activity context,
        ArrayList<HashMap<String, String>> data) {
    this.context = context;
    this.mAllData = data;
    this.mDataShown = data;
    downloader = new DownloadImagemUtil(context);
}

public void add(HashMap<String, String> object) {
    mAllData.add(object);
    this.notifyDataSetChanged();
}

public int getCount() {
    return mDataShown.size();
}

public Object getItem(int position) {

    return mDataShown.get(position);
}

public long getItemId(int position) {
    return position;

}

public Filter getFilter() {
    if (mFilter == null) {
        mFilter = new CustomFilter();
    }
    return mFilter;
}

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

private class CustomFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();

        if (constraint == null || constraint.length() == 0) {
            ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(
                    mAllData);
            results.values = list;
            results.count = list.size();
        } else {
            ArrayList<HashMap<String, String>> newValues = new ArrayList<HashMap<String, String>>();
            for (int i = 0; i < mAllData.size(); i++) {
                HashMap<String, String> item = mAllData.get(i);
                if (item.get(JsonFragmentCategoriaCONN.TAG_NOME)
                        .toLowerCase()
                        .contains(constraint.toString().toLowerCase())) {
                    newValues.add(item);
                }
            }
            results.values = newValues;
            results.count = newValues.size();
        }

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        mDataShown = (ArrayList<HashMap<String, String>>) results.values;
        Log.d("CustomArrayAdapter", String.valueOf(results.values));
        Log.d("CustomArrayAdapter", String.valueOf(results.count));
        notifyDataSetChanged();
    }

}

Upvotes: 1

Ricardas
Ricardas

Reputation: 1690

You need overwrite getCount method in CustomArrayAdapter:

@Override
public int getCount() {
    return mFiltered.size();
}

And modify your publishResults method code:

protected void publishResults(CharSequence constraint,FilterResults results) {
            mFiltered = (List<String>) results.values;
            notifyDataSetChanged();
        }

Upvotes: 1

Pim Reijersen
Pim Reijersen

Reputation: 1133

Looks like overriding a couple more functions did the job. Full source of working version:

public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
private List<String> mOrigionalValues;
private List<String> mObjects;
private Filter mFilter;

public CustomArrayAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    mOrigionalValues = new ArrayList<String>();
    mObjects = new ArrayList<String>();
}

public void add(String object) {
    mOrigionalValues.add(object);
    this.notifyDataSetChanged();
}

@Override
public int getCount() {
    return mObjects.size();
}

@Override
public String getItem(int position) {
    return mObjects.get(position);
}

public Filter getFilter() {
    if (mFilter == null) {
        mFilter = new CustomFilter();
    }
    return mFilter;
}

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

private class CustomFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();

        if(constraint == null || constraint.length() == 0) {
            ArrayList<String> list = new ArrayList<String>(mOrigionalValues);
            results.values = list;
            results.count = list.size();
        } else {
            ArrayList<String> newValues = new ArrayList<String>();
            for(int i = 0; i < mOrigionalValues.size(); i++) {
                String item = mOrigionalValues.get(i);
                if(item.contains(constraint)) {
                    newValues.add(item);
                }
            }
            results.values = newValues;
            results.count = newValues.size();
        }       

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        mObjects = (List<String>) results.values;
        Log.d("CustomArrayAdapter", String.valueOf(results.values));
        Log.d("CustomArrayAdapter", String.valueOf(results.count));
        notifyDataSetChanged();
    }

}

}

Upvotes: 15

Related Questions