【解决】Listview中嵌套Listview或者ScrollView中嵌套Listview【显示不完整和滑动冲突】

原创 2016年08月30日 09:02:42

问题描述:

  • 一个滑动控件或布局里面,添加另外一个可以滑动的控件;
  • 工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题。

解决方法:

1.ScrollView布局中嵌套Listview显示不正常:

(1)自定义一个Listview,继承自Listview:
public class ListViewForScrollView extends ListView {
    //三个构造方法
    public ListViewForScrollView(Context context) {
        super(context);
    }
    public ListViewForScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ListViewForScrollView(Context context, AttributeSet attrs,int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 需要重写onMeasure方法即可
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

PS:在使用的时候,用这个控件代替Listview控件即可。


(2)重新计算Listview的高度
  • 问题描述:
    • 在一个滑动布局中添加一个滑动控件,滑动控件的高度因为不能计算,所以“只能显示一个Item”
  • 解决方法:
    • 若要解决这个问题,我们可以“重新计算Listview的高度”,调用一个的静态方法即可。
/**
 * scrollview嵌套listview显示不全,采用计算所有ListViewd的Item方式解决
 */
public static void setListViewHeightBasedOnChildren(ListView listView) {
    //获取ListView适配器
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }
    int totalHeight = 0;
    //遍历获取所有适配器中的孩子(item)的高度
    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();
    //参数的高度赋值(加上分隔线的高度:总个数(比条目少1)*每条的高度)
    params.height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    //listView设置参数即可。
    listView.setLayoutParams(params);
}

2.在Listview中嵌套Listview的滑动冲突

  • 问题描述:
    • 在一个listview的footer(根部,即写item时底下是有ListView)中添加一个的Listview
    • 由于触摸冲突问题,小的listview不能滑动
  • 解决方法:

    • 自定义一个控件继承自listview
    • 重写onInterceptTouchEvent方法,对触摸事件进行分发。
  • 说明:

    • onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截。
    • 我们可在这个方法里对子控件或者是父控件获取触摸处理权限进行分发,从而完成各自的滑动任务。
    public class InnerListview extends ListView {
        //3个构造方法
        public InnerListview(Context context) {
            super(context);
        }
        public InnerListview(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        public InnerListview(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                // 当手指触摸listview时,让父控件交出ontouch权限,不能滚动
                case MotionEvent.ACTION_DOWN:
                    setParentScrollAble(false);
                case MotionEvent.ACTION_MOVE:
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    // 当手指松开时,让父控件重新获取onTouch权限
                    setParentScrollAble(true);
                    break;
            }
            return super.onInterceptTouchEvent(ev);
        }
        // 设置父控件是否可以获取到触摸处理权限
        private void setParentSlidAble(boolean flag) {
            //请求不要拦截        
            getParent().requestDisallowInterceptTouchEvent(!flag);
        }
    }

效果:

外面的listview和里面的小listview就都可以实现各自的滑动了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

ScrollView嵌套ListView——解决滑动冲突问题

//布局中的代码实现 一个简单的布局设置 演义滑动冲突
  • Mannver
  • Mannver
  • 2016年04月12日 20:49
  • 11162

Android ScrollView中嵌套ListView,滑动冲突问题的解决

在项目开发过程,遇到ScrollView中嵌套ListView,结果点击ListView上下滑动时,整个页面滑动,也就是滑动事件被ScrollView消费掉了,造成listView无法滑动的结果,然后...
  • androidforwell
  • androidforwell
  • 2016年09月22日 13:01
  • 3209

解决ScrollView嵌套ListView显示不完全和滑动冲突的问题

在开发中我们往往会遇到这样奇葩的需求,让一个ScrollView嵌套ListView,那么我们就会遇到这样一个问题,就是listView 显示不完全和滚动冲突的问题。下面就来解决一下这个问题 首先看一...
  • snow_anderson
  • snow_anderson
  • 2015年12月20日 20:38
  • 1258

解决ScrollView或ListView中嵌套ListView引起的冲突

转载请注明:[noyet12的博客](http://blog.csdn.net/u012975705) 在ScrollView或ListView等滑动控件中嵌套ListView时,往往会导致ListV...
  • u012975705
  • u012975705
  • 2015年11月25日 11:45
  • 4237

关于解决多个listView嵌套到scrollview中滑动冲突的办法

多个ListView嵌套到一个android UI界面中时会产生滑动冲突,主要原因是每个listView拥有自己的滑动条而造成,解决办法是为每一个listView固定一个高度.  下面介绍一个通用的方...
  • zjsczzt
  • zjsczzt
  • 2017年04月01日 10:00
  • 340

ScrollView与Listview嵌套使用时的滑动冲突问题

滑动冲突解决方案在我们的布局中有可能使用Scrollview嵌套Listview的情况,这时候如果不加任何的处理,就会发生滑动冲突问题,即Listview没有完全显示,也不能滑动,触摸事件被Scrol...
  • mXianLin
  • mXianLin
  • 2016年07月29日 09:46
  • 1292

【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题。今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌...
  • bz419927089
  • bz419927089
  • 2014年08月15日 15:38
  • 13911

利用事件分发机制解决ScrollView嵌套ListView滑动冲突

记得以前面试的时候,面试官问了ScrollView嵌套ListView使用的问题。那么ScrollView嵌套ListView使用会出现什么效果呢? 如布局文件如下: ...
  • Mr_wzc
  • Mr_wzc
  • 2016年06月28日 21:17
  • 4480

解决 ScrollView 嵌套 ListView 时,高度不正常和滑动冲突的问题

我们在用ScrollView嵌套ListView会两个问题,一个问题是ListView高度不正常,另外一个问题是ListView无法滑动。下面我们就来看看这两个问题怎么解决吧。 第一个问题 Lis...
  • u010261933
  • u010261933
  • 2017年01月13日 15:52
  • 1121

android中Scrollview 嵌套ListView显示不完整

本帖最后由 echohe 于 2014-4-9 10:13 编辑 以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全...
  • loomis13
  • loomis13
  • 2015年08月19日 16:42
  • 3194
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【解决】Listview中嵌套Listview或者ScrollView中嵌套Listview【显示不完整和滑动冲突】
举报原因:
原因补充:

(最多只允许输入30个字)