【问题标题】:Adding Views Between Items in GridView在 GridView 中的项目之间添加视图
【发布时间】:2017-05-28 21:12:25
【问题描述】:

我有一个可滚动的 GridView,其中项目之间有相当数量的空白空间。对于网格中的一些对象,我想添加从一个到另一个的箭头图像

关于我的意思,想想魔兽世界的天赋树(http://calculators.iradei.eu/talents/mage)。你会看到一些天赋有从一个项目指向另一个项目的箭头。

我正在处理的布局只包含一个框架布局中的网格视图,没有别的

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <GridView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="4"
        android:scrollbars="none"
        android:id="@+id/talent_tree_grid_view">
    </GridView>

</FrameLayout>

我正在尝试在代码中添加这些 ImageView,因为我认为没有任何方法可以将此逻辑添加到 GridView 的适配器中。

我尝试根据 GridView 项的 x 和 y 坐标将它们添加为父 FrameLayout 的子级,这可行,但是在滚动 GridView 时,箭头不会滚动

我也尝试将它们直接添加为 GridView 的子项,但它不支持这种行为(它会抛出 java.lang.UnsupportedOperationException)

对于如何在 gridview 项之间添加这些图像视图有什么想法吗?

【问题讨论】:

  • 您可能想要扩展 GridLayout 并添加您自己的绘图
  • 您可以做的一件事是,您可以将箭头图像添加到您的 gridview 项目中,并在满足某些条件时显示它们,但我认为这不太合适。
  • 我已更新我的答案以包含一个演示项目。

标签: android gridview


【解决方案1】:

这听起来与 Romain Guy 的“书架”应用程序非常相似,其中使用了自定义 GridView 和书架滚动的背景图像。看看项目here。自定义 GridView 的源代码可以在源代码中的文件 ShelvesView.java 中找到。 Guy Romain 的简短介绍是 here;

对于箭头,您可能需要考虑9-patch drawable


我对上述方法进行了更多研究,并有一个基于 谷歌的Hello GridView example

以这个示例应用程序为例,我构建了一个自定义 GridView (DogsGridView.java) 并将照片连接到空单元格中,类似于您的魔兽世界人才树示例。我只是使用简单的线条,但可以修改该类以用箭头或其他图形连接单元格。

这是一个带有连接线的quick video。这是another,带有 9 个补丁箭头。

项目源码可以在here找到。

【讨论】:

  • 感谢您的回答 Cheticamp!它有效,但是我在滚动时遇到了性能问题,因为我认为连接箭头不断被重绘?我最终可能会实施一个解决方案,该解决方案涉及在网格视图项(在我的情况下是框架布局)中绘制箭头片段。因此,箭头起源的项目将具有箭头的第一部分,中间的任何空网格空间将具有中间部分,而箭头结束的最终网格项目将具有箭头的终点。如果我能正常工作,我会在此处发布该答案。
  • @Dportology 我不知道你什么时候提取了源代码,但我昨天通过从子检查循环中拉出对dispathDraw 的 super 的调用来实现了一些性能改进。在那之后,我看到我的模拟器有了显着的改进。您可能需要考虑在自定义 GridView 内绘制最大图形一次,然后根据需要进行裁剪和复制,而不是将其拆分并放在网格视图项中。
  • @Dportology 由于我循环的方式,箭头被多次绘制。我已经将搜索更改为跟随列而不是行,所以这应该会执行得更好。每个可见位置应该只考虑一次。 GitHub 有更新。