首次制作 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),并且最后两个组视图似乎正在正确更新。但是,添加的那个和原来的第一个仍然没有更新。我已经更新了 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
就是这样。