我的应用程序有一个带有expandablelistview的屏幕。 expandablelistview中包含包含listviews的可折叠行。这些列表视图包含动态数量的项目以及每个项目的动态高度。由于列表视图应设置为硬编码高度,然后在其中滚动,并且我不想在滚动内滚动,我必须通过计算实际高度来绕过它然后将listview的项目的高度设置为该高度,以便其所有内容都适合exandablelistview行。
这是我的扩展方法,用于计算列表视图的高度:
public static void SetHeightBasedOnChildren(this ListView listView) {
var listAdapter = listView.Adapter;
var totalHeight = listView.PaddingTop + listView.PaddingBottom;
if (listView.DividerHeight > 0)
totalHeight += (listView.DividerHeight * (listAdapter.Count - 1));
var desiredWidth = DeviceHelper.GetDimensions ().X;// Add parameter if listview doesn't always span entire width of screen
var listViewWidth = MeasureSpec.MakeMeasureSpec (desiredWidth, MeasureSpecMode.AtMost);
View listItem;
for (int i = 0; i < listAdapter.Count; i++) {
listItem = listAdapter.GetView (i, null, listView);
if (listItem is ViewGroup && listItem.LayoutParameters == null)
listItem.LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);
listItem.Measure (listViewWidth, (int)MeasureSpecMode.Unspecified);
totalHeight += listItem.MeasuredHeight;
}
var layoutParams = listView.LayoutParameters;
layoutParams.Height = totalHeight;
listView.LayoutParameters = layoutParams;
}
这个问题是当向下滚动屏幕并到达每个列表视图时,当它计算列表视图项目的动态高度并将其高度设置为该值时,会导致滚动变得非常不稳定。 / p>
正如我所提到的,列表视图是一个硬编码的高度,我尝试将我们的列表视图换成垂直方向的线性布局,这意味着它们的高度可调,适合其内容所以不需要任何花式高度计算即时。不幸的是,这种方法并不起作用,因为线性布局不像列表视图那样缓存它们的行,因此屏幕完全无法用于尝试管理数百个 - &gt;数千行没有任何缓存。注意:线性布局在仿真器上表现良好,但在设备上表现不佳。
我想知道是否有人知道如何在这种情况下顺利滚动。我有一些想法...
继续使用列表视图,但在列表视图中的每个项目上设置硬编码高度。然后我可以更快地计算列表视图的高度,因为我知道基于总行数的高度。我仍然需要在每个列表视图上设置高度,这使得它仍然不平滑但比以前更好。缺点是我要么需要使所有行都足够高以适应更长的内容(浪费垂直空间),要么截断不适合的内容。
查看是否有人开发了混合窗口小部件,即使用行缓存的垂直方向的线性布局。
了解如何强制expandablelistview在屏幕加载时立即加载listview部分,而不是等到他们即将进入视图时。缺点是我们在内存中持有更多内容,因此这可能会导致屏幕无法使用。
思想??
编辑:我应该提一下,列表视图也在浏览页面内,因为用户可以在不同年份的列表之间滑动(想想财产的税务记录或抵押记录)。我把它搞定了,所以有人不会说,根本就没有列表视图,只使用expandablelistview。