3

在我的应用程序中,我使用 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),例如scrollTofakeDrag等,但我想知道 - 这是 ViewPager 的所有功能还是它是一个错误或者我做的事情非常非常错误?

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

4

0 回答 0