公司暂时不忙,看了许许多多的博客,今天突发想写个博客的念头。
在公司的一个项目中,有一个类似大部分商城都有的"限时秒杀"的倒计时功能,先上图,动图不知道怎么搞(尴尬不知道怎么放图,找了好久)
先来说说实现原理: 后台是返回了一个结束时间(是一个日期);
我的想法是 我获取系统的当前时间-后台的返回时间=还有多少时间结束。
上代码,写得不好,请原谅
1.时间的处理
//获取当前时间 进行相减
long currentTime = System.currentTimeMillis();
//转成Date
Date date = new Date(currentTime);
//获取当前时间戳
date.getTime();
//定义 yyyy-MM-dd HH:mm:ss的格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格林尼治+或-
df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Date date1;
//最长的时间
long max = 0;
try {
for (int i = 0; i < miaoShaBean.data.size(); i++) {
//转换成yyyy-MM-dd HH:mm:ss
date1 = df.parse(miaoShaBean.data.get(i).end_date);
//计算出Long类型的 还有多少时间
long time = date1.getTime() - date.getTime();
//工具类转换成 *天*时*分*秒
Log.e("剩余多少时间", Date_Utils.longToString(time));
//修改成Long的样子 方便减1
miaoShaBean.data.get(i).end_date = time + "";
//因为是RecyclerView 所以肯定有多个item 我这里获取了
//最长的时间,我只使用一个计时器,用最长的倒计时进行计时就可以了
if (max < time) {
max = time;
}
}
} catch (ParseException e) {
e.printStackTrace();
}
上面的代码都有注释
Date_Utils.longToString(time)
这里是将long类型的time转成天时分秒并打印出来看看 方法如下
public static String longToString(long data) {
long D = data/(24*60*60*1000);
long H = (data%(24*60*60*1000))/(60*60*1000);
long M = (data%(24*60*60*1000)%(60*60*1000))/(60*1000);
long S = (data%(24*60*60*1000)%(60*60*1000)%(60*1000))/1000;
String str =D+"天"+H+"时"+M+"分"+S+"秒";
return str;
}
2.设置适配器 方法1已经把后台返回的结束时间转换成long的字符串 在设置数据的时候用那个longToString显示成天时分秒
//new 一个适配器
miaosha_adapter = new HorizontalListAdapter(getActivity(), miaoShaBean.data);
//设置适配器
miaosha_list.setAdapter(miaosha_adapter);
3.设置倒计时
//开始计时器 每秒减一 这里的计时器只对 还没结束的商品进行倒计时 Adapter里面的计时器队商品结束计时做改动
new CountDownTimer(max, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// Log.v("CountDownTimerTest", "onTick millisUntilFinished = " + millisUntilFinished);
//for循环Bean里面的每个item数据
for (int i = 0; i < miaoShaBean.data.size(); i++) {
//HP-1
if (!miaoShaBean.data.get(i).end_date.equals("已结束"))
//对没有结束的倒计时进行-1秒的操作
//在方法一中已经对end_date做了long类型的字符串转换 所以这里直接可以Long.valueOf转成long
miaoShaBean.data.get(i).end_date = Long.valueOf(miaoShaBean.data.get(i).end_date) - 1000 + "";
}
//刷新适配器 ----一定要对源数据进行修改 刷新才有用
miaosha_adapter.notifyDataSetChanged();
}
@Override
public void onFinish() {
//Log.v("CountDownTimerTest", "onFinish");
}
}.start();
4.到这里其实已经完成了倒计时,做一下结束处理,在Adapter里面设置计时器,做每个item结束计时后的操作
主要是exeTimer()这个方法
/**
* Created by 傀儡偶段 on 2018/4/13.
*/
public class HorizontalListAdapter extends BaseAdapter {
private Context context;
private List<MiaoShaBean.result_data> list;
private long max = 0;
private boolean flag = true;
private CountDownTimer cdt=null;
public HorizontalListAdapter(Context context, List<MiaoShaBean.result_data> xlist) {
this.context = context;
this.list = xlist;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh = new ViewHolder();
if (convertView == null) {
convertView = View.inflate(context, R.layout.horizontallistview_item, null);
vh.discount = convertView.findViewById(R.id.b1_miaosha_discount);
vh.img = convertView.findViewById(R.id.b1_miaosha_img);
vh.name = convertView.findViewById(R.id.b1_miaosha_name);
vh.time = convertView.findViewById(R.id.b1_miaosha_time);
vh.price = convertView.findViewById(R.id.b1_miaosha_price);
convertView.setTag(vh);
} else {
vh = (ViewHolder) convertView.getTag();
}
Glide.with(context).load(list.get(position).goods_img).into(vh.img);
exeTimer(list.get(position).end_date.equals("已结束")?0:Long.valueOf(list.get(position).end_date), position);
vh.time.setText(list.get(position).end_date.equals("已结束")?"已结束":
Date_Utils.longToString(Long.valueOf(list.get(position).end_date)));
vh.name.setText(list.get(position).name);
vh.discount.setText(list.get(position).team_discount==null? "未打折" : list.get(position).team_discount+"折");
vh.price.setText("¥" + list.get(position).promote_price);
return convertView;
}
private void exeTimer(long time, final int position) {
new CountDownTimer(time, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// Log.v("CountDownTimerTest", "onTick millisUntilFinished = " + millisUntilFinished);
//list.get(position).gmt_end_time = millisUntilFinished + "";
//notifyDataSetChanged();
}
@Override
public void onFinish() {
//Log.v("CountDownTimerTest", "onFinish");
list.get(position).end_date = "已结束";
notifyDataSetChanged();
}
}.start();
}
class ViewHolder {
ImageView img;
TextView time;
TextView name;
TextView price;
TextView discount;
}
public class MyCountDownTimer extends CountDownTimer {
private int position;
public MyCountDownTimer(long millisInFuture, long countDownInterval, int position) {
super(millisInFuture, countDownInterval);
this.position = position;
}
@Override
public void onTick(long millisUntilFinished) {
// Log.v("CountDownTimerTest", "onTick millisUntilFinished = " + millisUntilFinished);
// Log.v("CountDownTimerTest", "onTick millisUntilFinished = " + millisUntilFinished);
list.get(position).end_date = millisUntilFinished + "";
//if (position == 0) {
notifyDataSetChanged();
//}
}
@Override
public void onFinish() {
//Log.v("CountDownTimerTest", "onFinish");
list.get(position).end_date = "已结束";
notifyDataSetChanged();
}
}
}
里面的数据需要改成自己的