GridView子项无缘无故

时间:2013-04-26 20:42:10

标签: java android gridview

基本上,我在一个警告对话框中创建了一个GridView。我正常设置一个数组适配器,它会显示数组中的所有内容。但是稍后在代码中,我想在GridView中突出显示特定值,通过更改背景颜色,它会抛出空指针异常。我知道它是哪一行,但它应该包含儿童,但不包含。

GridView创建如下:

GridView g = new GridView(this);

final ArrayAdapter<String> Wordadapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.style,WordSearch);

String[] lag = WordSearch;
g.setId(2);
g.setBackgroundColor(getResources().getColor(android.R.color.black));
g.setHorizontalSpacing(-20);
g.setPadding(60,5, 10, 5);
g.setAdapter(Wordadapter);
g.setNumColumns(Length);

我试着像这样改变颜色

for(int j = StartPosition; j  <= EndPos; j= j + Length) {
    g = (GridView) findViewById(2);
    g.getChildAt(j).setBackgroundColor(Color.BLUE);
}

for循环中的行抛出空指针。当我在g上检查子项时,即使数组中有121个元素,所有子项(12)都为null。

起始位置为21,结束位置为109,长度为15,因此如果值有问题,则在第一次迭代时不会中断。

有什么想法吗?

额外代码:

AlertDialog.Builder aBuilder = new AlertDialog.Builder(this);

// set title
aBuilder.setTitle("The solution");

GridView g = new GridView(this);

final ArrayAdapter<String> Wordadapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.style,WordSearch);

String[] slag = WordSearch;
g.setId(1);
g.setBackgroundColor(getResources().getColor(android.R.color.black));
g.setHorizontalSpacing(-20);
g.setPadding(60,5, 10, 5);
g.setAdapter(Wordadapter);
g.setNumColumns(Length);

for(int i =0; i < Directions.length;i++) {
    int EndPos;
    int StartPosition = StartPos[i];
    int Direction = Directions[i];
    int Word = wordLengths[i];

    EndPos =  GetEndPosition(Direction,Word,StartPosition);

    int difference = StartPosition - EndPos;

    if ( Direction == 1)// direction down (1) {
        difference = difference  * -1;

        if( difference % Length == 0) {
            for(int j = StartPosition; j  <= EndPos; j= j + Length) {
                g = (GridView) Puzzle_Activity.this.findViewById(2);
                g.getChildAt(j).setBackgroundColor(Color.BLUE);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

GridView会回收其子视图 - 因此只有当前可见的子项是!= null。因此,您只能更改当前屏幕上的视图。在一端出去的那些在另一端回来,只有他们的内容改变。这是因为在处理大数据集时出于性能原因。您要么尝试提前更新视图(在它们出现之前),要么在更新视图时至少有一个视图不在屏幕上。 如果要更改屏幕上没有的视图,则应将其保存在背景模型中 - 例如,某些设置带有标记的单词。然后在视图进入时对其进行标记。您需要为此编写自己的适配器 - 但这很容易。

您可以通过执行此类操作来访问屏幕上的视图。请注意,第一个可见视图是索引为0的视图 - 因此您需要添加第一个可见的视图。

//Note that i find the grid before the loop since findViewById can be slow especially if you repeat them.
g = (GridView) findViewById(2);
int childcount = g.getChildCount();
int firstPos = g.getFirstVisiblePosition();

for ( int i = 0; i < childcount; i++ ) {
    int posInArray = firstpos + i;

    if (posInArray == whatEverYouWantedToMark)
    {
        g.getChildAt(i).setBackgroundColor(Color.BLUE);
    }

}