13

我有一个非常复杂的视图构建,作为其中的一部分,我在 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>
4

4 回答 4

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);

结果,您将获得一个可滚动的视图。

于 2011-03-15T13:52:39.597 回答
4

实际上,我设置它的方式确实有效...将 ListView 放置在 ScrollView 内的 LinearLayout 中。只要避免 ListView 是 ScrollView 的直接子级,它就会很好地工作......

请注意,如果 ListView 中没有足够的项目来填充它,那么它就会“离开屏幕”,它就不会滚动(虽然有点合乎逻辑)。另请注意,当您有足够的项目可以滚动时,您需要按住 ListView 中的某个项目以使其滚动,并且有一半的时间,焦点是全局滚动视图而不是 ListView...避免这种情况(大部分时间),根据您要滚动的方式,按住最顶部或最下方的项目。这将优化您专注于 ListView 的机会。

我已经制作了一个可能的视频,现在正在上传到 YouTube...

视频是http://www.youtube.com/watch?v=c53oIg_3lKY。质量有点差,但它证明了我的观点。

只是为了全局概述,我使用 ScrollView 来滚动我的整个活动,使用 LinearLayout 进行活动布局,并使用 ListView 来制作列表......

于 2011-03-16T09:59:29.453 回答
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;
            }
        });
于 2015-05-05T08:09:30.363 回答
2

我想为视频说明一些内容

列表视图在每 x 触摸一次时工作一次,不是因为您将其放置在线性布局中,而是因为您正在触摸分隔线......

然后,滚动视图将认为您触摸的地方没有孩子可以将motionevent分派到......所以它调用super.dispatchTouchEvent,在这种情况下是View.dispatchTouchView,因此是listview.onTouchEvent。

当您触摸一行内部时,实际上是一个视图组的滚动视图将在您的情况下将调度发送给子级文本视图,并且永远不会调用视图之一,因此列表视图不会滚动。

希望我的解释足够清楚,可以指出为什么它不起作用。

于 2012-02-04T22:48:19.937 回答