Android GridLayout仅显示最后一个孩子

时间:2015-08-04 17:34:14

标签: android children android-gridlayout

我是Android开发的新手。我一直在使用GridLayout来显示动态插入的ImageViews。

我的问题位于“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); 

工作正常,但现在我只看到最后一个孩子显示。通过调试器,我可以看到gridview正在填充的不仅仅是最后一个元素,还有最后一个imageview。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

你应该为每个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以获取更多详细信息。

答案 1 :(得分:0)

所以我解决了我的问题,虽然我不确定如何 -

GridLayout.LayoutParams lp = new GridLayout.LayoutParams();

改为......

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(x,y);

让它按照我想要的方式工作。但我不确定为什么 - 如果有人可以解释,请做:)