如何在屏幕上显示确切数量的ListView项目?

时间:2014-12-17 15:11:00

标签: android android-layout listview android-listview

我希望ListView中的行可以调整大小,以便它们中的六个可以适合屏幕。为此,我需要知道ListView(而不是整个屏幕)有多少垂直空间可用。但是,由于还没有渲染视图,因此无法在onCreate()中进行测量。

如果我在渲染后进行测量,可能会绘制ListView,然后调整大小,这可能会分散注意力。在呈现ListView之前建立必要行高的最明智的方法是什么?

2 个答案:

答案 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);