前面我们介绍RecyclerView局部刷新功能实现,我们可以利用局部刷新功能实现倒计时功能。
倒计时其实就是每个1秒去刷新TextView,实现时间变化,然而在RecyclerView itemView 复杂时候,我们全局刷新,往往会造成性能损耗,所以我们采用局部,只刷新TextView 一个控件来实现倒计时功能
1、handler + recyclerView 来实现列表倒计时
handler用来延迟一秒实现倒计时效果,通知RecyclerView刷新单个条目TextView时间
handler = new Handler(getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//固定条目刷新
CountDownBean countDownBean = countDownBeans.get(0);
countDownBean.setCountDown(countDownBean.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(0, 1);
CountDownBean countDownBean1 = countDownBeans.get(1);
countDownBean1.setCountDown(countDownBean1.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(1, 1);
CountDownBean countDownBean2 = countDownBeans.get(2);
countDownBean2.setCountDown(countDownBean2.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(2, 1);
CountDownBean countDownBean3 = countDownBeans.get(3);
countDownBean3.setCountDown(countDownBean3.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(3, 1);
CountDownBean countDownBean4 = countDownBeans.get(4);
countDownBean4.setCountDown(countDownBean4.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(4, 1);
handler.sendEmptyMessageDelayed(1, 1000);
//不固定刷新
//获取第一条和最后一条显示position
int firstPosition = linearLayoutManager.findFirstVisibleItemPosition();
int lastPosition = linearLayoutManager.findLastVisibleItemPosition();
int countDownItemPosition = 5;
if (countDownItemPosition >= firstPosition && countDownItemPosition <= lastPosition) {
CountDownBean countDownBean5 = countDownBeans.get(countDownItemPosition);
countDownBean5.setCountDown(countDownBean5.getCountDown() - 1);
recyclerRefreshAdapter.notifyItemChanged(5, 1);
}
}
};
2、重写onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads)方法
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
RecyclerRefreshViewHolder myViewHolder = (RecyclerRefreshViewHolder) viewHolder;
myViewHolder.textView.setText("position:" + position + "--" + countDownBeans.get(position).getCountDown() + "秒");
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) {
if (payloads.size() == 0) {
//全局刷新
onBindViewHolder(holder, position);
} else {
//倒计时刷新
RecyclerRefreshViewHolder myViewHolder = (RecyclerRefreshViewHolder) holder;
myViewHolder.textView.setText("position:" + position + "--" + countDownBeans.get(position).getCountDown() + "秒(倒计时)");
}
}