我希望ListView中的行可以调整大小,以便它们中的六个可以适合屏幕。为此,我需要知道ListView(而不是整个屏幕)有多少垂直空间可用。但是,由于还没有渲染视图,因此无法在onCreate()中进行测量。
如果我在渲染后进行测量,可能会绘制ListView,然后调整大小,这可能会分散注意力。在呈现ListView之前建立必要行高的最明智的方法是什么?
答案 0 :(得分:4)
在onCreate
中,您可以获得屏幕的高度并除以6。
现在在getView
中,您可以获得每个项目的顶部布局的引用,假设您已将其命名为root,即它是LinearLayout
。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view == null){ some inflate }
LinearLayout root = (LinearLayout) view.findViewById(R.id.root);
LayoutParams lp = root.getLayoutParams();
lp.height = screenHeight/6;
root.setLayoutParams(lp);
....
return view;
}
是的,这假设ListView
处于全屏状态。
如果您有其他布局,则必须考虑这些高度。
然后你的身高将是:int heightForEachItem = (screenHeight - otherlayoutsHeightTogether) / 6;
答案 1 :(得分:0)
事实证明,最早可以测量ListView的是onGlobalLayout()
回调。
这是我的例子。
params = new AbsListView.LayoutParams(-1,-1);
listview.getViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){
@Override
public void onGlobalLayout(){ //this is called just before rendering
params.height = listview.getHeight()/6; // this is what I was looking for
listview.getViewTreeObserver.removeOnGlobalLayoutListener(this); // this is called very often
}
adapter = new ArrayAdapter<...>(int position, ...){
@Override
public View getView(...){
LinearLayout item = new LinearLayout(context);
item.setLayoutParams(params);
// add text, images etc with getItem(position) and item.addView(View)
return item;
}
}
listview.setAdapter(adapter);