我已经创建了一个MaxLength
控件,它来自GridView
,这个控件的概念是它将包含以网格格式排列的多个ScrollView
,并且具有给定的数字列和行。
首次构建视图时,Views
不知道其容器的大小,所以我等到GridView
方法被调用,然后我应用相关的大小。< / p>
当运行以下内容时,它不会重新调整网格大小以正确显示它,每个控件只能显示文本所需的大小。
当`onSizeChanged&#39;方法被调用,它具有正确的大小,并为每个子视图应用正确的大小,但它不会影响控件的绘制方式(即它们仍然全部聚集在左上角)屏幕)。
尽管如此,我实际上已经开始工作,但它吸引了两次。我是通过创建调用onSizeChanged
的{{1}}来完成此操作的。然后在致电Runnable
后直接致电ResizeList
。
虽然这是一个解决方案,但我不明白为什么它不能以下面的形式工作。
顺便提一下,如果new Handler().post(r)
是添加到BuildIt
的主GridView
,则它显示正常,只有在随后添加时才会显示。这就是为什么我有View
,你必须按下来显示网格。
有人可以建议为什么下面的代码无法正常工作吗?
Activity
Button
班
public class MainActivity extends Activity {
GridView sv;
FrameLayout flay;
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
flay=new FrameLayout(this);
this.setContentView(flay);
Button b=new Button(this);
b.setText("press me to show grid view");
b.setOnClickListener(ocl);
flay.addView(b);
}
OnClickListener ocl=new OnClickListener()
{
@Override public void onClick(View v)
{
BuildIt();
}};
private void BuildIt()
{
flay.removeAllViews(); // remove the button control
sv=new GridView(this);
for (int c1=0 ; c1<30 ; c1++)
{
TextView tv=new TextView(this);
tv.setText("Item "+c1);
tv.setGravity(android.view.Gravity.CENTER);
sv.addListItem(tv);
}
flay.addView(sv);
sv.ConstructList();
}
}
答案 0 :(得分:0)
我有一个函数,用于在gridView中调整孩子的宽度和高度。
可能这可以帮到你:
public static void setGridChild_Height(GridView gridView, int columns) {
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
int items = listAdapter.getCount();
int rows = 0;
for (int j = 0; j < items; j++) {
View view = gridView.getChildAt(j);
if (view != null && view.getHeight() > totalHeight) {
totalHeight = view.getHeight();
}
}
System.out.println("totalHeight -> " + totalHeight);
if (totalHeight > 0) {
for (int j = 0; j < items; j++) {
View view = gridView.getChildAt(j);
if (view != null && view.getHeight() < totalHeight) {
view.setMinimumHeight(totalHeight);
}
}
}
// View listItem = listAdapter.getView(0, null, gridView);
// listItem.measure(0, 0);
// totalHeight = listItem.getMeasuredHeight();
//
// float x = 1;
// if (items > columns) {
// x = items / columns;
// rows = (int) (x + 1);
// totalHeight *= rows;
// }
//
// ViewGroup.LayoutParams params = gridView.getLayoutParams();
// params.height = totalHeight;
// gridView.setLayoutParams(params);
}
尝试根据您的要求更改逻辑。 代码未经过完美测试。
答案 1 :(得分:0)
这是因为onSizeChanged
新添加到视图层次结构时使用了它的旧大小&#34; 0&#34; (根据文档:http://developer.android.com/reference/android/view/View.html#onSizeChanged(int, int, int, int))
我认为您想要的是addOnLayoutChangedListener
:http://developer.android.com/reference/android/view/View.html#addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener)
使用ViewTreeObserver
可能是另一个适合您的选项:How can you tell when a layout has been drawn?