一个包含了下拉刷新,上拉加载的列表倒计时,类似于商城列表秒杀,到时抢的功能。
先看下效果图
参考了一个线程玩转商品列表所有item的倒计时器,并对Adapter进行单控件刷新优化的想法,做了一些修改,只需要开启一个线程来开启倒计时,统计数据的个数,当所有的数据倒计时结束,跳出循环,线程停止。
private class CountDownThread implements Runnable{
boolean stopThread = false;
int count;
@Override
public void run() {
while (!stopThread) {
try {
if(count==mList.size()){
stopThread = true;
return;
}
Thread.sleep(1000);
long countDownTime = 0;
for (int i = 0; i < mList.size(); i++) {
if(mList.get(i).getCountDownTime()==0)continue;
countDownTime = mList.get(i).getCountDownTime();
if (countDownTime >= 1000) {
mList.get(i).setCountDownTime(countDownTime - 1000);
if(mList.get(i).getCountDownTime()==0){
count++;
}
}
}
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在Handler中去更新数据,并且只是局部刷新TextView中的值,不用刷新每个Item中所有的数据。
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
//局部刷新
adapter.notifyText();
}
super.handleMessage(msg);
}
};
在Adapter中的局部刷新方法,在此感谢BaseQuickAdapter
public void notifyText(){
for(int i = 0;i<mViewHolder.size();i++){
//需要判断当前holder是否还在屏幕中,
if(mViewHolder.get(i).getLayoutPosition()>=0){
((TextView)mViewHolder.get(i).getView(R.id.tv_count_down_time)).setText("倒计时:"+DataFormatUtil.countDownTime(mList.get(mViewHolder.get(i).getLayoutPosition()).getCountDownTime()));
}
}
}
正常的调用下拉刷新,上拉加载,
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
refreshLayout.finishRefresh();
initData();
adapter.notifyDataSetChanged();
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
loadMore();
refreshLayout.finishLoadMore();
}
});
这里引用了Android智能下拉刷新框架-SmartRefreshLayout,特此感谢,想必大家都用过,很好用,没有用过的,也可以去看看,学习下大佬的思想,最终变成自己的。
github地址:https://github.com/Veken/RecyclerViewDemo/tree/master
Thanks: