2016-04-18 7 views
0

リストアダプターのnotifyDatasetChanged()を処理するための2つのパターンに気づきました。私は2つを区別するものと、他のものよりも優れているものがあるかどうか疑問に思っていました。データセットのアクティビティ/フラグメント内のローカル変数を保持まずフラグメント/アクティビティ内または直接アダプター内のデータセットを更新

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

そしてローカル変数の変更は、アクティビティ/フラグメントでこれを呼び出す:断片にアダプターに空DatasetSet配列を渡す

adapter.notifyDataSetChanged(); 

セカンド

/アクティビティ。

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

とデータを呼び出し、この変更または取得されたとき:

mAdapter.setEmployees(data); 

Adapterクラス自体は、この方法を表す:

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

答えて

1

を第2のオプションは、それように素晴らしいことができますアダプターにアイテムを正しく追加する方法のロジックをカプセル化します。複数の場所でこれを行う場合は、例としてデータを更新した後にnotifyDataSetChanged()に電話することを忘れないでください。

ただし、3つ目のオプションもあります。 ArrayAdapterに直接アイテムを追加したり削除したりすることができます。デフォルトでは、notifyDataSetChanged()が内部で呼び出されます。

ArrayAdapterには、要素を変更する次のメソッドがあり、setNotifyOnChange(false)を呼び出さない限り、これらのメソッドは内部でnotifyDataSetChanged()を呼び出します。あなたがmAdapter.addAll(data)を行うことができますよう

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

だから第二の例のためにあなたが本当にsetEmployees()方法を必要としません。

関連する問題