[英]Disable scrolling of a ListView contained within a ScrollView
我想为我的用户显示一个“个人资料”屏幕。
它必须具有三个视图(2个Buttons
和一个ImageView
)以及一个ListView
才能显示该用户制作的内容。
但是,我不希望ListView
滚动。 相反,我希望它尽可能大,并将所有视图放入ScrollView
,以便使用ListView
滚动出前三个视图。 当然,这不能按预期工作。
我所有的三个项目都在LinearLayout
。 我想将它们设置为ListView
的第一项,但这导致它们可以被选择为第一项,并且必须进行一些不必要的编码。
有没有一种简单的方法可以执行此操作,还是我必须坚持将Layout设置为ListView中的第一项?
我为此找到了一个非常简单的解决方案。 只需获取列表视图的适配器并在显示所有项目时计算其大小即可。 优点是此解决方案也可以在ScrollView中使用。
例:
public static void justifyListViewHeightBasedOnChildren (ListView listView) {
ListAdapter adapter = listView.getAdapter();
if (adapter == null) {
return;
}
ViewGroup vg = listView;
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, vg);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams par = listView.getLayoutParams();
par.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
listView.setLayoutParams(par);
listView.requestLayout();
}
通过您的ListView对象调用此函数:
justifyListViewHeightBasedOnChildren(myListview);
上面显示的功能是对以下内容的修改: 禁止在列表视图中滚动
将适配器设置为列表视图后,请注意调用此功能。 如果适配器中条目的大小已更改,则还需要调用此函数。
将它们作为第一项添加到ListView似乎是一个很好的解决方案。
要使View不可选择,只需获取view和.setClickable(false)
。
我会在ListView
顶部添加一个具有不可见背景的View
。 设置一个View.OnTouchListener()
。 并通过返回消耗事件true
在onTouch()
的方法View.OnTouchListener()
当您希望列表再次向后滚动时,请删除透明View
上设置的触摸侦听器
如果必须在列表视图中显示有限数量的项目,并且要停止滚动列表视图,则必须使listview的高度大于项目的总高度。
例如,您要显示3个项目。 (行高为30)。 那么项目的总高度将变为3 x 30dp = 90dp,
所以现在您必须将listview的高度设置为大于90。例如:100dp。 所以现在您的列表视图在任何情况下都不会滚动。
我认为最好的方法是将2个按钮和图像视图放在LinearLayout(或任何适合您的布局)中,然后使用addHeaderView方法将此布局添加为列表标题:
http://developer.android.com/reference/android/widget/ListView.html#addHeaderView(android.view.View )
使用以下指令:
name_lista.getLayoutParams (). height = new_size
new_size是一个变量,您将根据列表中元素的数量进行计算,例如:
new_size = 100 * list_size;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.