Pregunta

Tengo un ListView con un adaptador a medida que se extiende ArrayAdapter. Es un ArrayAdapter del Artista.

artista es una clase muy pequeña que tiene un nombre y un id. La Clase artista tiene toString () reemplaza a devolver sólo el nombre.

Tengo una EditarTexto. El EditarTexto tiene una TextChangeListener donde me llamo .getFilter (). Filtro (caracteres, devolución de llamada) en mi adaptador.

En el Filter.Filterlistener (). OnComplete () de devolución de llamada i imprimir el recuento y se ve muy bien. Mientras escribo el recuento disminuye. Por lo tanto, las costuras todo funciona como se anuncia, pero las estancias Lista mismo. Traté de llamar artistAdapter.notifyDataSetChanged () para forzar la lista para volver a dibujar, pero no pasa nada. [Ver 2.)]

estoy trasteando durante días ahora! Estoy desesperada .. Esperemos que alguien puede echar un vistazo en mi código y me diga lo que estoy haciendo mal!

Gracias!

Esto es lo que he hecho:

1) Definido un ListView y un EditarTexto como esto:.

<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) Configurar mi ListView en las actividades 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.) Esta es mi ArtistAdapter en corto. Añadí una remove () y add () método:

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) Mi artista tiene también el método toString () se reemplaza:.

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;
    }
}
¿Fue útil?

Solución

I encontró la solución. He reescrito el código entero desde cero y ha encontrado el problema.

En mi costumbre ArrayAdapter llamada ArtistAdapter (ver 3. en cuestión) si tienen una var para almacenar los artículos: Los elementos de lista privada;

Y en mi getView () sustituido cuando quiero conseguir el elemento actual que hice: items.getItem (posición) Ahora hago un: getItems (posición) (así que el artículo se recupera del almacenamiento de la clase base y no la mía) y esto parece hacer el truco!

Esta es mi getView () ya que ahora es (la versión, que está trabajando):

@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, esto fue un error muy molesto ...

Otros consejos

Trate de usar listView.setFilterText () de filtro en lugar de adaptador.

Hay que reemplazar el método toString(), para devolver el texto que desea filtrar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top