基本上,我在一个警告对话框中创建了一个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);
}
}
}
}
答案 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);
}
}