Android-ViewPager+;碎片状态页面雷达&x2B;页面转换器

Android-ViewPager+;碎片状态页面雷达&x2B;页面转换器,android,android-viewpager,fragmentstatepageradapter,android-pagetransformer,Android,Android Viewpager,Fragmentstatepageradapter,Android Pagetransformer,在我的应用程序中,我使用ViewPager和PageTransformer将一些数据列表显示为卡片组。该列表有时会被刷新,并且在常见情况下包含大量项,因此我使用FragmentStatePagerAdapter并设置所需的页面限制: public class PlaceListPagerAdapter extends FragmentStatePagerAdapter { private List<PlaceListData> items; public Plac

在我的应用程序中,我使用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();
    }
}
公共类PlaceListPagerAdapter扩展了FragmentStatePagerAdapter{
私人清单项目;
public PlaceListPagerAdapter(碎片管理器){
高级经理;
items=newarraylist();
}
@凌驾
公共片段getItem(int位置){
String id=items.get(position.getId();
字符串名称=items.get(position.getName();
字符串地址=items.get(position.getAddress();
返回PlaceFragment.newInstance(id、名称、地址);
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
public int getItemPosition(对象){
PlaceFragment frag=(PlaceFragment)对象;
字符串id=frag.getDataId();
对于(PlaceListData:项目){
如果(id!=null&&id.equals(data.getId())){
返回位置_不变;
}
}
返回位置\无;
}
公共无效附加项(列表项){
this.items.addAll(items);
notifyDataSetChanged();
}
公共项目(列表项目){
this.items.clear();
补充项目(项目);
}
公共项目(){
this.items.clear();
notifyDataSetChanged();
}
}
没有异常-POJO列表,覆盖了getItemPosition()和使用notifyDataSetChanged()添加/清除方法。问题是,当我尝试通过网络添加/替换项时,我的transformer的方法transformPage(视图视图,浮动位置)被调用,所有新视图的位置为0.0,并且它们被一个放置在另一个上(转换被破坏)

调试ViewPager类后,我注意到,transformPage(查看视图,浮动位置)仅在ViewPager的onPageScrolled(..)方法中的一个位置调用,后者在第一次布局过程后在onLayout(..)中调用

notifyDataSetChanged()在调用onPageScrolled(..)(和transformPage(视图、浮动位置))和requestLayout()之后。问题在于,第一次调用transformPage(查看视图,浮动位置)发生在布局过程之前,并且位置参数取决于视图。left()返回0,因为未布局子视图。在onLayout(…)中,在requestLayout()mytransformPage(查看视图,浮动位置)后面的onLayout(…)中,根本不调用,因为是的,视图现在已布局,但它不是第一个布局过程

通过重置适配器(将ViewPager中的mFirstLayout标记设置为“true”)或调用调用其代码中调用transformPage(查看视图、浮动位置)的ViewPager的任何公共方法来解决此问题,例如滚动到fakeDrag等,但我想知道——这是ViewPager的一个功能,还是一个bug,或者我做了一些非常错误的事情

对不起,我的英语不好,提前谢谢你