我有一个相当复杂的View构建,作为其中的一部分,我在ScrollView中的LinearLayout内部有一个ListView(以及更多的组件,但在这个问题上它们并不重要)。
现在整个活动滚动得很好,但ListView的高度有限,当它里面的项目超过高度时,我的屏幕消失了。我试图将ListView放在它自己的ScrollView中,但这不起作用。当我尝试在ListView上滚动时,选择了主ScrollView并且我的屏幕滚动而不是ListView。
我的问题可能听起来很简单,但我无法解决这个问题......是否有可能使ListView可滚动?
相关的XML:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:id="@+id/GlobalLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView android:id="@+id/EndpointList"
android:choiceMode="multipleChoice"
android:layout_height="175dip"
android:layout_width="fill_parent" />
</LinearLayout>
</ScrollView>
答案 0 :(得分:23)
使用ScrollView中的其他布局代替ListView,而不是使用页眉和页脚创建一个ListView。
添加应位于ListView上方的视图作为标题:
addHeaderView(View v)
以下作为页脚:
addFooterView(View v)
将ListView上方的所有内容放入ListView的标题中,并将其与页脚相同。
LayoutInflater inflater = LayoutInflater.from(this);
mTop = inflater.inflate(R.layout.view_top, null);
mBottom = inflater.inflate(R.layout.view_bottom, null);
list.addHeaderView(mTop);
list.addFooterView(mBottom);
// add header and footer before setting adapter
list.setAdapter(mAdapter);
结果你会得到一个可滚动的视图。
答案 1 :(得分:4)
实际上,我设置它的方式确实有效......将一个ListView放在ScrollView中的LinearLayout中。只要避免ListView是ScrollView的直接子项,它就可以正常运行......
请注意,如果ListView中没有足够的项目来填充它,那么它会“关闭屏幕”,它将不会滚动(虽然逻辑上有点)。另请注意,当您有足够的项目滚动时,您需要继续按下ListView中的项目以使其滚动,并且有一半的时间,焦点将被赋予全局滚动视图而不是ListView ...避免这种情况(大部分时间),继续按下最顶部或最下面的项目,具体取决于您想要滚动的方式。这将优化您关注ListView的机会。
我制作了一个可能的视频,现在将其上传到YouTube ...
视频为http://www.youtube.com/watch?v=c53oIg_3lKY。质量有点差,但它证明了我的观点。
仅仅为了全局概述,我使用ScrollView来滚动我的整个活动,使用LinearLayout来调整Activity的布局,然后使用ListView来创建列表......
答案 2 :(得分:3)
试试这段代码可以帮到你
ListView listView = ( ListView ) findViewById(R.id.lsvButton3);
listView.setOnTouchListener(new ListView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
// Handle ListView touch events.
v.onTouchEvent(event);
return true;
}
});
答案 3 :(得分:2)
我想注意一下视频的内容
列表视图每x次触摸都工作一次不是因为你把它放在一个线性布局中,而是因为你正在触摸分频器......
滚动视图然后会认为您触摸的地方没有子节点将动画事件分派给...所以它调用了super.dispatchTouchEvent,在这种情况下是View.dispatchTouchView,因此是listview.onTouchEvent。当您在一行内触摸时,实际上是一个视图组的scrollview会将调度发送给您的案例中的子项textview,并且永远不会调用其中一个视图,因此listview不会滚动。
希望我的解释足够清楚,指出它为什么不起作用。