自己动手写RecyclerView的下拉刷新2

简介: 自己动手写RecyclerView的下拉刷新

刷新完成的实现及设置刷新时的监听

实现完成刷新的功能

现在看下当刷新的状态变为刷新完成,做了什么

 @Override
    public void refreshComplete() {
        setState(STATE_DONE);//设置刷新的状态为已完成
        //延迟200ms后复位,主要是为了显示“刷新完成”的字样,不延迟的话由于时间太短就看不见“刷新完成”的字样
        new Handler().postDelayed(new Runnable() {
            public void run() {
                reset();
            }
        }, 200);
    }

可以看到refreshComplete方法主要是将状态标志位设置为已完成,同时延迟200ms将下来刷新的状态复位,下面分别看下setState方法和reset方法都做了什么

public void setState(int state) {
        //状态没有改变时什么也不做
        if (state == mState) return;
        switch (state) {
            case STATE_NORMAL:
                if (mState == STATE_RELEASE_TO_REFRESH) {
                    mArrowImageView.startAnimation(mRotateDownAnim);
                }
                if (mState == STATE_REFRESHING) {
                    mArrowImageView.clearAnimation();
                }
                mStatusTextView.setText("下拉刷新");
                break;
            case STATE_RELEASE_TO_REFRESH:
                mArrowImageView.setVisibility(View.VISIBLE);
                mProgressBar.setVisibility(View.INVISIBLE);
                if (mState != STATE_RELEASE_TO_REFRESH) {
                    mArrowImageView.clearAnimation();
                    mArrowImageView.startAnimation(mRotateUpAnim);
                    mStatusTextView.setText("释放立即刷新");
                }
                break;
            case STATE_REFRESHING:
                mArrowImageView.clearAnimation();
                mArrowImageView.setVisibility(View.INVISIBLE);
                mProgressBar.setVisibility(View.VISIBLE);
                smoothScrollTo(mMeasuredHeight);
                mStatusTextView.setText("正在刷新...");
                break;
            case STATE_DONE:
                mArrowImageView.setVisibility(View.INVISIBLE);
                mProgressBar.setVisibility(View.INVISIBLE);
                mStatusTextView.setText("刷新完成");
                break;
            default:
        }
        mState = state;//保存当前刷新的状态
    }

setState方法里,主要及时根据不同的刷新状态的标志,设置视图的显示隐藏以及文字的改变。

public void reset() {
        smoothScrollTo(0);
        setState(STATE_NORMAL);
    }

reset方法就是将头部刷新View的高度还设置为0,就是将头部刷新View隐藏通知将刷新的状态设置为STATE_NORMAL

看完了方法,下面就在自己实现的RecyclerView中调用刷新完成的方法,代码如下

public void refreshComplete() {
        if (mRefreshing) {
            mRefreshing = false;
            mRefreshHeader.refreshComplete();
        }
    }

设置刷新时的监听

这里,将刷新时的监听放在当刷新视图显示正在刷新时,即当触发了刷新并且手指抬起时,可能说的难懂,相信看下代码就明白了

mLastY = -1; // reset
if (isOnTop()&& !mRefreshing) {
    if (mRefreshHeader.onRelease()) {
     //手指松开
        if (mRefreshListener != null) {
            mRefreshing = true;
            mRefreshListener.onRefresh();//调用正在刷新的监听,在此方法中实现网络的请求操作。
        }
     }
 }

下拉刷新的使用

  下拉刷新的功能已经全部完成了,下面看下怎么使用

public class MainActivity extends AppCompatActivity {
    private List<String> mStringList = new ArrayList<>();
    private RefreshHeaderRecyclerView mRecyclerView;
    private RefreshHeaderAdapter mAdapter;
    private static final int FINISH = 1;
    @SuppressLint("HandlerLeak")
    private  Handler sHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == FINISH) {
                Toast.makeText(MainActivity.this,"刷新完成!",Toast.LENGTH_SHORT).show();
                mRecyclerView.refreshComplete();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        setupRecyclerView();
    }
    private void setupRecyclerView() {
        mRecyclerView = findViewById(R.id.recyclerView);
        mAdapter = new RefreshHeaderAdapter(mStringList, this);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                requestData();//模拟数据的请求
            }
        });
    }
    private void requestData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                MainActivity.this.toString();
                try {
                    Thread.sleep(1500);
                    Message message = Message.obtain();
                    message.what = FINISH;
                    sHandler.sendMessage(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    private void initData() {
        for (int i = 0; i < 15; i++) {
            mStringList.add("");
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        sHandler.removeCallbacks(null);
    }
}

上面的代码不难,相信你一看就懂,这里就不讲解了,看下最终的效果,如图

实现下拉刷新的步骤总结

  1. 自定义Adapter继承至RecyclerView的Adapter
  2. 重写getItemType()方法
  3. 在onCreateViewHolder()方法中实例化RefreshHeader对象。
  4. 新建一个类继承至LinearLayout并实现IRehreshView接口
  5. 在初始化时将布局属性设置为0,既隐藏头部刷新。
  6. 重写RecyclerView主要是重写RecyclerView的onTouchEvent方法,根据滑动的距离来显示头部刷新的View
  7. 设置监听

结束语

  相信按照上面的步骤,你一定可以自己动手实现RecyclerView的下拉刷新功能。源码点击这里获取

相关文章
自己动手写RecyclerView的下拉刷新1
自己动手写RecyclerView的下拉刷新
自己动手写RecyclerView的上拉加载
自己动手写RecyclerView的上拉加载
|
JavaScript
每日一题:如何实现上拉加载,下拉刷新?
每日一题:如何实现上拉加载,下拉刷新?
270 0
每日一题:如何实现上拉加载,下拉刷新?
|
XML 程序员 开发工具
【Android开发】 ListView使用实战详解,你get到了嘛?
【Android开发】 ListView使用实战详解,你get到了嘛?
294 0
【Android开发】 ListView使用实战详解,你get到了嘛?
|
API
为RecyclerView添加下拉刷新功能
在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView。 现今App中列表的下拉刷新和上拉加载已经是一种习惯了,这两个操作也确实方便很多。 为RecyclerView添加这个功能可以通过多种方法,这里我选用了一种简单的做法。基于pulltorefresh这个库。
179 0
|
C# 索引 Windows
C#编程-54:ListView控件复习笔记
C#编程-54:ListView控件复习笔记
111 0
老大爷都能看懂的RecyclerView动画原理
老大爷都能看懂的RecyclerView动画原理
老大爷都能看懂的RecyclerView动画原理
|
缓存 Android开发
RecyclerView高级进阶之优雅地解决瀑布流的两个神坑
RecyclerView高级进阶之优雅地解决瀑布流的两个神坑
RecyclerView高级进阶之优雅地解决瀑布流的两个神坑
|
缓存 算法
当RecyclerView滚动时它干了什么
当RecyclerView滚动时它干了什么
当RecyclerView滚动时它干了什么
|
Android开发 开发者 Kotlin
【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )
【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )
286 0