Android ListView与ScrollView冲突的解决方法总结

发布时间 - 2026-01-11 00:53:11    点击率:

Android ListView与ScrollView冲突的解决方法总结

众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题:

 问题一:ScrollView与ListView嵌套导致ListView显示不全面

 问题二:ScrollView不能正常滑动

解决方式一:

ScrollView+LinearLayout+ListView可以换成ScrollView+LinearLayout+LinearLayout,对于开发中,ScrollView所能滚动的样式形式各异,另外的话,ScrollView所显示的内容肯定不会太多,因此这种方案是合理而且可选的

解决方式二:

同样是替换:ListView具有HeaderView与FooterView2部分,因此,在非下拉刷新,上拉加载的需求中,完全可以使用ListView来代替ScrollView,因此是合理可选的方案

解决方式三:

主动计算和设置ListView的高度,这样的结果最终得出类似解决方案一效果,具体来说缺点是大材小用,但也是合理的解决办法。

public class Utility { 
    public static void setListViewHeightBasedOnChildren(ListView listView) { 
      ListAdapter listAdapter = listView.getAdapter();  
      if (listAdapter == null) { 
        return; 
      } 
 
      int totalHeight = 0; 
      for (int i = 0; i < listAdapter.getCount(); i++) { 
        View listItem = listAdapter.getView(i, null, listView); 
        listItem.measure(0, 0); 
        totalHeight += listItem.getMeasuredHeight(); 
      } 
 
      ViewGroup.LayoutParams params = listView.getLayoutParams(); 
      params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
      listView.setLayoutParams(params); 
    } 
  } 

解决方式四:

复写ScrollView,从事件方向进行处理,缺点是灵活性不够好、

public class ListScrollView extends ScrollView { 
 private List list = new ArrayList(); 
 private int scrollPaddingTop; // scrollview的顶部内边距 
 private int scrollPaddingLeft;// scrollview的左侧内边距 
 private int[] scrollLoaction = new int[2]; // scrollview在窗口中的位置 
 private final static int UPGLIDE = 0; 
 private final static int DOWNGLIDE = 1; 
 private int glideState; 
 public ListScrollView(Context context, AttributeSet attrs) { 
 super(context, attrs); 
 } 
 private int downY = 0; 
 private int moveY = 0; 
  
 @Override 
 public boolean dispatchTouchEvent(MotionEvent ev) { 
 switch (ev.getAction()) { 
 case MotionEvent.ACTION_DOWN: 
  downY = (int) ev.getY(); 
  //System.out.println("actiondown" + ev.getY()); 
  break; 
 case MotionEvent.ACTION_MOVE: 
  moveY= (int) ev.getY(); 
  //System.out.println("move" + moveY + "down" + downY); 
  if((moveY - downY) >= 0) { 
  //System.out.println("'''''''''DOWNGLIDE'''''''''''"); 
  glideState = DOWNGLIDE; 
  } else { 
  //System.out.println("'''''''''UPGLIDE'''''''''''"); 
  glideState = UPGLIDE; 
  } 
  break; 
 case MotionEvent.ACTION_UP: 
 default: 
  break; 
 } 
 return super.dispatchTouchEvent(ev); 
 } 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 // 该事件的xy是以scrollview的左上角为00点而不是以窗口为00点 
 int x = (int) ev.getX() + scrollLoaction[0]; 
 int y = (int) ev.getY() + scrollLoaction[1]; 
 for (int i = 0; i < list.size(); i++) { 
  ListView listView = list.get(i); 
  int[] location = new int[2]; 
  listView.getLocationInWindow(location); 
  int width = listView.getWidth(); 
  int height = listView.getHeight(); 
  // 在listview的位置之内则可以滑动 
  if (x >= location[0] + scrollPaddingLeft 
   && x <= location[0] + scrollPaddingLeft + width 
   && y >= location[1] + scrollPaddingTop 
   && y <= location[1] + scrollPaddingTop + height) { 
  //System.out.println(glideState); 
  if(( (listView.getLastVisiblePosition() == (listView.getCount()-1)) && (glideState == UPGLIDE) ) ) { 
   //System.out.println("up"); 
   break; 
  } 
  if(( (listView.getFirstVisiblePosition() == 0) && (glideState == DOWNGLIDE))) { 
   //System.out.println("down"); 
   break; 
  } 
  return false; //让子控件直接处理 
  } 
 } 
 return super.onInterceptTouchEvent(ev); 
 } 
 @Override 
 public boolean onTouchEvent(MotionEvent ev) { 
 return super.onTouchEvent(ev); 
 } 
  
  
 private void findAllListView(View view) { 
 if (view instanceof ViewGroup) { 
  int count = ((ViewGroup) view).getChildCount(); 
  for (int i = 0; i < count; i++) { 
  if (!(view instanceof ListView)) { 
   findAllListView(((ViewGroup) view).getChildAt(i)); 
  } 
  } 
  if (view instanceof ListView) { 
  list.add((ListView) view); 
  } 
 } 
 } 
 @Override 
 protected void onDraw(Canvas canvas) { 
 super.onDraw(canvas); 
 scrollPaddingTop = getTop(); 
 scrollPaddingLeft = getLeft(); 
 getLocationInWindow(scrollLoaction); 
 } 
 @Override 
 protected void onLayout(boolean changed, int l, int t, int r, int b) { 
 super.onLayout(changed, l, t, r, b); 
 if (this.getChildCount() != 1) { 
  try { 
  throw new ScrollException(); 
  } catch (ScrollException e) { 
  e.printStackTrace(); 
  } 
 } 
 list.clear(); 
 findAllListView(this.getChildAt(0)); 
 } 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # ListView与ScrollView冲突  # ListView与ScrollView冲突解决办法  # Android之ScrollView嵌套ListView和GridView冲突的解决方法  # Android笔记之:在ScrollView中嵌套ListView的方法  # Android ListView的item中嵌套ScrollView的解决办法  # Android编程之截屏实现方法(包括scrollview与listview)  # Android ScrollView嵌套ExpandableListView显示不正常的问题的解决办  # Android 中ScrollView嵌套GridView  # ListView的实例  # Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法  # Android 中ScrollView与ListView冲突问题的解决办法  # Android开发实现ScrollView中嵌套两个ListView的方法  # 可选  # 大材小用  # 太多  # 而不  # 希望能  # 所能  # 可以使用  # 谢谢大家  # 则可  # 解决方法  # 不能正常  # 解决办法  # 成为一种  # 众所周知  # 够好  # 之内  # 不全面  # 加载  # 窗口中  # 来代替 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 原生JS获取元素集合的子元素宽度实例  用yum安装MySQLdb模块的步骤方法  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Android自定义控件实现温度旋转按钮效果  香港服务器如何优化才能显著提升网站加载速度?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  ,交易猫的商品怎么发布到网站上去?  Android自定义listview布局实现上拉加载下拉刷新功能  详解jQuery中基本的动画方法  Android 常见的图片加载框架详细介绍  nginx修改上传文件大小限制的方法  Laravel如何处理和验证JSON类型的数据库字段  Laravel怎么清理缓存_Laravel optimize clear命令详解  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何正确选择百度移动适配建站域名?  Swift中swift中的switch 语句  Laravel如何使用Telescope进行调试?(安装和使用教程)  如何用美橙互联一键搭建多站合一网站?  南京网站制作费用,南京远驱官方网站?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  高防服务器租用如何选择配置与防御等级?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  如何用狗爹虚拟主机快速搭建网站?  进行网站优化必须要坚持的四大原则  Android仿QQ列表左滑删除操作  微信小程序 scroll-view组件实现列表页实例代码  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel安装步骤详细教程_Laravel环境搭建指南  如何快速搭建高效WAP手机网站吸引移动用户?  米侠浏览器网页背景异常怎么办 米侠显示修复  如何快速搭建自助建站会员专属系统?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  如何在香港免费服务器上快速搭建网站?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Linux安全能力提升路径_长期防护思维说明【指导】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  西安专业网站制作公司有哪些,陕西省建行官方网站?  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  详解vue.js组件化开发实践  详解jQuery停止动画——stop()方法的使用  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  常州企业网站制作公司,全国继续教育网怎么登录?