具有非唯一标记的ViewPager(cwac-pager)页面未正确初始化

时间:2014-04-21 13:11:09

标签: android commonsware-cwac

我遇到了cwac-pager的问题,我可以在PagerDemo演示项目中重现这个问题。

重现问题的步骤:

  1. 运行PagerDemo项目(初始化10 EditorFragment页)
  2. 删除第2-8页(导航到第2页,然后按删除,直到您离开编辑器#9)
  3. 您现在有3个片段:编辑#1,编辑#9和编辑#10。向左滑动以导航回编辑器#1。
  4. 按+添加页面。首先添加编辑器#4(显然是因为删除后剩下3页)。添加页面,直到您添加到编辑器#10(当前页面左侧可见)。
  5. 向右滑动至编辑器#9。视图未加载(没有编辑文本供您编辑)。编辑#10(右侧)是相同的。向左滑动到编辑器#1左侧的 new 编辑器#9或编辑器#10,这些视图已正确加载。
  6. 如果您此时检查ArrayPagerAdapter中的entries,您会看到它具有正确数量的PageDescriptor,但有些PageDescriptor具有相同的标记,例如“editor9”和“editor10”出现两次。似乎与这些PageDescriptor对应的片段不会加载。

    用于构建标记的演示项目中的代码(以及我的项目中的代码)只是简单地连接字符串和正在创建的片段的位置:

    private String buildTag(int position) {
        return("editor" + String.valueOf(position));
    }
    

    作为一种解决方法,我修改了buildTag以构建随机标记:

    private String buildTag(int position) {
        return("page" + UUID.randomUUID().toString());
    }
    

    我不确定这种解决方法是否会产生意想不到的负面后果?

1 个答案:

答案 0 :(得分:2)

你是对的,这是演示应用中的一个错误,ArrayPagerAdapter可以在这里使用一些防御性编程来检测这种情况并引发异常。我会努力解决这两个问题。 PageDescriptor需要一个唯一标记,而我当前的演示应用算法并不能保证,正如您所发现的那样。我已经为此提交了an issue

在我的脑海中,UUID应该没问题,尽管我可能只是使用一个单调递增的整数计数器。

感谢您指出这一点!