我的活动由GridView
填充,其中包含 3x3矩阵
LinearLayouts
(ImageViews
)。GridView
。当我试图获得一个位置
一些onResume()
被完全加载后的视图,我得到了正确的结果。
但是,当我尝试从NullPointerException
获取给定位置的视图时,
它给出GridView
。为什么会这样?不是onResume()
由时间private void systemsMove(String userBlock) {
int position, row, column;
String systemsBlock = (userBlock.equalsIgnoreCase("Zero") ? "One" : "Zero");
for (position = 0, row = 0, column = 0;
(mModel.array[row][column] == 0
|| mModel.array[row][column] == 1) && position < 9;
position++) {
row = position / MAX_COLUMN;
column = position % MAX_COLUMN;
}
if (position == 9) finish();
mModel.changeBlock(systemsBlock, row, column);
View view = getViewByPosition(position);
if (view == null)
Log.i(TAG, "The view is NULL!!!");
ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
if (systemsBlock.equalsIgnoreCase("Zero"))
imageView.setImageResource(R.drawable.one);
else if (systemsBlock.equalsIgnoreCase("One"))
imageView.setImageResource(R.drawable.zero);
}
初始化的名称是什么?
这有什么解决方法吗?
我试图获取给定位置视图的部分 -
OnItemClickListener
适用于gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ImageView imageView = (ImageView) view.findViewById(R.id.imageview);
String systemBlock = "";
if (userBlock.equalsIgnoreCase("One")) {
imageView.setImageResource(R.drawable.one);
systemBlock = "Zero";
} else if (userBlock.equalsIgnoreCase("Zero")) {
imageView.setImageResource(R.drawable.zero);
systemBlock = "One";
}
int row = position / MAX_COLUMN;
int column = position % MAX_COLUMN;
mModel.changeBlock(userBlock, row, column);
if (mModel.checkForWin()) {
mModel.deInitialize();
finish();
}
systemsMove(systemBlock);
if (mModel.checkForWin()) {
mModel.deInitialize();
finish();
}
}
});
-
GridView
获取public View getViewByPosition(int position) {
int firstPosition = gridView.getFirstVisiblePosition();
int lastPosition = gridView.getLastVisiblePosition();
if ((position < firstPosition) || (position > lastPosition))
return null;
return gridView.getChildAt(position - firstPosition);
}
中某个位置的查看方法
onResume()
这就是我从protected void onResume() {
super.onResume();
String userBlock = getIntent().getStringExtra("BlockSelected");
if (userBlock.equalsIgnoreCase("Zero")) systemsMove(userBlock);
}
-
{{1}}
答案 0 :(得分:0)
GridView将在第一次布局过程中从适配器填充自身。这意味着它在onCreate()中没有孩子。等待第一个布局传递的最简单方法是使用ViewTreeObserver(请参阅View.getViewTreeObserver())来注册全局布局侦听器。第一次调用侦听器时,网格应包含子节点。
请注意,如果要更改GridView的其中一个子项的背景,您应该从适配器执行此操作。由于视图是循环使用的,因此背景可能会显示为&#34;移动&#34;
以后的另一种观点