如何让我的ListView滚动?

时间:2011-03-15 13:41:14

标签: android listview scrollable

我有一个相当复杂的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>

4 个答案:

答案 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不会滚动。

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