Android进阶之ListView实现多条数据同时倒计时功能

1 概述

最近在做一个网购APP,有个小功能就是限时抢购商品在限定时间内有优惠活动,我们需要给每个件商品做一个倒计时显示告诉用户还剩下多少时间。项目中我们有用到ListView和GridView来加载我们的商品数据,对每条数据(对应一件商品)进行倒计时。倒计时实现方式很多,常用的有以下方式:

1,采用Handle与线程的sleep(long)

2,采用Handler的postDelayed(Runnable, long)方法

3,采用Handler与timer及TimerTask结合的方法

在实现过程中也有一小点问题,就是开始实现了计时,但是每当上下拉刷新时,时间就会错乱。后来经过调整,终于实现了所要的效果。下面讲下用到的实现方式,还有另外一种方式类似,只是把hander及时间 处理放到adapter中了,用的Handler+Timer+TimerTask实现的:

2 Handler+Timer+TimerTask

2.1 ShopActivity

public class ShopActivity extends Activity {

private ListView  lv;
private ShopAdapter pmAdapter;
private Timer timer = new Timer();
private TimerTask timerTask;
private List<MyData> dataList;

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if (msg.what == 1) {
            for (int i = 0; i < mMyMatchList.size(); i++) {
            //这是服务器当前时间,以此时间为基数进行倒时计,1000为毫秒
    dataList.get(i).setServerDate(Long.valueOf(dataList.get(i).getServerDate())+ 1000 + "");
            serverTime = Long.valueOf(mMyMatchList.get(i).getServerDate());
            pmAdapter.notifyDataSetChanged();
            }
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_shop);
    //接下来要从服务端取到数据,加入dataList中
    dataList=new ArrayList<MyData>();
    lv= (ListView) this.findViewById(R.id.shop_lv);
    pmAdapter = new ShopAdapter(ShopActivity.this, this);
    lv.setAdapter(pmAdapter);

    timerTask = new TimerTask() {
        @Override
        public void run() {
            Message message = Message.obtain();
            message.what = 1;
            mHandler.sendMessage(message);
        }
    };
    timer.schedule(timerTask, 1000, 1000);
}


@Override
protected void onResume() {
    super.onResume();
}

@Override
protected void onDestroy() {
    if (null != timer) {
        timer.cancel();
    }
    super.onDestroy();
    }
}

2.2 ShopAdapter

最后在适配器类ShopAdapter中,根据服务器返回的商品优惠截止时间和服务器时间,把数据加上去就可以了:

TextView timeTv=findViewById();
timeTv.setText(getTimeFromInt(结束时间-服务器时间));//getTimeFromInt这个方法是计算时间差并转换成所需要格式的:

public String getTimeFromInt(long time) {
    if (time <= 0) {
        return "已结束"; 
    }

    long day = time / (1 * 60 * 60 * 24);
    long hour = time / (1 * 60 * 60) % 24;
    long minute = time / (1 * 60) % 60;
    long second = time / (1) % 60;
    return "还剩:" + day + "天" + hour + "小时" + minute + "分" + second + "秒";
}

或者:
 /** * 设置时间值 * @param millisUntilFinished * @param tvTime */
public void setTime(long millisUntilFinished,TextView tvTime) {
        final int SECONDS = 60;//秒数
        final int MINUTES = 60 * 60;//小时
        long first = 0, twice = 0, third = 0;
        long mtmp = 0, mtmp2 = 0;

        //获取当前时间总秒数
        first = millisUntilFinished / 1000;
        //小于一分钟 只显示秒
        if (first < SECONDS) {
            tvTime.setText("00:00:" + (first < 10 ? "0" + first : first));
        } else if (first < MINUTES) {
            twice = first % 60;
            mtmp = first / 60;
            if (twice == 0) {
                tvTime.setText("00:" + (mtmp < 10 ? "0" + mtmp : mtmp) + ":00");
            } else {
                tvTime.setText("00:" + (mtmp < 10 ? "0" + mtmp : mtmp) + ":" + (twice < 10 ? "0" + twice : twice));
            }
        } else {
            twice = first % 3600;
            mtmp = first / 3600;
            if (twice == 0) {
                tvTime.setText("0" + first / 3600 + ":00:00");
            } else {
                if (twice < SECONDS) {
                    tvTime.setText((mtmp < 10 ? "0" + mtmp : mtmp) + ":00:" + (twice < 10 ? "0" + twice : twice));
                } else {
                    third = twice % 60;
                    mtmp2 = twice / 60;
                    if (third == 0) {
                        tvTime.setText((mtmp < 10 ? "0" + mtmp : mtmp) + ":" + (mtmp2 < 10 ? "0" + mtmp2 : mtmp2) + ":00");
                    } else {
                        tvTime.setText((mtmp < 10 ? "0" + mtmp : mtmp) + ":" + (mtmp2 < 10 ? "0" + mtmp2 : mtmp2) + ":" + third);
                    }
                }
            }
        }
    }

你可能感兴趣的:(android)