ScrollView与listview的冲突问题汇总

来源:互联网 发布:数字电视机顶盒软件 编辑:程序博客网 时间:2024/05/16 07:18

ScrollView与listview的冲突问题汇总

两种滑动布局嵌套的时候会出现只能显示第一行,还有滑动事件冲突问题。SrcollView嵌套ListView、GridView,ListView嵌套ListView对于这情况。

解决办法一:出现这种布局,而且对于数据量都不会很大,这样重写ListView的onMeasure方法就可以了,让ListView的高度足够把所有的item都显示出来。

自定义:
MeasureSpec 有三种模式 由2进制的前两位来控制
MeasureSpec.EXACTLY:尺寸的值是多少,那么这个组件的长或宽就是多少。
MeasureSpec.AT_MOST:父组件有多大的空间就可以占多大空间。
MeasureSpec.UNSPECIFIED:可以随便用空间 不受限制。

public class Kescrlistview extends ListView {
    public Kescrlistview(Context context) {
        super(context);
    }

    public Kescrlistview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Kescrlistview(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
解决办法二:

如果只是顶部布局需要和列表一起滑动,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);
        }
    }

解决办法四:用到事件拦截机制事件的处理和传递,可以通过父View进行拦截,在事件冲突上

ListView设置固定高度 android:layout_height="200dp"
ScrollView 设置 android:fillViewport="true"
           在listView的onTouch里面拦截ScrollView的事件,使得scrollView不可以获得点击事件,这样只有listView获得点击事件!
listview.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                scrollview.requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });
  还有通过重写ScrollView,通过onInterceptTouchEvent方法进行拦截

2 0
原创粉丝点击