在GridView的某个位置获取视图会产生NullPointerException

时间:2014-12-17 10:34:40

标签: android gridview android-adapter

我的活动由GridView填充,其中包含 3x3矩阵 LinearLayoutsImageViews)。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

this SO question -

获取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}}

1 个答案:

答案 0 :(得分:0)

GridView将在第一次布局过程中从适配器填充自身。这意味着它在onCreate()中没有孩子。等待第一个布局传递的最简单方法是使用ViewTreeObserver(请参阅View.getViewTreeObserver())来注册全局布局侦听器。第一次调用侦听器时,网格应包含子节点。

请注意,如果要更改GridView的其中一个子项的背景,您应该从适配器执行此操作。由于视图是循环使用的,因此背景可能会显示为&#34;移动&#34;

以后的另一种观点