9

contactsList jest pusta do czasu wykonania metody readContacts(), innymi słowy, gdy wykonano contactsView.setAdapter(adapter), contactsList jest pusta, więc dlaczego ten kod nadal może poprawnie wyświetlać informacje o kontaktach?Dlaczego nie muszę używać Adapter.notifyDataSetChanged()?

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

ale jeśli mogę dodać coś takiego, mam zadzwonić notifyDataSetChanged():

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

add jest przycisk. teraz, gdy android automatycznie wywoła tę metodę, dlaczego po usunięciu interfejsu użytkownika nie można odświeżyć interfejsu użytkownika?

Odpowiedz

0

Chodzi o to, że wprowadzasz dane do Zakonu, tj. Kiedy pchnąłeś element na liście, który sięga aż do dołu, nie wprowadziłeś go na 4., 5. żaden indeks losowy, więc nie masz wywołanie notifyDataSetChanged(), jak sama definicja mówi: , że niektóre dane zostały zmienione lub jakikolwiek widok odzwierciedlający zestaw danych powinien odświeżyć się, aby nowe dane były widoczne na liście, ponieważ w tym przypadku dane wychodzą z zakresu z widocznej listy, tj. liczba dzieci wyświetlanych na liście, więc (ListView) zawsze wywołuje widoki następnego po tej konkretnej ostatnio pokazywanej wartości indeksu (pozycji) na liścieView.!

Mam nadzieję, że zrobiłem to dla ciebie trochę ...!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++ Odpowiedź po edycji pytania, po przeszukaniu i posiadaniu własnych przemyśleń i ustaleń w tym zakresie:

W pierwszym przypadku nie było potrzeby zmiany w stosunku do WIDOK: .. W prawo.? Jeśli ten punkt jest dla ciebie jasny, przyjdź do drugiego. Najpierw pobrano dane z bazy danych, a następnie dodano element na liście, a następnie zapełniono nim po ustawieniu adaptera. Adapter nie został ustawiony, dopóki cała metoda nie wykona i zakończy Listę! OK.

W drugim scenariuszu zmieniasz WIDOK (prawie wszystko jest w widoku Android), więc manipulujesz widokiem, dodając kolejny element do już zapełnionego widoku (który ma już ustawiony adapter) , więc tym razem musisz powiedzieć widokowi, że hej, dodałem przedmiot w tobie teraz odśwież się, a następnie zaktualizuj listę (tj. wyświetlacz).

+0

dzięki!ale mam nowe pytanie, odśwież się w powyższym :) – HungryMilk

+0

@HungryMilk Witam mam na uaktualnione wyjaśnienie i czy to pomaga zaakceptować to jako odpowiedź :) –

+0

Przepraszam, zapomniałem! Dziękuję Ci :) – HungryMilk

1

Ta metoda jest wywoływana wewnętrznie w systemie Android. Nie musisz tego wyraźnie wywoływać.

źródło: https://www.udacity.com/course/developing-android-apps--ud853

+0

Mam na myśli, że po ustawieniu adaptera lista jest pusta. I po użyciu "readcontacts" lista nie stała się pusta, ale nie użyłem 'notifydatachanged()', aby ją odświeżyć. Dlaczego więc lista wciąż może wyświetlać informacje? – HungryMilk

+0

@HungryMilk Gdy zawartość listy zostanie zmieniona, system Android automatycznie wywoła funkcję 'notifyDataChanged()'. Więc nie musisz tego nazywać sam. – Lilylakshi

+0

dzięki! ale mam nowe pytanie, odśwież w powyższym :) – HungryMilk

0

Oprócz odpowiedzi Lily, jeśli piszesz własny zasilacz, trzeba nazwać wprost.