Android进阶之ListView实现多条数据同时倒计时功能
2016-03-31 11:34
441 查看
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); } } } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories