在我的应用程序中,我使用 ViewPager 和 PageTransformer 将一些数据列表显示为卡片组。该列表有时会刷新,并且在常见情况下它包含大量项目,因此我使用带有所需页面限制的 FragmentStatePagerAdapter:
public class PlaceListPagerAdapter extends FragmentStatePagerAdapter {
private List<PlaceListData> items;
public PlaceListPagerAdapter (FragmentManager manager) {
super (manager);
items = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
String id = items.get(position).getId();
String name = items.get(position).getName();
String address = items.get(position).getAddress();
return PlaceFragment.newInstance(id, name, address);
}
@Override
public int getCount() {
return items.size();
}
@Override
public int getItemPosition(Object object) {
PlaceFragment frag = (PlaceFragment) object;
String id = frag.getDataId();
for (PlaceListData data : items) {
if (id != null && id.equals(data.getId())) {
return POSITION_UNCHANGED;
}
}
return POSITION_NONE;
}
public void addItems(List<PlaceListData> items) {
this.items.addAll(items);
notifyDataSetChanged();
}
public void replaceItems(List<PlaceListData> items) {
this.items.clear();
addItems(items);
}
public void clearItems () {
this.items.clear();
notifyDataSetChanged();
}
}
没有什么不寻常的 - pojos 列表,覆盖 getItemPosition() 和使用 notifyDataSetChanged() 添加/清除方法。问题是当我尝试通过网络添加/替换项目时,我的转换器的方法transformPage(View view, float position)被调用为所有新视图的 0.0 位置,并且它们被放置在另一个上(转换被破坏)。
在调试 ViewPager 类后,我注意到transformPage(View view, float position)仅在 ViewPager 的onPageScrolled(..)方法中的一个位置调用,而后者在第一次布局传递后在onLayout(..)中调用。
notifyDataSetChanged() 调用onPageScrolled(..)(和transformPage(View view, float position)分别)和requestLayout()之后。问题是transformPage(View view, float position)的第一次调用发生在布局传递之前,并且位置参数取决于View.left(),它返回0,因为子视图没有布局。在requestLayout()之后的onLayout(..)中,我的transformPage(View view, float position)根本没有被调用,因为是的,现在已经对视图进行了布局,但这不是第一次布局传递。
通过重置适配器(它将ViewPager 中的mFirstLayout标志设置为“true”)或通过调用 ViewPager 的任何公共方法来解决该问题,该方法在其代码中调用transformPage(View view, float position),例如scrollTo,fakeDrag等,但我想知道 - 这是 ViewPager 的所有功能还是它是一个错误或者我做的事情非常非常错误?
对不起我的英语不好,提前谢谢!