ScrollView、SwipeRefreLayout、ListView的滑动冲突问题

来源:互联网 发布:hadoop大数据平台 编辑:程序博客网 时间:2024/05/18 05:46

1、SwipeRefreLayout嵌套ListView的滑动冲突:

有时候你用ListView时想用到原生的下拉刷新,用SwipeRefreLayout嵌套ListView后发现初始ListView还能向上滑动,可是当你滑动到ListView的底部的时候发现再往下滑动就是刷新了,我再想回到上面去查看我的item内容就不行了。这是因为Android的事件分发机制,外层的SwipeRefreLayout拦截了下滑手势并且消费了事件,里面的ListView自然也就无法下滑了。那么怎么解决这一冲突呢?很简单SwipeRefreLayout提供了一个setEnabled(boolean flag),我们只需要对ListView设置滚动监听在onScroll()方法内处理即可。贴代码:

 mListView.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                boolean enable=false;                if(mListView != null && mListView.getChildCount() > 0){
    //获得ListView当前显示的第一个item的id
boolean firstItemVisible = mListView.getFirstVisiblePosition() == 0;
    //ListView的顶部距离上面的距离=0
boolean topOfFirstItemVisible = mListView.getChildAt(0).getTop() == 0; // 综合上面两个判断条件来设置SwipeRefreLayout enable = firstItemVisible && topOfFirstItemVisible; } mSwipeRefreshLayout.setEnabled(enable); } });

2、ScrollView嵌套ListView时只显示一条的问题:方法来源点击打开链接
//解决scrollView嵌套listview只显示一条数据的问题public void setListViewHeightBasedOnChildren(ListView listView) {    // 获取ListView对应的Adapter    ListAdapter listAdapter = listView.getAdapter();    if (listAdapter == null) {        return;    }    int totalHeight = 0;    for (int i = 0, len = listAdapter.getCount(); i < len; i++) {        // listAdapter.getCount()返回数据项的数目        View listItem = listAdapter.getView(i, null, listView);        // 将view.measure(0,0)设置为0的时候表示,此时不需要考虑父控件的布局问题,直接使用getMeasuredWidth和getMeasuredHeight获取此view的自身的实际大小        listItem.measure(0, 0);        // 统计所有子项的总高度        totalHeight += listItem.getMeasuredHeight();    }    ViewGroup.LayoutParams params = listView.getLayoutParams();    params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));    // params.height最后得到整个ListView完整显示需要的高度    listView.setLayoutParams(params);}有一点要说明:这种方法要在ListView.setAdapter(adapter)之后使用
    方法要在ListView.setAdapter(adapter)之后使用
            方法要在ListView.setAdapter(adapter)之后使用
才有效,为什么上面的代码:
ListAdapter listAdapter = listView.getAdapter();



0 0