scrollview嵌套listview滑动,上拉刷新,冲突等问题

谷歌官方是不推荐嵌套的,但是我们现在有好多布局这样做会很方便,所以,没办法自能自己研究怎么嵌套喽,当然不是我研究的,我只是学习别人的,在这纪录一下,网上其实有好多办法,比如重写listview或重写scrollview,但是感觉太麻烦啦,在网上找了半天找到一个相对简单的办法,先记下来吧。
首先scrollview嵌套listview的时候listview的宽度必须固定,比如200dp,要不然运行的时候指挥显示一条数据,但是固定高度这是不可能的,因为我们要根据不同的机型适配,所以就有人想到办法,在后台动态设置高度,其实也就是把listview的高度固定,有多少个控件,就多高,这样listview就永远不会滑动,但是他的高度再增加,这样就会超出屏幕,出发scrollview的滑动事件,这样就能实现我们想要的效果,即把listview的滑动转变成scrollview的滑动,废话不多说,上代码:
public ViewGroup.LayoutParams getListViewParams() {
        // 通过ListView获取其中的适配器adapter
        ListAdapter listAdapter = lv.getAdapter();

        // 声明默认高度为0
        int totalHeight = 0;
        // 便利ListView所有的item,累加所有item的高度就是ListView的实际高度
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, lv);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        // 将累加获取的totalHeight赋值给LayoutParams的height属性
        ViewGroup.LayoutParams params = lv.getLayoutParams();
        params.height = totalHeight + (lv.getDividerHeight() * (listAdapter.getCount() - 1));
        return params;
    }

在这里面lv机试listview,这段代码在listviewsetAdapter之后调用即可,比如:
lv.setAdapter(myadapter);
lv.setLayoutParams(getListViewParams());
这样就可以让listview的高度动态增加这样就可以啦

但是我还有个需求,就是实现上拉刷新,就是滑动到底部就自动加载新的数据,本来listview是这样加载的,就是监听它的滑动事件,代码如下:

lv.setOnScrollListener(new OnScrollListener() {

            /**
             * scrollState 
             * 0停止滑动
             * 1 正在滑动
             * 2惯性滑动
             */
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                /*
                    如果isDivPage为true,并且滑动停止,表示已经到达了底部
                */
                if (isDivPage&&scrollState==0) {
                    //在这里实现加载新数据的方法
                }
            }

            /**
             * firstVisibleItem 显示的第一条
             * visibleItemCount 有多少条显示
             * totalItemCount 一共有多少条数据
             */

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                /* isDivPage判断是否到底部
                根据滑动的时候打印firstVisibleItem和visibleItemCount的值发现,越靠近底部,二者的和越接近totalItemCount,到底部后二者的和刚好等于totalItemCount,所以就可以用isDivPage判断是否到达底部
                    当firstVisibleItem+visibleItemCount
                */
                isDivPage=((firstVisibleItem+visibleItemCount)==totalItemCount);
                if (isDivPage) {
                    lastID=totalItemCount;
                }
            }
        });

但是在这里listview已经固定高度,咏古额不会超出,也就是不会滑动,所以这种办法就放弃啦,但是scrollview却没有这个接口,没办法用这个办法判断是否到达底部,只能再求度娘啦,好在功夫不负有心人,最终还是找到啦,代码如下:

scrollview.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                //手指按下调用一次
                    break;
                case MotionEvent.ACTION_MOVE:
                //手指按下移动式会一直调用
                    //如果在这里判断是否到达底部,,会一直加载数据,这样就会卡死
                    break;
                case MotionEvent.ACTION_UP:
                //手指离开,表示上拉一次,就调用一次
                    // 这样能保证每次手指点击只能调用一次
                    int scrollY = v.getScrollY();
                    int height = v.getHeight();
                    int scrollViewMeasuredHeight = new_next_scroll.getChildAt(0).getMeasuredHeight();
                    if (scrollY == 0) {
                        Log.e("scroll", "滑动到了顶端 view.getScrollY()=" + scrollY);
                    }
                    if ((scrollY + height) == scrollViewMeasuredHeight) {
                        // 到达底部,刷新数据
                        刷新数据的方法。。。。
                    }
                    break;

                }
                return false;
            }
        });
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值