【问题标题】:Create a scrollable LinearLayout without a ScrollView创建一个没有 ScrollView 的可滚动 LinearLayout
【发布时间】:2017-07-06 17:18:13
【问题描述】:

我花了一天的大部分时间研究 Android 中的滚动内容。但是,在我的应用程序中,我需要应用一种自定义类型的滚动,其中包含一个列表视图。列表视图有它自己的滚动功能,滚动视图不应该与列表视图一起使用。

但是视图必须有一些内在的滚动功能。 View 的文档确实表明支持,但提供的方法似乎没有提供任何侦听器来检测滚动。

滚动视图也是基于 FrameLayout 构建的,这在我的应用程序中也会出现问题。

您可以使用以下方法使 LinearLayout 可滚动:

android:isScrollContainer="true"

但这似乎没有任何作用。

事实上,您甚至可以为 LinearLayout 设置滚动条:

android:scrollbars="vertical"

但这似乎也没有任何作用。

我不想控制滚动,而是有一个侦听器来检测屏幕上的滚动,而不管列表视图、框架布局或任何其他控件是否可见。我想我正在寻找的是编写我自己的自定义 ScrollView 控件,但没有其 FrameLayout 的限制以及我不需要的所有不必要的开销。有什么建议吗?

【问题讨论】:

    标签: android scroll


    【解决方案1】:

    解决上述问题的方法是拥有2个ScrollView,一个是包含所有视图的外部ScrollView和其他内部Scrollview而不是listview并动态添加LinearLayout内部的项目(内部内部ScrollView)

    【讨论】:

    • 你不应该将 ListView 放在 ScrollView 中。
    • 是的,我知道这就是为什么我提到在scrollView而不是ListView中动态地将项目添加到线性布局。请仔细阅读上述声明
    • 我仍然需要列表视图。我正在开发一个其他人可以使用的自定义控件,他们可以将其与自己现有的 ListView 一起使用。
    【解决方案2】:

    其实在做了一些研究之后,我想出了一个解决这个问题的办法:

    首先我想用一种非常简单的方式来解释这个问题。

    1.LinearLayout 将是可滚动的。
    2.为此我们可以使用ScrollView,但有时我们需要在LinearLayout中使用ListView。
    3.我们知道在ScrollView里面我们不能使用像ListView这样的另一个scrollview

    如何解决?

    ListView 本质上是可滚动的,因此我们可以在 ListView 中添加页眉和页脚。结论:

    1.创建布局header.xml和footer.xml和list.xml
    2.在主activity中从list.xml中找到ListView引用,在ListView引用中动态添加页眉和页脚。

    【讨论】:

      【解决方案3】:

      这似乎是一个可行的解决方案,我已对其进行了测试,但并未彻底测试。创建一个扩展 LinearLayout 的自定义控件,然后覆盖 dispatchTouchEvent:

        @Override
        public boolean dispatchTouchEvent(MotionEvent event)
        {
          MotionEvent vtev = MotionEvent.obtain(event);
      
          final int actionMasked = event.getActionMasked();
      
          float x = event.getRawX();
          float y = event.getRawY();
      
          switch (actionMasked)
          {
            case MotionEvent.ACTION_DOWN:
      
              break;
            case MotionEvent.ACTION_MOVE:
              int z = 0;
              z++;
              break;
            case MotionEvent.ACTION_UP:
              break;
            case MotionEvent.ACTION_CANCEL:
      
              break;
            case MotionEvent.ACTION_POINTER_DOWN:
            {
              final int index = event.getActionIndex();
      
              break;
            }
            case MotionEvent.ACTION_POINTER_UP:
      
              break;
          }
      
          boolean ret = super.dispatchTouchEvent(event);
          return ret;
        }
      }
      

      然后,您可以将子控件放置在此自定义 LinearLayout 中并检测运动事件,即使存在 ListViews 和 ScrollViews 也是如此。这不会影响他们自己的滚动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多