ViewPager中的子编号不一致

时间:2018-10-08 13:38:27

标签: android performance android-viewpager

我有一个ViewPager,其getCount();根据通过构造函数传递的对象列表进行更改。我期望使用adapter.notifyDataSetChanged();看到另一个页面。这似乎正常工作,但是当我从提到的列表中删除一项(用于计算getCount())时,ViewPager仅在offsetLimit之外成功删除该页面。

示例:我有两页,并通过按钮从列表中删除了一个项目。然后我打电话给notifyDataSetChanged(),希望只剩下一页,但是……第二个“页面”仍然在那里,甚至以为我无法滑动到它!!!!

如何解决这个问题?我想避免用片段重新实例化整个ViewPager。

代码(简体)

public class Adapter extends FragmentStatePagerAdapter {

    private final List<String> list;

    public Adapter(FragmentManager fragmentManager, List<String> list) {
        super(fragmentManager);
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

}

这是活动中的内容:

        adapter = new Adapter(getSupportFragmentManager(), items);

        final ViewPager pager = findViewById(R.id.pager);
        pager.setAdapter(adapter);

        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.add("test");
                adapter.notifyDataSetChanged();
            }
        });

        findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                items.remove(items.size() - 1);
                adapter.notifyDataSetChanged();
            }
        });

这样,我可以从Activity添加项目并更新适配器(它可以工作)并删除...它不起作用。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您可以覆盖getItemPosition()并在其中返回POSITION_NONE


getItemPosition()

在宿主视图试图确定项目位置是否已更改时调用。如果给定项目的位置未更改,则返回 POSITION_UNCHANGED ;如果适配器中不再存在该项目,则返回 POSITION_NONE

默认实现假定项目不会改变位置,并且始终返回 POSITION_UNCHANGED