0

基本上,我在警报对话框中创建了一个 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) 都是空的。

开始位置是 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);
            }
        }
    }
}
4

1 回答 1

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);
    }

}
于 2013-04-26T21:36:07.133 回答