2010-06-01 5 views
23

Ich frage mich, ob es möglich ist, nur ein Element in einer Listview neu zu rendern? Ich nehme an, durch notifyDatasetChanged() werde ich die ganze Liste neu zu rendern?Android: Ist es möglich, nur ein Element in einer Listenansicht zu aktualisieren?

Danke,

+0

in der Tat, notify ... teilt der Liste mit, dass der Adapter geändert wurde. Ich bin mir nicht sicher, ob Sie ein Element nach dem anderen aktualisieren können. – Sephy

+1

Hier ist eine ähnliche Frage SO: http://stackoverflow.com/questions/3724874/android-update-single-item-in-list –

+6

Googler, beachten Sie bitte ** Diese Fragen sind sehr, sehr alt **. Für modernes Android (2014+) verwenden Sie einfach notifyDatasetChanged. es ist unglaublich effizient und nur neu gezeichnet, was auf dem Bildschirm ist. Heutzutage ist es wichtig, das moderne "HolderView" -Muster zu verwenden. Es ist alles kein Problem. – Fattie

Antwort

11

Sie können, aber es ist ein wenig verschachtelt. Sie müssten den Index des ersten sichtbaren Elements in der Liste abrufen und dann bestimmen, wie weit in der Liste der visuellen Elemente das Element, das aktualisiert werden soll, weiter unten ist, dann seine Ansicht abrufen und dort aktualisieren.

Es ist viel einfacher, nur notifyDatasetChanged() zu rufen.

+0

und wie erhalten Sie den Index des ersten Artikels in der Liste sichtbar? Es kann Leistungsgründe geben, warum das Auffrischen der gesamten Liste nicht vorzuziehen ist. – Marchy

+0

Sie müssen nur 'getFirstVisiblePosition()' auf dem ListView aufrufen. http://developer.android.com/reference/android/widget/AdapterView.html#getFirstVisiblePosition() – CaseyB

+0

@CaseyB können Sie mir zu diesem Thema http: // stackoverflow helfen.com/questions/18312539/update-the-wert-der-artikel-in-der-listeansicht-android? noredirect = 1 # comment26873838_18312539 – Developer

3

Auch können Sie verwenden:

myListView.invalidateViews(); 
+4

scheint nicht zu funktionieren. – manmal

+0

Es funktioniert, aber die meiste Zeit neu gezeichnet alle Seite mit einer Verzögerung. – AVEbrahimi

3
dataAdapter.remove(dataAdapter.getItem(clickedpos)); 

dataAdapter.insert(t.getText().toString(), clickedpos); 
1

Sie müssen den Überblick über Ihre Adapter halten (oder benutzerdefinierten Adapter, wenn Sie auf ausgefallene Funktionen festgelegt sind). Wenn Sie die Daten für ein Element ändern, ändern Sie einfach die Felder, die Sie interessieren, in Ihrem Adapter. Dann rufen Sie notifyDatasetChanged, und die Änderungen werden in Ihrer Listview widerspiegeln.

Beachten Sie, dass dieser Ansatz für Galerieansichten genauso funktioniert.

18

Sie können nicht machen (Refresh) eine einzige Reihe, sondern können Sie die gewünschte Ansicht erhalten und chages direkt darauf machen, indem yourListView.getChildAt(int VisiblePosition); Aufruf, wo die visiblePostion die Position in der Listview ist minus yourListView.getFirstVisiblePosition()

Like this :

View v = listViewItems.getChildAt(position - 
      listViewItems.getFirstVisiblePosition()); 
    v.setBackgroundColor(Color.GREEN); 

ich hoffe, das hilft ...

+0

Sicher hat es geholfen..danke viel –

+0

+1: das war genau das, was ich gesucht habe. – PeteH

+0

+10 Dies rettete mich wirklich viel in meiner App Implementierung –

3

Dies ist, wie ich es tat:

Ihre Artikel (Zeilen) müssen eindeutige IDs haben, damit Sie sie später aktualisieren können. Legen Sie das Tag für jede Ansicht fest, wenn die Liste die Ansicht vom Adapter erhält. (Sie können auch Schlüssel-Tag verwenden, wenn der Standard-Tag irgendwo anders verwendet wird)

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View view = super.getView(position, convertView, parent); 
    view.setTag(getItemId(position)); 
    return view; 
} 

Für die Update-Prüfung jedes Element Liste, wenn eine Ansicht mit angegebener ID ist es sichtbar und Update muss auf mich durchgeführt werden.

Es ist tatsächlich einfacher als andere Methoden und besser, wenn Sie mit Ids nicht Positionen beschäftigen! Außerdem müssen Sie das Szenario in Betracht ziehen, wenn Ihre Ansicht unsichtbar und wieder sichtbar wird.

+0

Die Tag-Idee half mir in meinem Fall - Ich hatte dynamische Zahlen von Ansichten aus der gleichen Layout-Datei aufgebläht und musste irgendwie überprüfen, welche ich war wechseln. – JakeP

Verwandte Themen