Android:wrap_content不能与ListView一起使用

use*_*575 31 android listview

我正在研究android.我希望我的列表视图水平包装其内容而不是填充所有宽度.wrap_content属性不起作用.该怎么办?

Jay*_*ala 46

为了实现wrap_content高度ListView,我们需要使用CustomListView的是extends我们的母语ListView.

MyListView.java

public class MyListView extends ListView {

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}
Run Code Online (Sandbox Code Playgroud)

在您layout使用这样的自定义视图中,

layout.xml

<com.yourpackagename.MyListView
        ...       
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ... />
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很有用,但是当ListView在RecyclerView中时,向上滚动似乎是错误的.所以真正的解决方案是覆盖onMeasure方法.请参阅此答案:http://stackoverflow.com/a/24186596/1901561 (4认同)
  • 高度工作正常,宽度怎么样,宽度取全长,如果我将wrappontnet作为宽度不起作用 (2认同)

K_A*_*nas 38

正如Romain Guy(Google工程师在UI工具包上工作)所​​说的那样

通过设置宽度,wrap_content您可以告诉ListView与其最宽的子项一样宽.因此,ListView必须测量其项目并获取必须在适配器上调用getView()的项目.这可能会发生几次,具体取决于布局传递的数量,父布局的行为等.

因此,如果将ListView的布局宽度或布局高度设置为ListView,wrap_content则会尝试测量附加到它的每个视图 - 这绝对不是您想要的.

请记住:避免一直设置wrap_contentListViews或GridViews,有关详细信息,请参阅此Google I/O视频,了解listview的世界

  • 这个建议似乎并不普遍.ListView/Adapater组合比一开始人们可能意识到的更通用和可扩展,这意味着人们也可能没有意识到将wrap_content与任意数据集一起使用的后果.但这并不是说数据集的大小固定或有限的情况并不多.在这些情况下,使用wrap_content将更多的是判断调用. (8认同)
  • 这似乎是棉绒应该警告的东西 - 但它目前没有. (3认同)
  • 我不知道为什么会接受这个答案:它根本无法回答问题。它还模仿了Romain's Guy的帖子-这是一个完全不同的问题:测量布局的次数-并指向一个视频,该视频实际上解释了wrap_content应该起作用的原因,至少对于3个列表项有效,并且“工作”来获取更复杂的列表(需要付出可观的性能代价)。 (2认同)