Frage

Ich habe eine Listview mit einem benutzerdefinierten Adapter, die ArrayAdapter erstreckt. Es ist ein ArrayAdapter von Typ Künstler.

Künstler ist eine sehr kleine Klasse, die einen Namen und eine ID hat. Der Künstler Klasse hat toString () außer Kraft gesetzt einfach den Namen zurückzukehren.

Ich habe eine EditText. Die EditText hat eine TextChangeListener wo ich .getFilter () aufrufen. Filter (Zeichen, Rückruf) auf meinem Adapter.

In der Filter.Filterlistener (). OnComplete () Rückruf i die Zählung drucken und es sieht wirklich gut aus. Wie ich die Zählung geben abnimmt. So ist es Nähte alles funktioniert wie beworben, aber die Liste bleibt gleich. Ich habe versucht, artistAdapter.notifyDataSetChanged () aufrufen, um die Liste zu zwingen, neu zu zeichnen, aber es passiert nichts. [Siehe 2).]

Ich bin bastelt jetzt Tage um! Ich bin verzweifelt .. Hoffentlich kann jemand auf meinen Code einen Blick und sagen Sie mir, was ich falsch mache!

Danke!

Hier ist, was ich getan habe:

1) definiert ein Listview und ein EditText wie folgt aus:.

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_search_text"
    android:layout_width="fill_parent"
    android:layout_height="35dip"
    android:layout_below="@id/header">
</EditText>       
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_search"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</ListView>

2) Aufbau meiner Listview in der Aktivitäten onCreate ():.

private ListView listView = null;
private ArtistAdapter artistAdapter = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_artists);

    artistAdapter = new ArtistAdapter(this, R.layout.row, list); // 'list' is an ArrayList<Artist>

    listView = (ListView) findViewById(R.id.list_search);
    listView.setAdapter(artistAdapter);
    listView.setFastScrollEnabled(true);
    listView.setTextFilterEnabled(true);

    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int position, long id) {
            // do something
        }
    });

    EditText txtSearch = (EditText) findViewById(R.id.list_search_text);
    txtSearch.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable arg0) { }

        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

        public void onTextChanged(CharSequence chars, int start, int before, int count) {
            artistAdapter.getFilter().filter(chars, new Filter.FilterListener() {
                public void onFilterComplete(int count) {
                    Log.d(Config.LOG_TAG, "filter complete! count: " + count);
                    artistAdapter.notifyDataSetChanged();
                }
            });
        }
    });
}

3.) Das ist mein ArtistAdapter kurz. Ich fügte hinzu, ein remove () und Methode add ():

public class ArtistAdapter extends ArrayAdapter<Artist> implements SectionIndexer {
    private List<Artist> items;

    /* other stuff like overridden getView, getPositionForSection, getSectionForPosition and so on */

    @Override
    public void remove(Artist object) {
        super.remove(object);
        items.remove(object);
    }

    @Override
    public void add(Artist object) {
        super.add(object);
        items.add(object);
    }
}    

4) Mein Künstler hat auch den toString () außer Kraft gesetzt.

public class Artist implements Comparable<Artist> {
    public String   uid;
    public String   name;

    public Artist(String id, String name) {
        this.uid = id;
        this.name = name;
    }

    public int compareTo(Artist another) {
        return this.name.compareToIgnoreCase(another.name);
    }

    @Override
    public String toString() {
        return this.name;
    }
}
War es hilfreich?

Lösung

Ich fand die Lösung. Ich habe den ganzen Code von Grunde auf neu geschrieben und das Problem gefunden.

In meinem benutzerdefinierten ArrayAdapter genannt ArtistAdapter (3. in Frage), wenn eine var hat die Elemente zu speichern: Private Listenelemente;

Und in meinem überschriebene getView (), wenn ich das aktuelle Element erhalten möchte ich tat: items.getItem (Position) jetzt ich habe ein: getItems (Position) (so wird das Element aus dem Speicher der Basisklasse abgerufen und meine eigenen nicht), und dies scheint den Trick zu tun!

Das ist mein getView (), wie es jetzt ist (die Version, die funktioniert):

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout artistView;
    Artist art = getItem(position);

    if (convertView == null) {
        artistView = new LinearLayout(getContext());
        String inflater = Context.LAYOUT_INFLATER_SERVICE;
        LayoutInflater vi;
        vi = (LayoutInflater)getContext().getSystemService(inflater);
        vi.inflate(resId, artistView, true);
    } else {
        artistView = (LinearLayout) convertView;
    }
    TextView nameView = (TextView)artistView.findViewById(R.id.txt_name);
    TextView uidView = (TextView)artistView.findViewById(R.id.txt_uid);
    nameView.setText(art.name);
    uidView.setText(art.uid);
    return artistView;
}

Pfu, dies war ein wirklich ärgerlicher Fehler ...

Andere Tipps

Versuchen Sie es mit listView.setFilterText () eher dann Adapter Filter.

Sie haben die toString() Methode außer Kraft zu setzen, den Text, den Sie filtern wollen zurückzukehren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top