Android 笔记1——listview(gridview)下拉刷新

下拉刷新效果是APP常见的一种动画效果,前段时间要完成这个效果,试了几种方案,其中也包括后续的笔记要介绍的NestedScrolling。在这里先介绍一种基本的方法,通过自定义View来实现。

实现原理:

自定义的父View首先要包括两部分子View:头部(刷新的效果在此设计)和ListView部分。初始布局的时候,先隐藏头部,当滑动ListView到最顶部的时候,父View截断滑动监听,让头部随手指滑动慢慢显示。

具体步骤:

1先自定义一个View继承自ViewGroup(为了方便布局,这里以LinearLayout为父ViewGroup),初始化头部子View 和ListView。

private void initHeaderView() {
    mHeaderView = mInflater.inflate(R.layout.XXX,null);
    this.addView(mHeaderView, 0);
}

2重写onLayout,获取头部View的高度h,通过设置相对于头部的padding为-h,将头部隐藏。

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    if (changed && mHeaderHeight <= 0) {
        mHeaderHeight = mHeaderView.getHeight();
        adjustPadding(-mHeaderHeight);
    }
}
private void adjustPadding(int topPadding) {
    mHeaderView.setPadding(mHeaderView.getPaddingLeft(), topPadding,
            mHeaderView.getPaddingRight(), 0);
}

3重写onInterceptTouchEvent,使ListView滑动到顶部的时候,截断滑动。判断滑动到顶端的程序如下:

protected boolean isTop() {
    View firstChild = mGridtView.getChildAt(0);
    if (firstChild == null) {
        return true;
    }
    return (mGridtView.getFirstVisiblePosition() == 0)
            && (firstChild.getTop() >= 0);
}
 
  

其基本思想为可见的position为0,且距离顶部距离为0(保证最顶端的item完全可见后才响应下拉刷新)

4 重写onTouchEvent,跟随手指滑动的距离调整头部View与top的padding。当手指抬起的时候,重新设置padding将其隐藏。


你可能感兴趣的:(Android 笔记1——listview(gridview)下拉刷新)