4 Stimmen

Keine Ergebnisse mit benutzerdefiniertem ArrayAdapter Filter

Ich verwende den ArrayAdapter auf eine AutoCompleteTextView. results.values hat den erwarteten Wert, aber ich bekomme keine Liste auf der 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();
        }

    }
}

15voto

Pim Reijersen Punkte 1115

Es sieht so aus, als ob das Überschreiben einiger weiterer Funktionen die Arbeit erledigt hat. Vollständiger Quelltext der funktionierenden 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();
    }

}

}

1voto

Ricardas Punkte 1632

Sie müssen überschreiben getCount Methode in CustomArrayAdapter:

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

Und ändern Sie den Code der Methode publishResults:

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

1voto

Levi Saturnino Punkte 221

Es gibt einige Tage, an denen ich im Netz recherchiert habe, wie man mit hashmap in arraylist recherchieren kann und glücklicherweise bin ich auf diesen Beitrag gestoßen.

Ich habe meine Anpassung an arraylist > vorgenommen und es hat funktioniert. Und jetzt bin ich mit Ihnen teilen, werden Sie wissen, gibt es jemand wie die gleiche Frage mit ArrayList und HashMap. Vielen Dank, 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();
    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X