9

Die contactsList ist leer, bis die readContacts() Methode ausgeführt wurde, mit anderen Worten, wenn contactsView.setAdapter(adapter) ausgeführt wurde, ist die contactsList leer, also warum dieser Code immer noch die Kontaktdaten korrekt anzeigen kann?Warum muss ich Adapter.notifyDataSetChanged() nicht verwenden?

public class MainActivity extends AppCompatActivity { 

ListView contactsView; 
ArrayAdapter<String> adapter; 
List<String> contactsList = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    contactsView = (ListView) findViewById(R.id.contacts_list); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); 
    contactsView.setAdapter(adapter); 
    readContacts(); 
} 

private void readContacts() { 
    Cursor cursor = null; 
    try { 
     cursor = getContentResolver().query(
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       null, null, null, null); 
     while (cursor.moveToNext()) { 
      String displayName = cursor.getString(cursor.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME 
      )); 
      String number = cursor.getString(cursor.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER 
      )); 
      contactsList.add(displayName + "\n" + number); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
    } 
} 

aber wenn ich so etwas wie dieses hinzufügen, ich habe notifyDataSetChanged() zu nennen:

add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      contactsList.add("blabla"); 
      adapter.notifyDataSetChanged(); 
     } 
    }); 

add Taste ist. jetzt, dass der Android würde die Methode automatisch aufrufen, warum beim Entfernen der adapter.notifyDataSetChanged(); die Benutzeroberfläche konnte nicht aktualisieren?

Antwort

0

Der Punkt ist, dass Sie Daten in einer Reihenfolge eingeben, dh, wenn Sie ein Element in der Liste schob sie den ganzen Weg hinunter geht, u nicht an 4. Geben Sie tat es, 5. jede zufällige Index, so dass Sie nicht haben um notifyDataSetChanged() als seine Definition selbst zu nennen sagt: , dass einige Daten geändert worden sind oder irgendeine Ansicht, die den Datensatz reflektiert, sollte sich erneuern, um die neuen Daten in der Liste sichtbar zu machen, da in diesem Fall Daten aus dem Bereich herausgehen die sichtbaren Liste dh die Anzahl der Kinder in der Liste angezeigt wird, so ist es (das Listview) immer für den nächsten Blick nach diesem bestimmten zuletzt gezeigten Index nennt Wert (Punkt) in der Listenansicht.!

Hoffnung machte ich es ein bisschen klar, Sie ...!

++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ Antwort, nachdem Sie die Frage bearbeitet, nach der Suche und mit meinen eigenen Gedanken und Verständnis in dieser Hinsicht:

im ersten Fall gibt es keine Änderung für den VIEW .. Recht gemacht werden benötigt.? Wenn Ihnen dieser Punkt klar ist, dann kommen Sie auf den zweiten. Zuerst holten Sie Daten aus der DB und fügten dann ein Element in die Liste ein und füllten es dann nach dem Einstellen des Adapters. !! Adapter wurde erst gesetzt, wenn die gesamte Methode ausgeführt und die Liste vervollständigt wurde. OK.

Aber in der zweiten Szenario Sie ändern die VIEW (so ziemlich alles ist Ansicht in Android), also manipulieren Sie eine Ansicht durch Hinzufügen eines anderen Elements auf der bereits bevölkerten Ansicht (die bereits einen Set-Adapter hat) , also musst du dieses mal sagen, hey, ich habe ein Element in dir hinzugefügt, aktualisiere dich und aktualisiere die Liste (dh Display).

+0

danke!aber ich habe eine neue Frage, in der oben genannten aktualisieren :) – HungryMilk

+0

@HungryMilk Hallo, es gibt einen Blick auf die aktualisierte Erklärung und wenn es hilft, es als Antwort zu akzeptieren :) –

+0

Sorry, ich habe vergessen! Danke :) – HungryMilk

1

Diese Methode wird intern im Android Framework aufgerufen. Sie müssen es nicht explizit aufrufen.

Quelle: https://www.udacity.com/course/developing-android-apps--ud853

+0

Ich meine, wenn ich den Adapter einstelle, ist die Liste leer. Und nachdem ich 'readcontacts' verwendet habe, wurde die Liste nicht leer, aber ich habe 'notifydatachanged()' nicht benutzt, um sie zu aktualisieren. Warum kann die Listview immer noch Informationen anzeigen? – HungryMilk

+0

@HungryMilk Wenn der Inhalt der Liste geändert wird, ruft Android Framework automatisch 'notifyDataChanged()' auf. Du musst es also nicht selbst anrufen. – Lilylakshi

+0

danke! aber ich habe eine neue Frage, aktualisieren Sie in der oben genannten :) – HungryMilk

0

Neben Lilys Antwort, wenn Sie Ihren eigenen Adapter schreiben, müssen Sie explizit nennen.