2016-04-18 1 views
0

Ich habe zwei Muster für die Handhabung eines Listenadapters notifyDatasetChanged() festgestellt. Ich fragte mich, was unterscheidet die beiden und wenn einer besser als der andere ist.Update Datensatz innerhalb Fragment/Aktivität oder direkt im Adapter

Erste

eine lokale Variable in der Aktivität Holding/Fragment für den Datensatz.

private List<Movie> movieList; 
private SwipeListAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listView = (ListView) findViewById(R.id.listView); 
    swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); 

    movieList = new ArrayList<>(); 
    adapter = new SwipeListAdapter(this, movieList); 

Und dann, wenn die lokale Variable ändert, rufen Sie diese in der Aktivität/Fragment:

adapter.notifyDataSetChanged(); 

Zweite

eine leere DatasetSet Array an den Adapter in dem Fragment/Aktivität Passing .

EmployeeAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mAdapter = new EmployeeAdapter(this, new ArrayList<Employee>()); 
     ListView employeeListView = (ListView) findViewById(R.id.employees); 
     employeeListView.setAdapter(mAdapter); 
} 

und wenn die Daten geändert oder abgerufen Aufruf folgt aus:

mAdapter.setEmployees(data); 

, die dieses Verfahren in der sich Adapter Klasse repräsentiert:

public void setEmployees(List<Employee> data) { 
    employees.addAll(data); 
    notifyDataSetChanged(); 
} 

Antwort

1

Die zweite Option, da es schön sein kann kapselt die Logik ein, wie Objekte dem Adapter ordnungsgemäß hinzugefügt werden. Wenn Sie dies an mehreren Stellen tun, werden Sie nicht vergessen, notifyDataSetChanged() nach dem Aktualisieren der Daten als Beispiel aufzurufen.

Es gibt jedoch auch eine dritte Option. Sie können Elemente direkt auf der ArrayAdapter hinzufügen und entfernen und standardmäßig notifyDataSetChanged() intern aufrufen.

Die ArrayAdapter hat die folgenden Methoden, um ihre Elemente zu ändern, und der Aufruf dieser Methoden ruft intern notifyDataSetChanged() auf, solange Sie nicht setNotifyOnChange(false) aufrufen.

addAll(Collection<? extends T> collection) 
addAll(T ... items) 
insert(T object, int index) 
remove(T object) 
clear() 

So für das zweite Beispiel die Zustellung setEmployees() Methode nicht wirklich brauchen, wie Sie mAdapter.addAll(data) tun können.

Verwandte Themen