美文网首页
下拉刷新

下拉刷新

作者: 白帽子耗子 | 来源:发表于2016-10-21 09:45 被阅读17次

header布局

RelativeLayout里面嵌套一个LinearLayout。同时给LinearLayout配置layout_centerInParent=“trye”属性。这样才会垂直于RelativeLayotu居中。而gravity是针对于线性布局的。
然后自定义myListView 继承于ListView。

 public class ReFlashListView extends ListView{

    public ReFlashListView(Context context) {
        super(context);
        initView(context);
    }
    public ReFlashListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }
    public ReFlashListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    public void initView(Context context){
    LayoutInflater inflater = LayoutInflater.from(context);
    header = inflater.inflate(R.layout.top, null);
    this.addHeaderView(header);//这里的this是指listView
    }
    }

重写三个构造方法。并在里面initView();

这里的initView就用到了LayoutInflater。这个常用在添加一些布局填充上去


Header隐藏

布置好top布局后,要把top布局隐藏起来。
1,measureHeight(),通知父布局宽高,从而设置好top对父布局的布局
2,topHeight = header.measureHeight();获取header的高度
3,再通过setPadding()方法,设置它的padding【设置完要用invalidate()更新一下】


下拉刷新

下拉刷新的完成,要结合手势滑动,touch事件,以及自定义状态来完成。
状态分为正常(隐藏)、下拉可以刷新,松开可以刷新和正在刷新四种

实现OnScrollListener接口的方法和onTouchEvent()方法
详细代码如下

@Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        this.scrollState = scrollState;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.firstVisibleItem = firstVisibleItem;

    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (firstVisibleItem == 0) {
                isRemark = true;
                startY = (int) ev.getY();

            }
            break;
        case MotionEvent.ACTION_UP:// 按下动作完成。松开
            if (state == REFLASH) {
                state = REFLASHING;
                Toast.makeText(getContext(), "正在刷新", Toast.LENGTH_SHORT).show();
                reflashViewByState();
                iReflashListener.OnReflash();
            } else if (state == PULL) {
                state = NONE;
                isRemark = false;
                reflashViewByState();
            }
            break;
        case MotionEvent.ACTION_MOVE:
            onMove(ev);
            break;

        }

        return super.onTouchEvent(ev);
    }

    /**
     * 判断下拉过程操作中,状态的改变
     * 
     * @param ev
     */
    private void onMove(MotionEvent ev) {
        if (!isRemark) {
            return;
        }

        int temY = (int) ev.getY();
        int space = temY - startY;
        int topPadding = space - topHeight;
        switch (state) {
        case NONE:
            if (space > 0) {
                state = PULL;
                reflashViewByState();
            }
            break;
        case PULL:
            topPadding(topPadding);
            if (space > topHeight + 30 && scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                state = REFLASH;
                reflashViewByState();
            }
            break;
        case REFLASH:
            topPadding(topPadding);
            if (space < topHeight + 30 && scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                state = PULL;
                reflashViewByState();
            } else if (space <= 0) {
                state = NONE;
                isRemark = false;
                reflashViewByState();
            }
            break;

        }
    }

    private void reflashViewByState() {

        TextView tip = (TextView) header.findViewById(R.id.tip);
        ImageView arrow = (ImageView) header.findViewById(R.id.arrow);
        ProgressBar progress = (ProgressBar) header.findViewById(R.id.progress);
        RotateAnimation anim1 = new RotateAnimation(0, 180, 
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        anim1.setDuration(500);
        anim1.setFillAfter(true);
        RotateAnimation anim2 = new RotateAnimation(180, 0, 
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        anim2.setDuration(500);
        anim2.setFillAfter(true);

        switch (state) {
        case NONE:
            arrow.clearAnimation();
            topPadding(-topHeight);
            break;
        case PULL:
            arrow.setVisibility(View.VISIBLE);
            progress.setVisibility(View.GONE);
            tip.setText("下拉可以刷新");
            arrow.clearAnimation();
            arrow.setAnimation(anim2);
            break;
        case REFLASH:
            arrow.setVisibility(View.VISIBLE);
            progress.setVisibility(View.GONE);
            tip.setText("释放可以刷新");
            arrow.clearAnimation();
            arrow.setAnimation(anim1);
            break;
        case REFLASHING:
            topPadding(50);
            arrow.setVisibility(View.GONE);
            progress.setVisibility(View.VISIBLE);
            tip.setText("正在刷新");
            arrow.clearAnimation();
            break;

        }
    }

这里最主要的是结合手势处理状态的变化,每次状态变化的时候都要更新视图


更新数据

更新数据的话,可以自定义一个接口拿来更新。添加一个方法获取接口
在touch事件里面MotionEvent.ACTION_UP:// 按下动作完成。松开里面添加iReflashListener.OnReflash();这样就可以调用接口里面的方法。至于方法的实现,其实实在MainActivity里面重写的。调用的时候会自动调用重写的方法

 public void setIReflashListener(IReflashListener iReflashListener){
        this.iReflashListener = iReflashListener;
    }
    
    /**
     * 刷新数据的接口
     * @author YSH
     *
     */
    public interface IReflashListener{
        public void OnReflash();
    }

MainActivity里充血的OnReflash方法:

@Override
public void OnReflash() {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    
    @Override
    public void run() {
        //获取list
        reflashData();
        //显示view
        simple_adapter.notifyDataSetChanged();
        //通知listviwe刷新完毕
        listview.refalshComplete();
    }
}, 2000);
}

这里的句柄Handler是为了延时达到模拟数据刷新的效果,实际因为互联网的延时,数据更新会加载需要时间。并不需要我们自己加延时。


源码地址:https://github.com/SHLURENJIA/-.git

相关文章

网友评论

      本文标题:下拉刷新

      本文链接:https://www.haomeiwen.com/subject/aswquttx.html