ListView实现下拉刷新和上拉加载更多

1 最终效果展示

refresh.gif

2 代码实现思路

(1)自定义控件继承Listview
(2)添加头布局
(3)添加脚布局
(4)设置触摸监听事件
(5)设置滑动监听事件

3 需要get的部分

(1)如何通过不同的触摸(DOWN,MOVE,UP)状态,改变头布局的状态,包括加载更多的进度条、箭头动画、时间的变化。(脚部相同)

 public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downY = ev.getY();//下拉的位置
                break;
            case MotionEvent.ACTION_MOVE:
                moveY = ev.getY();//移动的位移

                float offset = moveY - downY; // 移动的偏移量

                // 只有 偏移量>0, 并且当前第一个可见条目索引是0, 才放大头部
                if(offset > 0 && getFirstVisiblePosition() == 0){
                    int paddingTop = (int) (- mHeaderViewHeight + offset);//整个是负值,往出拉多少,就将负值减少多少
                    mHeaderView.setPadding(0, paddingTop, 0, 0);

                    if(paddingTop >= 0 && currentState != RELEASE_REFRESH){// 头布局完全显示
                        // 切换成释放刷新模式
                        currentState = RELEASE_REFRESH;
                        updateHeader(); // 根据最新的状态值更新头布局内容
                    }else if(paddingTop < 0 && currentState != PULL_TO_REFRESH){ // 头布局不完全显示
                        // 切换成下拉刷新模式
                        currentState = PULL_TO_REFRESH;
                        updateHeader(); // 根据最新的状态值更新头布局内容
                    }
                    return true; // 当前事件被我们处理并消费
                }
                break;
            case MotionEvent.ACTION_UP:
                // 根据刚刚设置状态
                if(currentState == PULL_TO_REFRESH){
                //- paddingTop < 0 不完全显示, 恢复
                    mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);
                }else if(currentState == RELEASE_REFRESH){
                //- paddingTop >= 0 完全显示, 执行正在刷新...
                    mHeaderView.setPadding(0, 0, 0, 0);
                    currentState = REFRESHING;
                    updateHeader();
                }
                break;
            default:
                break;
        }

        return super.onTouchEvent(ev);
    }

(2)当下拉刷新和上拉加载更多之后,数据的获取以及更新。

在View中设置监听接口

 public interface OnRefreshListener{
        void onRefresh();
        void onLoadMore();
    }

    public void setRefreshListener(OnRefreshListener mListener){
        this.mListener = mListener;
    }

在Activity中使用监听接口,监听状态

list_view.setRefreshListener(new RefreshListView.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        listDatas.add(0,"下拉刷新出来的数据");

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                refreshAdapter.notifyDataSetChanged();//刷新数据
                                list_view.onRefreshcomplete();
                            }
                        });
                    }
                }.start();
            }

            @Override
            public void onLoadMore() {
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        listDatas.add("加载更多");

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                refreshAdapter.notifyDataSetChanged();
                                list_view.onRefreshcomplete();
                            }
                        });
                    }
                }.start();
            }
        });

你可能感兴趣的:(ListView实现下拉刷新和上拉加载更多)