android - 如何扩展像 GridView 这样复杂的 Android View ?

标签 android gridview custom-controls android-custom-view

背景:

我正在寻找一种扩展 GridView 的方法,我需要像在 HTML 中一样实现 col- 和 row-span。我有很多元素,所以我不能使用例如一个 TableLayout。然而,这将过于本地化。到目前为止,我将问题简化为如何扩展 GridView?

我尝试过的和我失败的地方:

我的第一个方法是查看我需要替换哪些方法,我发现了一些无法覆盖的私有(private)方法。因此,我尝试将孔源代码从 GridView 复制到一个名为 CustomGrid 的新类中。这是一个可怕的失败,因为我无法访问 com.android.internal.R 类。

然后我放弃了那个想法,看看我是否可以正常扩展类并用自定义副本替换所有私有(private)方法。我拿了一支笔,建了一棵大树,所有的方法都用上了。

在找到所有引用后,我尝试扩展类 normal 并添加了第一个方法:

private View fillDown(int pos, int nextTop) {
    View selectedView = null;

    int end = (mBottom - mTop);
    if((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
        end -= mListPadding.bottom;
    }

    // ...

这是我的下一个问题,成员变量 mBottommTop 是未知的。我对源代码进行了一些挖掘,最终在 View 类中找到了它们,但不幸的是它们被隐藏了。

/**
 * The distance in pixels from the top edge of this view's parent
 * to the bottom edge of this view.
 * {@hide}
 */
@ViewDebug.ExportedProperty(category = "layout")
protected int mBottom;

问题:

我如何扩展 GridView 而不会遇到这种情况并且不使用大量反射?我的意思是,将其编写为纯自定义控件似乎是不可能的。

最佳答案

How can I extend the GridView without hiting that limentations and without the usage of massive reflection?

很可能,你不知道。您将代码复制到您的项目中并进行修改以适合,包括所有必需的父类(super class)(直至 ViewGroup)。如果您可以通过 GridView 的一个简单子(monad)类实现您的目标,我将感到震惊。您甚至可能必须从头开始完全编写所需的小部件。

That was a terrible failior due I cannot access the com.android.internal.R class.

您还需要复制相关资源,然后修复 R 引用以指向您自己的资源。

but unforcantly they are hidden.

您找到获取此数据的其他方法。例如mBottom,可以改为getBottom()

关于android - 如何扩展像 GridView 这样复杂的 Android View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16789692/

相关文章:

asp.net - 如何在代码隐藏中获取 aspx 中的 DataKeyNames?

macos - OSX 中的自定义 slider

android - onProgressChanged 在繁重的网站上没有达到 100%

android - 如何在Android Studio中手动安装Android SDK

android - 更新 Android 上的未接来电通知

c# - 忽略数据集中不存在的列(绑定(bind)字段)

android - 如何重复图像的某些部分

java - 元素的 Gridview 对齐

.net - 如何在自定义 CF 控件中覆盖 Ambient BackColor

ios - 如何在 iOS 中创建自定义控件?