我在ListView
内使用ScrollView
并且我们都知道它会产生问题。
我从这个网站得到了很好的解决方案:How to calculate total row heights of listView in android?
但是对于某些项目,它没有正确显示Listview
。有没有改进的解决方案?
我的代码:
public static void getListViewSize(ListView myListView, Context context) {
ListAdapter myListAdapter = myListView.getAdapter();
if (myListAdapter == null) {
return;
}
int totalHeight = 0;
for (int size = 0; size < myListAdapter.getCount(); size++) {
View listItem = myListAdapter.getView(size, null, myListView);
if (listItem instanceof ViewGroup)
listItem.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
@SuppressWarnings("deprecation")
int screenWidth = display.getWidth();
int listViewWidth = screenWidth - 20;
int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth,
MeasureSpec.AT_MOST);
listItem.measure(widthSpec, 0);
totalHeight += listItem.getMeasuredHeight();
Log.e("height of listItem:", String.valueOf(totalHeight));
}
ViewGroup.LayoutParams params = myListView.getLayoutParams();
params.height = totalHeight
+ (myListView.getDividerHeight() * (myListAdapter.getCount() - 1));
myListView.setLayoutParams(params);
myListView.requestLayout();
}
答案 0 :(得分:0)
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
该功能的核心是这三行,它试图测量每个视图。 listItem.measure(0,0)中的0等于MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
大多数情况下,它会计算列表视图的准确高度。有一个例外,当视图内容太多并且将换行时,即有多行文本。在这种情况下,您应该指定一个准确的widthSpec来测量()。因此,请将listItem.measure(0, 0)
更改为
// try to give a estimated width of listview
int listViewWidth = screenWidth - leftPadding - rightPadding;
int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, MeasureSpec.AT_MOST);
listItem.measure(listViewWidth, 0)
更新此处的公式
int listViewWidth = screenWidth - leftPadding - rightPadding;
enter code here
这只是一个示例,展示如何估计listview宽度的宽度,该公式基于listview的宽度≈屏幕宽度这一事实。填充由你自己设置,这里可能为0(Get screen dimensions in pixels)。此页面说明如何获得屏幕宽度。一般来说,它只是一个样本,您可以在这里编写自己的公式。