【问题标题】:How do I fit an exact number of ListView items on screen?如何在屏幕上显示确切数量的 ListView 项目?
【发布时间】:2014-12-17 15:10:59
【问题描述】:

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

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

【问题讨论】:

    标签: android android-layout listview android-listview


    【解决方案1】:

    onCreate 中,您可以获得屏幕高度并除以 6。 现在,在您的 getView 中,您将获得每个项目的顶部布局的引用,假设您已将其 id 命名为 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;

    【讨论】:

    • 这是假设列表视图是全屏的,但没有操作栏,甚至可能没有软导航按钮
    • 是的,这是真的。我在代码下方添加了注释。
    • 不,有一个 ActionBar 和一切。我不知道可以测量 LayoutParams,但那是新的。
    【解决方案2】:

    事实证明,您最早可以测量 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 2021-11-24
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多