为什么ListView项目不会增长以包装其内容?

Mat*_*ias 56 android listview

我有一个相当复杂的ListView,具有可变列表项高度.在某些情况下,我需要在列表项中显示一个附加视图,默认情况下隐藏它(View.GONE).通过启用它(View.VISIBLE),列表项的高度增加(或者至少应该增加).

问题:即使我将项目的根布局声明为wrap_content,并且将项目中的每个组件声明为fill_parent,我隐藏/显示应该更改项目高度的视图只是在底部而不是其父级切断(项目布局)在高度上增长以完全显示它.

是否有任何与ListView相关的问题以及我可能错过的项目布局和项目高度?

更多观察:

出于测试目的,我现在已经将列表项布局简化为仅包含根LinearLayout和ImageView.当我将LinearLayout高度设置为例如200dip并将ImageView设置为fill_parent时,我原本期望ImageView增长直到达到其父级设置的200dip限制.

但是,图像将只是与其位图资源一样高(就好像我已将其设置为wrap_content)并且整个列表项将具有相同的高度(即,就好像我已将其设置为wrap_content一样).

但是,如果我将图像高度设置为例如200dip,则列表项的高度将增加,项目布局也将增加.

换句话说,完全忽略列表项布局的layout_height,因此除了硬编码像素值之外,ImageView上的任何高度值也是如此.

Mat*_*ias 56

我设法解决了这个问题,但我不明白为什么.

正如我所提到的,我已经将layout_height列表项布局设置为wrap_content(因为这fill_parent是无意义的,因为ListView是无限高的).

不过,我已经设置layout_height的所有视图该布局fill_parent.将它们设置为wrap_content相反时,问题就消失了.

这提出了另外两个问题:

1)一个视图的语义是什么fill_parent,当父母wraps_content?哪个尺寸请求优先?

2)如果fill_parent显然不起作用,我将如何填写列表项?

谢谢你输入的人.

  • 对于你的第一个问题:父`wraps_content`和孩子'fill_parent`毫无意义.当android计算布局所需的空间时,它会移动到父节点.父母说它需要足够的空间来包裹它的孩子,因此android会询问孩子需要多少空间.但是它的孩子们却不知道,因为他们想要父母占据的很多.简而言之:父`wraps_content`与子`fill_parent`冲突. (6认同)
  • 对于你的第二个问题:`ListView`用于显示未指定数量的项目,这就是它可滚动的原因.如果你想填充屏幕而不是让额外的项目可滚动,我建议使用带有权重的`LinearLayout`,例如`addView(item,new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,0,1));`.现在,项目将占用与您指定它们的权重成比例的高度,同时填充父项(如果指定了父项的高度). (2认同)

小智 30

试试这个:http: //www.java2s.com/Code/Android/UI/setListViewHeightBasedOnChildren.htm

public class Utils {

    public static void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        listView.requestLayout();
    }     
}
Run Code Online (Sandbox Code Playgroud)

  • 很好..但是你需要这个来使`params.height` tage成为'px`值而不是`dp`值..`int dpValue = totalHeight +(listView.getDividerHeight()*(listAdapter.getCount() - 1)); // dp value float density = context.getResources().getDisplayMetrics().density; params.height =(int)Math.ceil(dpValue*density); //像素值` (2认同)

Com*_*are 21

你是如何给行充气的?

如果你不使用它的权利,请尝试使用LayoutInflater#inflate(layoutId, parent, false)(这里parentAdapterView提供给getView()newView()):

v = getLayoutInflater().inflate(R.layout.list_item, parent, false);
Run Code Online (Sandbox Code Playgroud)


kir*_*off 14

布局问题可能是由ScrollView作为包装器引起的

我偶然发现了http://developer.android.com/reference/android/widget/ExpandableListView.html中的一些注意事项.

"...注意:如果父级的大小也没有严格指定,则不能将值wrap_content用于XML中ExpandableListView的android:layout_height属性(例如,如果父级是ScrollView,则无法指定wrap_content,因为它也可以任何长度.但是,如果ExpandableListView父级具有特定大小(例如100像素),则可以使用wrap_content."

我删除了包装ScrollView和线性布局开始正常工作.现在只知道如何将东西包装到ScrollView.神救救我

但无论如何这是非常奇怪的行为.我认为fill_parent的措辞不是很正确.使用heirarchyviewer工具时,我总是看到layout_width和leayout_height的WRAP_CONTENT和MATCH_PARENT值.所以fill_parent实际上可能意味着match_parent,它让我陷入认知失调.