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;
    }

}
Mohamed Gallah
quelle

Antworten:

198

Einfach schreiben

listView.setAdapter(null);
mikepenz
quelle
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

Maragues
quelle
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);
zheek
quelle
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();
        }
    };;
Zeeshan
quelle
1

Einfach funktioniert es mir :)

YourArrayList_Object.clear();
Agilanbu
quelle
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

Entfernen Sie Ihre Artikel von Ihrem benutzerdefinierten Adapter und rufen Sie an notifyDataSetChanged().

mreichelt
quelle
5
Die Verwendung von notifyDataSetChanged () hat keine Auswirkungen auf den Listenansichtskonflikt.
Mohamed Gallah
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);
    --------------------------------------------------

    **
 }
Arpit Patel
quelle
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

Charles
quelle
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.

carlovv
quelle
clean () ist mit BaseAdapter nicht verfügbar.
Mohamed Gallah
Sie können den Listenansichtsadapter auch auf null setzen.
Carlovv
-4

Sie müssen beide clear()von ArrayAdapter und notifyDataSetChanged()beide aufrufen .

Unten ist Linkklick

Hare Krishna
quelle