GridView的孩子有时候不会画画

时间:2013-02-24 12:16:19

标签: android android-gridview

我有一个带有自定义视图的GridView,它基本上看起来像按钮。 gridview开始时没有子节点,每次用户按下按钮时,都会添加另一个自定义视图。

这有一些奇怪的行为。我正在onDraw上的自定义视图中绘制文本,线条等内容,有时它们会被绘制。他们完全是空白的。对于哪些视图显示或不显示绘制的图形,行为似乎是随机的。

我觉得这与我设置布局参数有关。我将子视图创建后存储在数组中,并在getView()中返回与position参数相关的视图。所以我只为每个位置创建一次按钮。

所以我有两个问题。

  1. 我在做什么导致这种情况?

  2. 我是否应该使用gridview来处理我的工作?

  3. 获取视图的代码是:

    public View getView(int position, View convertView, ViewGroup parent) 
        {
            GridButton button;
            GridView gridView = (GridView)parent;
            if(childBuittons.size() <= position) //if we need to create a new button
            {
                    button = createButton(position);
                    int nWidth = getButtonSize(gridView);
                    GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth);
                    button.setLayoutParams(params);
            }
            else //we already have a button that we created
            {
                button = buttons.get(position);
            }
            return button;
        }
    

    更多信息: - gridbutton类只是一个扩展View和覆盖onDraw的类,用于绘制一些图形,如文本和线条 - 我想要实现的是用户可以添加或删除的方格网格(虽然它们不经常这样做)然后按方块来执行某些功能 - 可能会有比屏幕上更多的正方形

1 个答案:

答案 0 :(得分:0)

  

我在做什么导致这个?

如果没有提供与GridButton类相关的更多细节,没有人可以真正帮助您。最好知道如何处理视图的测量以及在该视图中准确绘制的内容(以及如何)。

  

我觉得这与我设置布局参数有关。

我怀疑这一点。为了确保您还可以在该自定义视图中绘制一个简单的颜色,并查看它是否出现在网格上。如果确实如此,LayoutParams不是发生了什么的原因。还要检查nWidth的值。

  

我将子视图创建后存储在一个数组中   getView()我返回与position参数相关的视图。所以我   只为每个位置创建一次按钮。

这不行。使用GridView的主要原因是您可以使用其适配器来避免必须预先创建所有网格视图(占用内存(如果没有崩溃)和减慢您的应用程序)。您应该考虑实施特定于GridView / ListView的正确回收机制。您的getView()方法应该是这样的:

View getView(int position, View convertView, ViewGroup parent) {
    GridButton button;
    GridView gridView = (GridView)parent;
    if(convertView == null) {
            button = createButton(position);
            int nWidth = getButtonSize(gridView);
            GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth);
            button.setLayoutParams(params);
    } else {
        button = (GridButton) convertView;
    }
    return button;
}

如果您需要访问这些按钮,请通过适配器访问它们,根据按钮的位置更改一些数据并调用notifyDataSetChanged()

  

我是否应该使用gridview来处理我正在做的事情?

你没有说你想做什么。如果您认为单元格的数量足够高并且预计不会看到所有单元格,则使用GridView。如果您认为所有单元格都可见,那么您可以使用标准布局制作该网格而不使用GridView