4

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();
        }

    }
}

3 Answers 3

15

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();
    }

}

}
Sign up to request clarification or add additional context in comments.

1 Comment

Would you be able to take a look at my question? stackoverflow.com/questions/20506480/…
1

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();
        }

Comments

1

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();
    }

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.