【问题标题】:Using Listview in a scroll view在滚动视图中使用 Listview
【发布时间】:2014-04-24 05:35:56
【问题描述】:

在我的应用程序中,我确实在 Scrollview 布局(根布局)中使用了滚动。当我这样做时,子滚动停止滚动。为此,我找到了解决方案代码

childlistview.setOnTouchListener(new ListView.OnTouchListener() {


        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

            case MotionEvent.ACTION_UP:
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
            }

            v.onTouchEvent(event);
            return false;
        }
        });

它解决了问题。但我看不懂这段代码。谁能帮忙?

【问题讨论】:

    标签: android listview android-scrollview


    【解决方案1】:

    在您的情况下,Scrollview 是父级,而 ListView 是它的子级。

    因此,在正常情况下,当您尝试滚动时,ScrollView 将拦截该事件,并发生ScrollView 的滚动。它不会到达内部的ListView,因为它已经由父ScrollView 处理。

    但是,当您将 TouchListener 设置为子 ListView 并像您所做的那样覆盖其 onTouch() 时,会观察到不同的行为。

     case MotionEvent.ACTION_DOWN: 
    

    当第一根手指按下屏幕时发生此事件。

      v.getParent().requestDisallowInterceptTouchEvent(true);
    

    这样可以防止父级拦截到触摸事件,让子级可以适当的处理该事件。

      case MotionEvent.ACTION_UP:
    

    当所有手指离开屏幕时触发此事件。

      v.getParent().requestDisallowInterceptTouchEvent(false);
    

    这将允许父级拦截之后的触摸事件,以便屏幕的其余部分离开子视图。

    希望对你有所帮助。

    【讨论】:

    • 欢迎您,很高兴与您分享。 :)
    【解决方案2】:
    v.getParent().requestDisallowInterceptTouchEvent(true);
    

    它只是禁用子View 的父触摸。在您的情况下,它禁用父(ScrollView)触摸子视图(v)。

    同样,如果您想启用父触摸,只需将 false 传递给相同的方法。

    希望它能消除你的疑虑。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多