为什么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上的任何高度值都不是硬编码的像素值。


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

正如我所提到的,我将列表项布局的layout_height设置为wrap_content (因为fill_parent在这里没有意义,因为ListView无限高)。

不过,我已将layout中所有视图的layout_height设置为fill_parent 。 问题在设置为wrap_content时消失。

这引发了另外两个问题:

1)什么是视图要求fill_parent时的语义,当父类wraps_content ? 哪个大小的请求优先?

2)如果fill_parent显然不起作用,我将如何使视图填充列表项目?

感谢您的输入人。


试试这个: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();
    }     
}

你怎么膨胀你的行?

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

v = getLayoutInflater().inflate(R.layout.list_item, parent, false);
链接地址: http://www.djcxy.com/p/93235.html

上一篇: Why do ListView items not grow to wrap their content?

下一篇: Android LinearLayout fill