Question

J'ai un ListView avec un adaptateur personnalisé qui étend ArrayAdapter. Il est un ArrayAdapter de l'artiste Type.

Artiste est une petite classe qui a un nom et un identifiant. La classe Artiste a toString () pour revenir simplement substituée le nom.

J'ai un EditText. Le EditText a un TextChangeListener où j'appelle .getFilter (). Filtre (caractères, rappel) sur mon adaptateur.

Dans le rappel Filter.Filterlistener (). OnComplete () i imprimer le compte et il semble vraiment bon. Comme type i le nombre diminue. Donc, il coutures tout fonctionne comme prévu, mais la liste reste le même. J'ai essayé d'appeler artistAdapter.notifyDataSetChanged () pour forcer la liste à redessiner, mais rien ne se passe. [Voir 2.)]

Je bricole depuis plusieurs jours! Je suis désespérée .. Espérons que quelqu'un peut avoir un coup d'oeil sur mon code et dites-moi ce que je fais mal!

Merci!

Voici ce que je l'ai fait:

1) défini par un ListView et un EditText comme ceci:.

<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) Configurer mon ListView dans les activités 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.) Ceci est mon ArtistAdapter en bref. J'ai ajouté un remove () et ajouter () méthode:

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) Mon artiste dispose aussi toString () substituée:

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;
    }
}
Était-ce utile?

La solution

J'ai trouvé la solution. J'ai réécrit tout le code à partir de zéro et a trouvé le problème.

Dans mon ArrayAdapter personnalisé appelé ArtistAdapter (voir 3. en question) si un var pour stocker les éléments: articles de liste privée;

Et dans mon getView () quand je veux substituée pour obtenir l'élément en cours je l'ai fait: items.getItem (position) maintenant je fais: getItems (position) (si l'élément est récupéré à partir du stockage de la classe de base et pas mon propre) et cela semble faire l'affaire!

Ceci est mon getView () comme il est maintenant (la version, qui travaille):

@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, ce fut un bug vraiment gênant ...

Autres conseils

Essayez d'utiliser listView.setFilterText () adaptateur plutôt que de filtre.

Vous devez remplacer la méthode toString(), pour renvoyer le texte que vous souhaitez filtrer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top