刷新完成的实现及设置刷新时的监听
实现完成刷新的功能
现在看下当刷新的状态变为刷新完成,做了什么
@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); } }
上面的代码不难,相信你一看就懂,这里就不讲解了,看下最终的效果,如图
实现下拉刷新的步骤总结
- 自定义Adapter继承至RecyclerView的Adapter
- 重写getItemType()方法
- 在onCreateViewHolder()方法中实例化RefreshHeader对象。
- 新建一个类继承至LinearLayout并实现IRehreshView接口
- 在初始化时将布局属性设置为0,既隐藏头部刷新。
- 重写RecyclerView主要是重写RecyclerView的onTouchEvent方法,根据滑动的距离来显示头部刷新的View
- 设置监听
结束语
相信按照上面的步骤,你一定可以自己动手实现RecyclerView的下拉刷新功能。源码点击这里获取