Android GridLayout 只显示最后一个 child
Android GridLayout only shows last child
我是 Android 开发的新手。我一直在使用 GridLayout 来显示动态插入的 ImageView。
我的问题位于 "onFocusWindowChanged",但我将我的 onCreate 粘贴到我分配图像的位置。
private List<Behavior> behaviors = null;
private static int NUM_OF_COLUMNS = 2;
private List<ImageView> images;
private GridLayout grid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_behaviors);
XMLPullParserHandler parser = new XMLPullParserHandler();
try {
behaviors = parser.parse(getAssets().open("catagories.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
grid = (GridLayout) findViewById(R.id.behaviorGrid);
images = new ArrayList<ImageView>();
grid.setColumnCount(NUM_OF_COLUMNS);
grid.setRowCount(behaviors.size() / NUM_OF_COLUMNS);
for (Behavior behavior : behaviors)
images.add(this.getImageViewFromName(behavior.getName()));
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
View view = (View) findViewById(R.id.scrollView);
int width = (int) (view.getWidth() * .45);
Log.i("ViewWidth", Integer.toString(width));
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.height = width;
lp.width = width;
int childCount = images.size();
ImageView image;
for (int i = 0; i < childCount-1; i++) {
image = images.get(i);
image.setLayoutParams(lp);
grid.addView(image);
}
}
在我(短暂的)之前的经验中,使用
grid.add(View);
工作正常,但现在我只看到最后一个 child 显示。通过调试器,我可以看到 gridview 中填充的不仅仅是最后一个元素,还有最后一个图像视图。
感谢您的帮助
所以我解决了我的问题,虽然我不确定如何-
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
改为...
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(x,y);
让它如我所愿地工作。但我不确定为什么 - 如果有人可以解释,请做:)
您应该为每个 ImageView 创建一个 GridLayout.LayoutParams:
for (int i = 0; i < childCount-1; i++) {
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.height = width;
lp.width = width;
......
}
GridLayout.LayoutParams 包含位置信息,例如 [column:2, row:3]。在您的代码中,所有 ImageView 都设置为相同 GridLayout.LayoutParams,因此它们位于同一单元格中(彼此重叠)。
当使用LinearLayout.LayoutParams代替时,其中没有位置信息。 GridLayout 将为每个子视图创建一个新的 GridLayout.LayoutParams,因此所有 ImageView 都使用自己不同的 GridLayout.LayoutParams 和位置。
希望对您有所帮助。您可以阅读 GridLayout.java 和 ViewGroup.java 了解更多详情。
我是 Android 开发的新手。我一直在使用 GridLayout 来显示动态插入的 ImageView。
我的问题位于 "onFocusWindowChanged",但我将我的 onCreate 粘贴到我分配图像的位置。
private List<Behavior> behaviors = null;
private static int NUM_OF_COLUMNS = 2;
private List<ImageView> images;
private GridLayout grid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_behaviors);
XMLPullParserHandler parser = new XMLPullParserHandler();
try {
behaviors = parser.parse(getAssets().open("catagories.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
grid = (GridLayout) findViewById(R.id.behaviorGrid);
images = new ArrayList<ImageView>();
grid.setColumnCount(NUM_OF_COLUMNS);
grid.setRowCount(behaviors.size() / NUM_OF_COLUMNS);
for (Behavior behavior : behaviors)
images.add(this.getImageViewFromName(behavior.getName()));
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
View view = (View) findViewById(R.id.scrollView);
int width = (int) (view.getWidth() * .45);
Log.i("ViewWidth", Integer.toString(width));
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.height = width;
lp.width = width;
int childCount = images.size();
ImageView image;
for (int i = 0; i < childCount-1; i++) {
image = images.get(i);
image.setLayoutParams(lp);
grid.addView(image);
}
}
在我(短暂的)之前的经验中,使用
grid.add(View);
工作正常,但现在我只看到最后一个 child 显示。通过调试器,我可以看到 gridview 中填充的不仅仅是最后一个元素,还有最后一个图像视图。
感谢您的帮助
所以我解决了我的问题,虽然我不确定如何-
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
改为...
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(x,y);
让它如我所愿地工作。但我不确定为什么 - 如果有人可以解释,请做:)
您应该为每个 ImageView 创建一个 GridLayout.LayoutParams:
for (int i = 0; i < childCount-1; i++) {
GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
lp.height = width;
lp.width = width;
......
}
GridLayout.LayoutParams 包含位置信息,例如 [column:2, row:3]。在您的代码中,所有 ImageView 都设置为相同 GridLayout.LayoutParams,因此它们位于同一单元格中(彼此重叠)。
当使用LinearLayout.LayoutParams代替时,其中没有位置信息。 GridLayout 将为每个子视图创建一个新的 GridLayout.LayoutParams,因此所有 ImageView 都使用自己不同的 GridLayout.LayoutParams 和位置。
希望对您有所帮助。您可以阅读 GridLayout.java 和 ViewGroup.java 了解更多详情。