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

给出核心代码。

自己定义ScrollView

package com.figo.study.view;

import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView; public class MyScrollView extends ScrollView {
private OnScrollListener onScrollListener;
private List<View> views = new ArrayList<View>(); public MyScrollView(Context context) {
this(context, null);
} public MyScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
} @Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onScrollListener != null) {
onScrollListener.onScroll(t);
}
} public interface OnScrollListener {
public void onScroll(int scrollY);
} //是否拦截触摸事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (views != null && checkAllViews(views, ev)) {
return false;
}
return super.onInterceptTouchEvent(ev);
} public void addUnTouchableView(View view) {
try {
if (!views.contains(view)) {
views.add(view);
}
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
} public void delUnTouchableView(View view) {
try {
if (views.contains(view)) {
views.remove(view);
} } catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
} public void delAllUnTouchableView() {
try {
if (views.size() > 0) {
views.clear();
} } catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
} private boolean checkAllViews(List<View> views, MotionEvent event) {
for (View view : views) {
if (checkInLvArea(view, event)) {
return true;
}
}
return false;
} private boolean checkInLvArea(View v, MotionEvent event) {
try {
float x = event.getRawX();
float y = event.getRawY();
int[] locate = new int[2];
v.getLocationOnScreen(locate);
int l = locate[0];
int r = l + v.getWidth();
int t = locate[1];
int b = t + v.getHeight();
if (l < x && x < r && t < y && y < b) {
return true;
}
return false;
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
return false; } }

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

        MyScrollView scrollView = (MyScrollView) findViewById(R.id.scrollView);
scrollView.setOnScrollListener(new OnScrollListener() { @Override
public void onScroll(int scrollY) { int top = Math.max(scrollY, mLayoutHead.getTop()/2);
mLayoutHeadNew.layout(0, top, mLayoutHeadNew.getWidth(), top + mLayoutHeadNew.getHeight());
if(scrollY>=canScrollHeight)
{
// mLayoutHead.setVisibility(View.GONE);
mLayoutHeadNew.setVisibility(View.VISIBLE);
}else
{
// mLayoutHead.setVisibility(View.VISIBLE);
mLayoutHeadNew.setVisibility(View.GONE);
}
}
});

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. mp4文件格式之fragment mp4

    目前网络上对mp4文件格式的总结已经相当多了,我就不在这里抄别人总结的东西了,想入门的话百度一下会有许多这方面的文章.这里介绍一下其他文章中很少涉及的一种mp4文件结构,即fragment mp4,也 ...

  2. css实现两端对齐~

    今天做表单时遇到让上下两个字段对齐的情况,手机号码.用户名. 然后今天在网上找了找相关方法,发现确实是没有什么好的方法解决,特别是当需要兼容的时候.找到了两个我觉得相对还不错的方法: 方法一.是在司徒 ...

  3. IEquatable(T) interface in .Net

    原文:http://weblogs.asp.net/pawanmishra/iequatable-t-interface-in-net 泛型方法: public static bool AreEqua ...

  4. 阐述Lambada表达式

    在C#2.0引入匿名方法之前,声明委托的唯一方法就是使用命名方法,C#2.0之后的C#3.0中开始引入了Lambda表达式取代了匿名方法. 匿名方法 要说Lambda必然离不开匿名方法,实际上,Lam ...

  5. 8 Hbase get方式获取数据

    package com.hikvision.hbase.vertify.test; import org.apache.hadoop.conf.Configuration; import org.ap ...

  6. C# 窗体程序入门 之计算器

    之前一直在java的B/S,这次被要求做一个C/S,其中客户端主要是界面和socket通信.因为没有使用过C#和Visual Studio的控件编程,先来个HelloWorld. 我的环境是visua ...

  7. Oracle11g R2学习系列 之十 解决EM不能用

    不知道是什么原因https://localhost:1158/em,今天突然就不能用了.做了好多搜索也没有解决.现象是在services.msc中,不能重启OracleDBConsole服务,提示: ...

  8. $.unique() 对象组成的数组去掉重复对象

    发现一件事,一个完全由对象组成的数组,用$.unique()方法去掉重复的时候不管用 var arr = [{text:'第一个',value:'1'},{text:'第二个',value:'2'}, ...

  9. Yum中实现与apt-get install build-essential功能类似的命令

    在Ubuntu中安装完系统后,可以直接使用apt-get install build-essential命令安装常用的开发编译工具包.在诸如CentOS这样的使用Yum包管理的系统中,其实也有类似的实 ...

  10. 转载:js和jquery获取父级元素、子级元素、兄弟元素的方法

    转载网址: 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元 ...