Domanda

Ho un ListView con un adattatore personalizzato che si estende ArrayAdapter. E 'un ArrayAdapter di Type Artista.

Artist è una piccola classe che ha un nome e un id. La classe artista ha toString () override per restituire solo il nome.

Ho un EditText. L'EditText ha un TextChangeListener dove io chiamo .getFilter (). Filtrare (caratteri, callback) sul proprio adattatore.

Nel Filter.Filterlistener (). OnComplete () richiamata stampo il conteggio e sembra davvero buono. Come scriv il conteggio diminuisce. Così cuciture tutto funziona come pubblicizzato, ma l'elenco rimane lo stesso. Ho provato a chiamare artistAdapter.notifyDataSetChanged () per forzare la lista di ridisegnare, ma non succede nulla. [Vedi 2.)]

sto armeggiare intorno per giorni ormai! Sono disperata .. Speriamo che qualcuno può avere uno sguardo sul mio codice e dimmi cosa sto facendo male!

Grazie!

Ecco quello che ho fatto:

1) Definito un ListView e un EditText in questo modo:.

<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) Imposta la mia ListView nelle attività 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). Questo è il mio ArtistAdapter insomma. Ho aggiunto un remove () e aggiungere () Metodo:

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) Il mio artista ha anche il toString () override:

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;
    }
}
È stato utile?

Soluzione

ho trovato la soluzione. Ho riscritto l'intero codice da zero e trovato il problema.

Nel mio ArrayAdapter personalizzato chiamato ArtistAdapter (vedi 3. in questione), se hanno un var per memorizzare le voci: Gli elementi dell'elenco privato;

E nella mia GetView override () quando voglio ottenere l'oggetto corrente ho fatto: items.getItem (posizione) Ora faccio una: getItems (posizione) (in modo che la voce viene recuperato dal deposito della classe base e non il mio) e questo sembra fare il trucco!

Questa è la mia GetView () come è adesso (la versione, che sta lavorando):

@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, questo è stato un bug davvero fastidioso ...

Altri suggerimenti

Provare a utilizzare listView.setFilterText () piuttosto che adattatore filtro.

Devi eseguire l'override del metodo toString(), per restituire il testo che si desidera filtrare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top