FragmentPagerAdapter が最初に作成されたときは、すべて問題ありません。ただし、アダプターの特定の位置でデータが追加または削除されると、ビューは元の位置にとどまります。
これは、私の WIP アプリの問題を示すビデオです。これは、問題を再現するために使用できる私のアプリの APKです。私の完全なコードは、私のGitHub プロジェクトで見ることができます。
これが私のアダプターコードです(こちらからも入手できます):
public class TaskListFragmentAdapter extends FragmentPagerAdapter {
private static final String TAG = "TaskListFragmentAdapter";
public ArrayList<Group> groups;
/**
* Fill constructor
* @param fm The FragmentManager to use
* @param groups The groups to display
*/
public TaskListFragmentAdapter(FragmentManager fm, ArrayList<Group> groups) {
super(fm);
this.groups = groups;
}
/* (non-Javadoc)
* Gets the fragment at position
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public TaskListFragment getItem(int position) {
Log.v(TAG, "Getting item " + position);
return TaskListFragment.newInstance(groups.get(position));
}
/* (non-Javadoc)
* Gets the position of a fragment
* @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
*/
@Override
public int getItemPosition(Object o) {
TaskListFragment item = (TaskListFragment) o;
int position = groups.indexOf(item.group);
if(position >= 0) {
Log.v(TAG, "Item found at index " + position + ": " + item.group.toString());
return position;
} else {
Log.v(TAG, "Item not found");
return POSITION_NONE;
}
}
/* (non-Javadoc)
* Gets the count of fragments
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return groups.size();
}
/* (non-Javadoc)
* Gets the title of a fragment
* @see android.support.v4.view.PagerAdapter#getPageTitle(int)
*/
@Override
public CharSequence getPageTitle(int position) {
return groups.get(position).getName();
}
}
データを変更する方法は簡単です。アクティビティにgroups
ArrayList があり、 を使用して変更されgroups.add(position, item)
ます。その後、アクティビティは次のことを行います。
adapter.groups = groups;
adapter.notifyDataSetChanged();
アップデート:
コードを少し修正し、適切な .equals() メソッドをグループに追加したところ、結果が少し変わりました。
getItemPosition
最初にグループを挿入すると、(位置 1 と 2 に対して) が 2 回呼び出され、最後の 2 つのグループ ビューが正しく更新されているようです。ただし、追加されたものと元の最初のものはまだ更新されていません。APKを更新しました。
グループが最初に挿入され、データセットが変更されたときのアダプターからの完全な出力を次に示します。
V/TaskListFragmentAdapter(3597): Item found at index 1: com.gawdl3y.android.tasktimer.classes.Group@b3336038
V/TaskListFragmentAdapter(3597): Item found at index 2: com.gawdl3y.android.tasktimer.classes.Group@b330f330
それでおしまい。