GridLayout子控件用map保存,for循环map动态修改控件的参数 只保留了最后一次
时间: 2024-03-01 21:55:27 浏览: 92
GridLayout应用
这个问题的原因是在循环中重复使用同一个 LayoutParams 对象,并且每次都修改了它的值,而实际上 GridLayout 会对 LayoutParams 对象进行复用,从而导致修改结果只保留了最后一次的修改。
为了解决这个问题,我们需要在循环中为每个子 View 创建一个新的 LayoutParams 对象,并设置对应的布局参数。下面是一种可能的解决方案:
```java
// 获取 GridLayout 控件
GridLayout gridLayout = findViewById(R.id.grid_layout);
// 定义每个子 View 的宽度和高度
int childWidth = 100;
int childHeight = 100;
// 创建一个 Map 用于保存子 View 和对应的 LayoutParams 对象
Map<View, GridLayout.LayoutParams> viewParamsMap = new HashMap<>();
for (int i = 0; i < 10; i++) {
// 创建一个新的 LayoutParams 对象
GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams();
// 设置子 View 的宽度和高度
layoutParams.width = childWidth;
layoutParams.height = childHeight;
// 设置子 View 在 GridLayout 中的行列位置
layoutParams.rowSpec = GridLayout.spec(i / 3);
layoutParams.columnSpec = GridLayout.spec(i % 3);
// 创建一个新的子 View
View childView = new View(this);
// 设置子 View 的背景色
childView.setBackgroundColor(Color.RED);
// 将子 View 添加到 GridLayout 中,同时将对应的 LayoutParams 对象保存到 Map 中
gridLayout.addView(childView, layoutParams);
viewParamsMap.put(childView, layoutParams);
}
// 修改子 View 的布局参数
for (View childView : viewParamsMap.keySet()) {
// 获取子 View 对应的 LayoutParams 对象
GridLayout.LayoutParams layoutParams = viewParamsMap.get(childView);
// 修改子 View 的布局参数
layoutParams.width = childWidth + 10;
layoutParams.height = childHeight + 10;
// 重新设置子 View 的布局参数
gridLayout.updateViewLayout(childView, layoutParams);
}
```
在上面的代码中,我们在循环中为每个子 View 创建了一个新的 LayoutParams 对象,并将其保存到一个 Map 中,以便后续可以根据子 View 获取对应的 LayoutParams 对象。同时,我们还设置了子 View 的宽度、高度和在 GridLayout 中的行列位置,以及背景色等属性。
在修改子 View 的布局参数时,我们首先根据子 View 获取对应的 LayoutParams 对象,然后修改该对象的属性值,并调用 `updateViewLayout()` 方法重新设置子 View 的布局参数。这样可以避免修改缓存中的 LayoutParams 对象,从而保证每次修改都会生效。
阅读全文