带有 ArrayAdapter 的 ListView 仅显示 1 个高度项 wrap_content
ListView with ArrayAdapter showing only 1 item for height wrap_content
我遇到一个问题,我的 ListView 只显示一行,即使包含数据的 ArrayList 中有 2 个项目。
For clarification, YES, I'm using ListView inside a ScrollView but to balance it out I'm using custom ExpandableHeightListView (retrieved from one of the answers on SO) which is useful for exactly this purpose. This ListView is not scrollable. It has fixed height.
此外,在同一个 ScrollView 中,其他几个 ListView 工作正常,但这个 ListView 无法正常工作。
更进一步,当我在 getView() 方法中记录 position 变量值时,此 ListView 始终为 0,而其他 ListView 则按顺序增加。
我比较了两个 Adapter 的代码,它们是相同的,但当前的 ListView 仍然无法正常工作。
我尝试覆盖 getView() 方法,但无济于事。
感谢任何帮助。
编辑
如果我给 ListView 固定高度,比如 250dp,两行都会显示,但它只显示高度设置为 wrap_content
的 1 行
据我所知,scrollView 中的 ListView 无法正常工作。
因为两个小部件都有滚动,所以它们不能很好地工作。
所以我建议删除 ScrollView
谢谢..
这是一个非常常见的问题,要解决此问题,您应该阅读并实施 This WorkAround and Solution。
在我的例子中,它工作得很好。你也应该试试看。
我知道这不是你想听到的,但说真的,无论你在编程什么,考虑在选项卡或类似的地方显示它,这样你就不需要滚动视图了。
如果您真的必须在一个屏幕上显示如此多的数据,请考虑使用 LinearLayout
之类的东西和适配器来显示您的数据。
列表视图不是为在滚动视图中工作而设计的,因为它们本身是可滚动的。您可以 "hack" 绕过它,但这并不好。如果您确实需要列表视图提供的功能,请考虑将您的屏幕拆分为选项卡,在每个选项卡中显示一个或两个列表视图。
这个解决方案对我有用,而且会自动调整布局。在顶级 ListView 适配器上,在 getView() 方法内,您将创建一个视图,该视图引用另一个 ListView 的布局。假设 "inner" ListView 声明为 "listView",其适配器名为 "adapter",请尝试使用以下代码。另外,确保内部 ListView 布局设置为 WRAP_CONTENT,这样即使高度正确,也不会被布局约束覆盖。
listView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
listView.getLayoutParams().height = adapter.getCount() * {whatever your list item height is} OR do something else to add up all of the heights;
listView.requestLayout();
listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
);
我遇到一个问题,我的 ListView 只显示一行,即使包含数据的 ArrayList 中有 2 个项目。
For clarification, YES, I'm using ListView inside a ScrollView but to balance it out I'm using custom ExpandableHeightListView (retrieved from one of the answers on SO) which is useful for exactly this purpose. This ListView is not scrollable. It has fixed height.
此外,在同一个 ScrollView 中,其他几个 ListView 工作正常,但这个 ListView 无法正常工作。
更进一步,当我在 getView() 方法中记录 position 变量值时,此 ListView 始终为 0,而其他 ListView 则按顺序增加。
我比较了两个 Adapter 的代码,它们是相同的,但当前的 ListView 仍然无法正常工作。
我尝试覆盖 getView() 方法,但无济于事。
感谢任何帮助。
编辑
如果我给 ListView 固定高度,比如 250dp,两行都会显示,但它只显示高度设置为 wrap_content
据我所知,scrollView 中的 ListView 无法正常工作。
因为两个小部件都有滚动,所以它们不能很好地工作。
所以我建议删除 ScrollView
谢谢..
这是一个非常常见的问题,要解决此问题,您应该阅读并实施 This WorkAround and Solution。
在我的例子中,它工作得很好。你也应该试试看。
我知道这不是你想听到的,但说真的,无论你在编程什么,考虑在选项卡或类似的地方显示它,这样你就不需要滚动视图了。
如果您真的必须在一个屏幕上显示如此多的数据,请考虑使用 LinearLayout
之类的东西和适配器来显示您的数据。
列表视图不是为在滚动视图中工作而设计的,因为它们本身是可滚动的。您可以 "hack" 绕过它,但这并不好。如果您确实需要列表视图提供的功能,请考虑将您的屏幕拆分为选项卡,在每个选项卡中显示一个或两个列表视图。
这个解决方案对我有用,而且会自动调整布局。在顶级 ListView 适配器上,在 getView() 方法内,您将创建一个视图,该视图引用另一个 ListView 的布局。假设 "inner" ListView 声明为 "listView",其适配器名为 "adapter",请尝试使用以下代码。另外,确保内部 ListView 布局设置为 WRAP_CONTENT,这样即使高度正确,也不会被布局约束覆盖。
listView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
listView.getLayoutParams().height = adapter.getCount() * {whatever your list item height is} OR do something else to add up all of the heights;
listView.requestLayout();
listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
);