【问题标题】:How can I get my ListView to scroll?如何让我的 ListView 滚动?
【发布时间】:2011-03-15 13:41:14
【问题描述】:

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

【问题讨论】:

    标签: android listview scrollable


    【解决方案1】:

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

    结果你会得到一个可滚动的视图。

    【讨论】:

    • 您能否详细解释一下这个选项,我的意思是我已经阅读过它,但我不明白这将如何替换列表...如果我要添加一个新的 headerView ,它不会取代已经存在的那个吗?
    • 它不会替换列表,只是通过消除它来解决 ScrollView 的问题。页眉和页脚可以是任何类型的视图。
    • 但是,添加几个Header之后,LinearLayout的总高度只会增加,对吗?如果是这样,这正是我想通过 ListView 避免的...
    • 出色的解决方案,这正是我想要实现的 :)
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 在 ScrollView 内的 LinearLayout 中放置 ListView 将不起作用
    • 对我不起作用。除了视频显示了这一切,也不是真的适合你。可能是您正在探索的错误。但它似乎只用了不到一半的时间。
    • 这是真的……希望清楚地表明它不应该被使用。 :)
    【解决方案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;
                }
            });
    

    【讨论】:

    • 即使没有解释,这也行不通,因为您不允许滚动视图滚动;它的确切用途。
    【解决方案4】:

    我想为视频做一些说明

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      相关资源
      最近更新 更多