【解决】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就都可以实现各自的滑动了。

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

相关文章推荐

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

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

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

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

android中Scrollview 嵌套ListView显示不完整

本帖最后由 echohe 于 2014-4-9 10:13 编辑 以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全...

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

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

Android 中解决ScrollView嵌套ListView或者GridView时的冲突问题

今天在写一个布局文件,要求页面能滑动。于是就想到了用ScrollView来解决,但是运行的时候发现页面中的ListView不能滑动了。分享一下解决方案。(ListView和GridView方法相同,此...

Scrollview 嵌套listView 与recycleView 滑动冲突的解决

本来我们用recycview代替了listview之后就很少会遇到scrollview了但是产品需求总是在不断的更新。在时间与技术的探索之下,还是会有一部分兄弟会选择这样的布局,下面我就来说说使用之后...

【Android】 完美解决ScrollView嵌套ListView滑动冲突(有图有真相)

(转载请保留原文地址  csdn yang http://blog.csdn.net/lys701/article/details/8755373) 最近在android开发中,需要在Scrol...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【解决】Listview中嵌套Listview或者ScrollView中嵌套Listview【显示不完整和滑动冲突】
举报原因:
原因补充:

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