Inhalt der Listenansicht löschen?


75

Ich habe ein kleines Problem mit ListView. Wie lösche ich einen ListViewInhalt, wenn ich weiß, dass er einen benutzerdefinierten Adapter hat?

edit- Die benutzerdefinierte Adapterklasse wird erweitert BaseAdapterund sieht folgendermaßen aus:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

    private Activity activity;
    private String[] data;
    private static LayoutInflater inflater = null;

    public MyAdapter(Activity a, String[] str) {
        activity = a;
        data = str;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder {
        public TextView text;
    }

    @Override
    public int getCount() {
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        View v = view;
        ViewHolder holder;
        if (v == null) {
            v = inflater.inflate(R.layout.rowa, null);
            holder = new ViewHolder();
            holder.text= v.findViewById(R.id.dexter);
            v.setTag(holder);
        } else {
            holder = v.getTag();
        }

        holder.text.setText(data[position]);

        return v;
    }

}

Antworten:


198

Einfach schreiben

listView.setAdapter(null);

20
Verwenden Sie besser Adapter.clear () und Adapter.notifyDataSetChanged ()
beshkenadze

5
In Fällen, in denen noch jemand Android 1.6 verwendet, stürzt es ab, wenn ein Adapter mit der Länge Null oder 0 eingestellt wird.
Paul

2
das funktioniert super. Wer würde Android 1.6 noch verwenden = P danke Mike
NightSkyCode

23
beshkenadze - du hast mich alle begeistert Adapter.clear()... nur schade, dass es das nicht gibt ! : /
Jemand irgendwo

Wenn Sie ListFragmentvorzugsweise von der Verwendung verlängernsetListAdapter(null);
Jorge Gil

55

Ich denke, Sie haben eine Liste oder ein Array an den Adapter übergeben. Wenn Sie die Instanz dieser hinzugefügten Sammlung beibehalten, können Sie eine

collection.clear();
listview.getAdapter().notifyDataSetChanged();

Dies funktioniert nur, wenn Sie den Adapter mit Collection instanziiert haben und es sich um dieselbe Instanz handelt.

Abhängig von dem von Ihnen erweiterten Adapter ist dies möglicherweise nicht möglich. SimpleAdapter wird für statische Daten verwendet und kann daher nach der Erstellung nicht aktualisiert werden.

PS. Nicht alle Adapter haben eine clear () -Methode. ArrayAdapter funktioniert, ListAdapter oder SimpleAdapter jedoch nicht


Ich erweitere BaseAdapter und ich denke, es hat keine clear () -Methode.
Mohamed Gallah

Benötigen Sie einen BaseAdapter? Wenn Sie zur Erweiterung eines ArrayAdapters wechseln könnten, würden Sie die clear () -Methode erhalten. Sieht so aus, als müssten Sie in BaseAdapter diesen registerDataSetObserver (DataSetObserver-Beobachter) verwenden. Ich denke, er wird automatisch aktualisiert, wenn sich das DataSet ändert. Aber ArrayAdapter wird wahrscheinlich die Dinge einfacher machen. Viel Glück!
Maragues

Vielen Dank für Ihre Hilfe. Können Sie mir einen Beispielcode für die Erweiterung von ArrayAdapter geben? Vielen Dank.
Mohamed Gallah

check stackoverflow.com/questions/2265661/… Es ist wirklich ähnlich wie das, was Sie bereits haben.
Maragues

Vielen Dank für die Freigabe, aber ich scheine, dass mein Problem nicht mit dem Adapter zusammenhängt, denn selbst wenn ich clear () des ArrayAdapters verwende und die Aktivität neu lade, bleibt der vorherige Inhalt zusätzlich zum neuen Inhalt dort. Ich bin in echten Schwierigkeiten. (Entschuldigung für schlechtes Englisch, ich hoffe du verstehst den Punkt).
Mohamed Gallah

7

Es ist ganz einfach. Zuerst sollten Sie Ihre Sammlung löschen und nach dem Löschen der Liste diesen Code verwenden:

 yourCollection.clear();
 setListAdapter(null);

3

Ab den Android-Versionen M und N funktioniert das Folgende für mich und wäre der richtige Ansatz. Das Leeren der ListView oder das Setzen des Adapters auf null ist nicht der richtige Ansatz und würde zu einem Nullzeigerproblem, einer ungültigen ListView und / oder einem Absturz der App führen.

Einfach machen:

    mList.clear();
    mAdapter.notifyDataSetChanged();

Das heißt, Sie löschen zuerst die Liste vollständig und informieren dann den Adapter über diese Änderung. Android sorgt dafür, dass die Benutzeroberfläche mit einer leeren Liste korrekt aktualisiert wird. In meinem Fall ist meine Liste eine ArrayList.

Wenn Sie diesen Vorgang von einem anderen Thread aus ausführen, führen Sie diesen Code im UI-Thread aus:

    runOnUiThread(mRunnable);

Wo mRunnable wäre:

    Runnable mRunnable = new Runnable() {
        public void run() {
            mList.clear();
            mAdapter.notifyDataSetChanged();
        }
    };;

1

Einfach funktioniert es mir :)

YourArrayList_Object.clear();

Könnten Sie etwas näher darauf eingehen?
Panther

ArrayList <DetailsForCallhistoryListActivity> callhistory_details_list; Verwenden dieses Arraylist-Objekts (dh callhistory_details_list). callhistory_details_list.clear (); hoffe es wird dir helfen Lassen Sie mich alle Fragen wissen
Agilanbu


0

Es gibt eine Lösung für den doppelten Eintrag in der Listenansicht. Sie müssen die onBackPress()Methode für Ihre Aktivität deklarieren und den unten angegebenen Markierungscode notieren:

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    **

    attendence_webdata.clear(); list.setAdapter(null);
    --------------------------------------------------

    **
 }

LOL, natürlich nicht, über welchen doppelten Eintrag sprichst du? Was hat onBackPressed mit dem Löschen von Adaptern zu tun? Weißt du überhaupt, wovon du sprichst?
2Dee

Sry für mein Englisch, aber wenn ich auf die Schaltfläche
klicke

0

Geben Sie einfach den Code ein ListView.Items.Clear(); in Ihre Methode ein


Fügen Sie eine Erklärung mit Antwort hinzu, wie diese Antwort OP bei der Behebung des aktuellen Problems
hilft

-3

Rufen Sie die clear()Methode von Ihrem benutzerdefinierten Adapter aus auf.


clean () ist mit BaseAdapter nicht verfügbar.
Mohamed Gallah

Sie können den Listenansichtsadapter auch auf null setzen.
Carlovv

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.