ScrollView 和 ListView ,GridView的嵌套问题

A.ScrollView 和 ListView ,GridView的嵌套时显示不全的问题。

这种情况可以重写ListView ,GridView,给其高度一个比较大的值。

public class MyListView extends ListView {
    public MyListView(Context context) {
        super(context);
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyListView(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);
    }
    
}
B.解决完问题A你会发现还有其他奇葩的问题:切换界面时会出现无法定位到顶部或上次滑动停留的位置

解决方法:

(1)在activity或fragment适合的生命周期中(如onResume())调用:

mPullRefreshScrollView.setFocusableInTouchMode(true);

(2)也可以使用,不过这种情况在快速切换的情况下,会有点滑动的感觉。

scrollview.scrollTo(x,y);

scrollview.smoothScrollTo(0, 0);

//下面是用到PullToRefresh的时候

   scrollview.getRefreshableView().scrollTo(0, 0);  
    scrollview.getRefreshableView().smoothScrollTo(0, 0);

这个方法定位到某一位置

(3)利用mPullRefreshScrollView.getRefreshableView();获取真正的的ScrollView

然后利用ScrollView.fullScroll(**);方法定位.

需要注意的是该方法不能直接在主线程中调用,否则无效,利用post方法间接调用

// 滑动至顶部
scrollView.post(new Runnable() {
public void run() {
scorllView.fullScroll(ScrollView.FOCUS_UP);

//scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});

如果以上方法不行,在代码里去掉嵌套的listview的焦点 listView.setFocusable(false);

c.解决完以上问题,还有就是在组合使用时一般会隐藏显示一些view,哪就要重写ScrollView的滑动监听了。

public class MyScrollView extends ScrollView {
    private ScrollViewListener scrollViewListener = null;

    public MyScrollView(Context context) {
        super(context);
    }

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


    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        //x为当前滑动条的横坐标,y表示当前滑动条的纵坐标,oldx为前一次滑动的横坐标,oldy表示前一次滑动的纵坐标
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            //在这里将方法暴露出去
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }



    //是否要其弹性滑动
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
                                   int scrollY, int scrollRangeX, int scrollRangeY,
                                   int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

        // 弹性滑动关键则是maxOverScrollX, 以及maxOverScrollY,
        // 一般默认值都是0,需要弹性时,更改其值即可
        // 即就是,为零则不会发生弹性,不为零(>0,负数未测试)则会滑动到其值的位置
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,
                scrollRangeY, 0, 0, isTouchEvent);
    }
    //接口
    public interface ScrollViewListener {

        void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy);

    }
    public void setScrollViewListener(ScrollViewListener listener)
    {
        scrollViewListener=listener;
    }
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值