ListView和RecyclerView(通用)里面的时间倒计时

公司暂时不忙,看了许许多多的博客,今天突发想写个博客的念头。

在公司的一个项目中,有一个类似大部分商城都有的"限时秒杀"的倒计时功能,先上图,动图不知道怎么搞(尴尬不知道怎么放图,找了好久)


先来说说实现原理: 后台是返回了一个结束时间(是一个日期);

我的想法是 我获取系统的当前时间-后台的返回时间=还有多少时间结束。

上代码,写得不好,请原谅

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();

        }
    }


}
里面的数据需要改成自己的





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值