近期项目里面有个需求,一个页面放了一个ScrollView,整个页面能够向上滚动,然后ScrollView里面又嵌套了一个ListView,ListView里面的数据也是能够上下滑动的,理论上ListView被包在ScrollView里面,TouchEvent肯定是被ScrollView拦截了。那我们能够採取什么思路呢,我看网上非常多做法说是将整个ListView的高度计算出来,感觉这样非常不优雅。假设ListView数据超多。那么页面不是超长吗?当中一个思路就是当我们滑动ListView区域的时候,ScrollView不要响应OnTouch事件。触摸ListView区域外的点才干够滑动整个页面。

给出核心代码。

自己定义ScrollView

  1. package com.figo.study.view;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.content.Context;
  7. import android.util.AttributeSet;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10. import android.widget.ScrollView;
  11.  
  12. public class MyScrollView extends ScrollView {
  13. private OnScrollListener onScrollListener;
  14. private List<View> views = new ArrayList<View>();
  15.  
  16. public MyScrollView(Context context) {
  17. this(context, null);
  18. }
  19.  
  20. public MyScrollView(Context context, AttributeSet attrs) {
  21. this(context, attrs, 0);
  22. }
  23.  
  24. public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
  25. super(context, attrs, defStyle);
  26. }
  27.  
  28. public void setOnScrollListener(OnScrollListener onScrollListener) {
  29. this.onScrollListener = onScrollListener;
  30. }
  31.  
  32. @Override
  33. protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  34. super.onScrollChanged(l, t, oldl, oldt);
  35. if (onScrollListener != null) {
  36. onScrollListener.onScroll(t);
  37. }
  38. }
  39.  
  40. public interface OnScrollListener {
  41. public void onScroll(int scrollY);
  42. }
  43.  
  44. //是否拦截触摸事件
  45. @Override
  46. public boolean onInterceptTouchEvent(MotionEvent ev) {
  47. if (views != null && checkAllViews(views, ev)) {
  48. return false;
  49. }
  50. return super.onInterceptTouchEvent(ev);
  51. }
  52.  
  53. public void addUnTouchableView(View view) {
  54. try {
  55. if (!views.contains(view)) {
  56. views.add(view);
  57. }
  58. } catch (Exception e) {
  59. if (e != null) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }
  64.  
  65. public void delUnTouchableView(View view) {
  66. try {
  67. if (views.contains(view)) {
  68. views.remove(view);
  69. }
  70.  
  71. } catch (Exception e) {
  72. if (e != null) {
  73. e.printStackTrace();
  74. }
  75. }
  76. }
  77.  
  78. public void delAllUnTouchableView() {
  79. try {
  80. if (views.size() > 0) {
  81. views.clear();
  82. }
  83.  
  84. } catch (Exception e) {
  85. if (e != null) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90.  
  91. private boolean checkAllViews(List<View> views, MotionEvent event) {
  92. for (View view : views) {
  93. if (checkInLvArea(view, event)) {
  94. return true;
  95. }
  96. }
  97. return false;
  98. }
  99.  
  100. private boolean checkInLvArea(View v, MotionEvent event) {
  101. try {
  102. float x = event.getRawX();
  103. float y = event.getRawY();
  104. int[] locate = new int[2];
  105. v.getLocationOnScreen(locate);
  106. int l = locate[0];
  107. int r = l + v.getWidth();
  108. int t = locate[1];
  109. int b = t + v.getHeight();
  110. if (l < x && x < r && t < y && y < b) {
  111. return true;
  112. }
  113. return false;
  114. } catch (Exception e) {
  115. if (e != null) {
  116. e.printStackTrace();
  117. }
  118. }
  119. return false;
  120.  
  121. }
  122.  
  123. }

滑动ScrollView后,显示新的页面head的技巧:

  1. MyScrollView scrollView = (MyScrollView) findViewById(R.id.scrollView);
  2. scrollView.setOnScrollListener(new OnScrollListener() {
  3.  
  4. @Override
  5. public void onScroll(int scrollY) {
  6.  
  7. int top = Math.max(scrollY, mLayoutHead.getTop()/2);
  8. mLayoutHeadNew.layout(0, top, mLayoutHeadNew.getWidth(), top + mLayoutHeadNew.getHeight());
  9. if(scrollY>=canScrollHeight)
  10. {
  11. // mLayoutHead.setVisibility(View.GONE);
  12. mLayoutHeadNew.setVisibility(View.VISIBLE);
  13. }else
  14. {
  15. // mLayoutHead.setVisibility(View.VISIBLE);
  16. mLayoutHeadNew.setVisibility(View.GONE);
  17. }
  18. }
  19. });

android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题的更多相关文章

  1. [Android开发那点破事]解决android.os.NetworkOnMainThreadException

    [Android开发那点破事]解决android.os.NetworkOnMainThreadException 昨天和女朋友换了手机,我的iPhone 4S 换了她得三星I9003.第一感觉就是好卡 ...

  2. Android——MeasureSpec学习 - 解决ScrollView嵌套ListView和GridView冲突的方法

      原文地址:http://blog.csdn.net/yuhailong626/article/details/20639217   在自定义View和ViewGroup的时候,我们经常会遇到int ...

  3. android 有弹性的ScrollView 简单实现,与处理ScrollView和ListView,GridView之间的冲突

    处理ScrollView和ListView,GridView之间的冲突, 最好的办法就是继承这两个类,重写他们的onMeasure方法即可: ListView: import android.widg ...

  4. 一键解决ScrollView嵌套ListView仅仅显示一行的问题

    /** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnCh ...

  5. android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件

    在开发中遇到ScrollView嵌套ListView的问题,最开始发出不能全屏,效果是这样的: 但我想要的效果是这样的: 下面看一下布局文件: <?xml version="1.0&q ...

  6. Android 解决ScrollView嵌入ListView | GridView | ScrollView显示问题

    一.ScrollView中嵌套ListView ScrollView和ListView都是滚动结构,很明显如果在ScrollView中加入ListView,可以预见性的知道,肯定会有显示/滚动的问题, ...

  7. 转:四种方案解决ScrollView嵌套ListView问题

    转载自:http://blog.sina.com.cn/s/blog_46798aa80101lxbk.html 原始的连接已经不知道是哪里了,项目中遇到了同样的问题,花了一下午都没有想到是嵌套引起的 ...

  8. 转-四种方案解决ScrollView嵌套ListView问题

    本人网上用的ID是泡面或安卓泡面,学习一年半之前开始从事Android应用开发,这是我写的第一篇Android技术文章,转载请注明出处和作者,有写的不好的地方还请帮忙指出,谢谢. 在工作中,曾多次碰到 ...

  9. 四种方案解决ScrollView嵌套ListView问题(转)

    以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollVie ...

随机推荐

  1. 利用扩展双屏技术及Chrome浏览器,高速剖析优秀网页Div及CSS构成,并高效实现原型创作

    作为一个Web前台设计人员,应该充分利用可利用的硬件条件及专业的软件工具,迅速进入到高效氛围其中.实践中,我们能够利用扩展桌面双屏技术及Chrome浏览器高速剖析优秀网页Div及CSS构成,并高速实现 ...

  2. Codeforces Round #260 (Div. 2)A. Laptops

    A. Laptops time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  3. ios浅谈关于nil和 NIL区别及相关问题(转)

    转自:http://blog.csdn.net/guozh/article/details/8469131 个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次 ...

  4. C# 创建验证码图片

    using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; us ...

  5. SqlBulkCopy使用心得 (大量数据导入)

    文章转载原地址:http://www.cnblogs.com/mobydick/archive/2011/08/28/2155983.html 最近做的项目由于之前的设计人员懒省事,不按照范式来,将一 ...

  6. Java数据结构漫谈-Stack

    Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点. Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的. cla ...

  7. Qt串口通信

    1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...

  8. C#计算当前日期为一年中的第几周

    方法一: private   int   WeekOfYear(string   date) { DateTime   curDay   =   Convert.ToDateTime(date); i ...

  9. js中的两个数字a,b求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。一共b个数字相加,例如用户输入2,5 s=2+22+222+2222+22222

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. 关于JS中的this关键字

    在学习js时,应该先了解下this关键字,关于js中的this关键字和其他的面向对象语言中的this是不同的,比如在java中,this指的的是当前对象,而在js中,w3c是这样规定的: 关键字 th ...