【问题标题】:ViewPager for custom View with canvas objectsViewPager 用于带有画布对象的自定义视图
【发布时间】:2013-06-27 14:00:12
【问题描述】:

我正在寻找一种解决方案来实现自定义视图的 ViewPager。有很多关于 ViewPager 的教程可以扩展 xml 布局,但我找不到自定义视图的示例。 我的自定义 View 类在画布上绘制多个对象(带有文本的圆圈)。 通过实现 OnTouchListener 可以移动和缩放对象。 对象是动态生成的(文本来自 ArrayList)

在 Activity 中,我用不同的参数实例化了一个新视图:

this.mRenderCircleView = new RenderCircleView(this, resultList, showDemo);

resultList 包含一个ArrayList<ArrayList<String>>,其中包含要在 RenderCircleView 中绘制的圆圈。 我想在这种情况下实现 ViewPager,如果 ArrayList ( > 5 ) 中有很多圆形项目,并且由于性能问题,以前创建和加载所有视图会很糟糕。所以我认为最好的选择是 FragmentStatePagerAdapter。这应该是交互式内容的更好解决方案。

但我无法弄清楚它是如何工作的。 Fragments 的数量取决于给定 ArrayList 的大小除以应该在 RenderCircleView 中绘制的元素的数量。例如 ArrayList 大小为 20,每页应绘制 5 个圆形对象,那么我需要 4 个页面(片段)。

在这种情况下使用 ViewPager 最简单的方法是什么?

【问题讨论】:

    标签: android android-viewpager android-canvas


    【解决方案1】:

    如果我理解正确的话,resultList 中的每个条目都代表一个圆圈。 使用 FragmentStatePagerAdapter 确实是个好主意。

    你可以这样解决:

    您的 Activity 使用 ViewPager 对象托管布局。 ViewPager 托管一个片段列表,我们将它们命名为 CircleFragment。 CircleFragment 有一个带有 RenderCircleView 的布局。

    在实例化 CircleFragment 时,将 ArrayList 放入 Fragment.setArguments(Bundle) 并在 CircleFragment 的视图膨胀时检索它们。 (参见关于放置数组列表的编辑)

    在您的 Activity 中:创建所需数量的 CircleFragment 并将它们放入您将用于 ViewPager 的 FragmentStatePagerAdapter。

    编辑(关于将ArrayList<ArrayList<String>> 放入Fragment.setArguments(Bundle)

    ArrayList 实现了 Serializable 接口。如果你看一个 Bundle,你可以在里面放一个 Serializable ! Java 负责序列化它。小菜一碟:)

    Bundle.putSerializable(String key, Serializable value) Bundle.getSerializable(String key)

    EDIT 2(关于使用Fragment.onCreateView()

    充气机在那里以防万一(!)您需要它。只需保留充气机的原样,实例化RenderCircleView(就像您在原始代码中所做的那样)并在Fragment.onCreateView 中返回它。您可能想在其周围包裹一个LinearLayoutRelativeLayout,以便更好地控制RenderCircleView 的位置。

    【讨论】:

    • 是的,这正是我想要实现的。我将尝试实现这一点并在此处发布我的结果。我不知道我可以使用 setArguments 来检索数据。
    • ArrayList>类型的参数怎么可能放,Bundle不支持这个类型。
    • 好的,谢谢!但是在这种情况下,如何在Fragment 类的onCreateView 中使用inflater? inflater 参数仅匹配布局 xml 的 id 而不是自定义 View RenderCircleView。我正在关注这个tutorial
    • 充气机在那里以防万一(!)您需要它。只需保留充气机的原样,实例化RenderCircleView(就像您在原始代码中所做的那样)并在Fragment.onCreateView 中返回它。您可能希望在其周围包裹一个LinearLayoutRelativeLayout,以便更好地控制RenderCircleView 的位置。
    • 太棒了......终于它工作了。非常感谢!我正在努力让充气机工作......但我认为由于 ViewPager 触摸特定对象时无法在屏幕上添加弹出对话框!?
    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多