Android开发-----02-ListView中给某些条目进行倒计时

本文重点在ListView中使用倒计时

在Android的开发中,我们经常遇见倒计时的操作,通常使用Timer和Handler共同操作来完成。当然也可以使用Android系统控件CountDownTimer,这里简单操作一下这个控件:

new CountDownTimer(30000, 1000) {
     public void onTick(long millisUntilFinished) {
    	 timeTV.setText(": " + millisUntilFinished / 1000);
     }
     public void onFinish() {
    	 timeTV.setText("done!");
     }
 }.start();

这个操作起来比Timer要爽。

当然本文不是要展示这种简单的效果,在项目中遇见这样的问题,在ListView中添加倒计时,有的条目有倒计时的功能,有的条目没有倒计时的功能,这种方式该怎么实现呢?难道在Adapter里面,每个条目都添加如上的代码。如下所示:

public View getView(int position, View convertView, ViewGroup parent) {
	Goods goods = goodss.get(position);
	if(convertView == null){
		convertView = View.inflate(ListViewCountTimeDemo.this, R.layout.item_counttime, null);
		TextView nameTV = (TextView)convertView.findViewById(R.id.nameTV);
		final TextView timeTV = (TextView)convertView.findViewById(R.id.timeTV);
		nameTV.setText(goods.getName());
		timeTV.setText(goods.getTime()+"");
		new CountDownTimer(30000, 1000) {
		     public void onTick(long millisUntilFinished) {
		    	 timeTV.setText(": " + millisUntilFinished / 1000);
		     }
		     public void onFinish() {
		    	 timeTV.setText("done!");
		     }
		 }.start();
	}else{
	}
	return convertView;
}

这种方式肯定有问题,每次获取一个新的条目,都会创建一个计时对象,这样在条目比较多的时候,来来回回上下滑动之后,就会出现计时紊乱。压根儿不是1秒1秒的走动。而且可能创建过多的CountDownTimer对象,导致内存消耗过大。

个人推荐使用下面这种方式:

package com.example.androidtest;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class CountdownActivity extends Activity {
	private ListView lv;
	private ArrayList<Goods> goodss = new ArrayList<Goods>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_countdown);
		lv = (ListView) findViewById(R.id.lv);

		for(int i=0;i<20;i++){
			goodss.add(new Goods(30000+i*1000, "zhangfei"+i));
		}
		adapter = new CountTimeAdapter();
		lv.setAdapter(adapter);
		handler.sendEmptyMessage(1);
	}
	private class CountTimeAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			return goodss.size();
		}

		@Override
		public Object getItem(int position) {
			return goodss.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Goods goods = goodss.get(position);
			if(convertView == null){
				convertView = View.inflate(CountdownActivity.this, R.layout.item_counttime, null);
			}
			TextView nameTV = (TextView)convertView.findViewById(R.id.nameTV);
			final TextView timeTV = (TextView)convertView.findViewById(R.id.timeTV);
			nameTV.setText(goods.getName());
			long seconds = goods.getTime()/1000;
			timeTV.setText(seconds/(60)+"分"+seconds%60+"秒");

			return convertView;
		}

	}
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				boolean isNeedCountTime = false;
				//①:其实在这块需要精确计算当前时间
				for(int index =0;index<goodss.size();index++){
					Goods goods = goodss.get(index);
					long time = goods.getTime();
					if(time>1000){//判断是否还有条目能够倒计时,如果能够倒计时的话,延迟一秒,让它接着倒计时
						isNeedCountTime = true;
						goods.setTime(time-1000);
					}else{
						goods.setTime(0);
					}
				}
				//②:for循环执行的时间
				adapter.notifyDataSetChanged();
				<span style="color:#009900;">if(isNeedCountTime){
					//TODO 然后用1000-(②-①),就赢延迟的时间
					handler.sendEmptyMessageDelayed(1, 1000);
				}
				break;</span>
			}

		}

	};
	private CountTimeAdapter adapter;

}

本文的重点,就是使用Handler延迟操作,来进行倒计时的操作。这样倒计时就完成了,上下滑动就不会出现紊乱的问题。

图片效果:

时间: 2024-08-30 00:12:07

Android开发-----02-ListView中给某些条目进行倒计时的相关文章

[Android学习笔记]ListView中含有Button导致无法响应onItemClick回调的解决办法

转自:http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html 问题描述: 当ListView的Item中的控件只是一些展示类控件时(比如TextView),注册ListView的监听setOnItemClickListener之后,当点击Item时候会触发onItemClick回调. 但是,当Item中存在Button(继承于Button)的控件时,onItemClick回调不会被触发. 解决方案: 在Item的布局文件

Android开发之ListView中Adapter的优化

ListView是Android开发最常用的控件,适配器adapter是将要显示的数据映射到View中并添加到ListView中显示 在实现ListView时,我们需要定义适配器如BaseAdapter.ArrayAdapter.CursorAdapter.SimpleAdapter等,并且重写其一下四个方法: 1 public int getCount(): 2 public Object getItem(int position) 3  public long getItemId(int p

Android开发:ListView、AdapterView、RecyclerView全面解析

目录 AdapterView简介 AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图: 特征: AdapterView继承自ViewGroup,本质是个容器 AdapterView可以包含多个"列表项",并将这多个列表项以合适的形式展示 AdapterView显示的列表项内容由Adapter提供 它派生的子类在用法上也基本相似,只是在显示上有一定区别,因此把他们也归为一类. 由AdapterView直接派生的三个类: AbsListView.AbsS

Android入门 在ListView中如何进行精确的定位

在android的开发中,经常会遇到需要主动去设定某条ListItem的位置的需求.设置位置的函数有 ListView.setSelection(int position) ListView.setSelectionFromTop(int position, int y); 其中 position指的是指定的item的在ListView中的索引,注意如果有Header存在的情况下,索引是从Header就开始算的. y指的是到ListView可见范围内最上边边缘的距离. 函数有了,现在就是根据自身

.Net程序员玩转Android开发---(12)ListView显示数据

Android中显示数据有多种控件,这节我们来认识下ListView,ListView是Android中最常用的数据显示控件,可以显示简单数据源,也可以显示复杂数据源,我们在Android系统中常看到的列表项,基本都是ListView的功劳.ListView中显示数据,肯定要绑定数据源.数据源的绑定是通过Adapter来完成的,Android中有两种常用的适配器,ArrayAdapter(数组适配器)  SimpleAdapter(简单适配器),适配器的作用就是把复杂的数据源显示到istview

Android开发——VirtualBox环境中的虚拟机使用

题目想了半天,还是那么纠结,解释下吧.最近开始接触Android开发,开发环境的部署就不说了,各种费劲凿墙.好不容易搞定了,调试又来了问题.Android设备老旧,效率低下:AVD就是更不用说了,一张张图片看过去.好在有神器,Genymotion! 在此强力推荐~!性能甩各种android设备好几条街. 可是问题来了,本人有个癖好,喜欢将各种开发环境分别放到不同的虚拟机里,这样互相不会干扰,而且可以带来带去.但是Genymotion在虚拟机里用不了~,提示需要OpenGL2.0版本以上的支持.可

Android 如何在 ListView 中更新 ProgressBar 进度

=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演小品(假设演员都长一样,每个角色任何演员都可以演) 小品剧也不会为每个角色都招募一个演员.ListView 不会为每一个 Item 创建 View 对象. 小品剧的演员在一个角色表演完成后,会在后台换下一个角色的服装,等待需要表演的时候再出场. ListView 会让未显示的 View 填充数据后缓

.Net程序员玩转Android开发---(16)ListView分页事件

ListView在加载是数据的时候,如果一次性把所有数据都加载出来,这样如果数据量大的话,效率低,性能差,通常情况下采取的措施是分页加载,只加载当前页数量的数据.这一节我们演示下ListView怎么分页加载数据.首先看下效果图 1. 创建加载进度栏 ListVIew每次加载的时候,会在底部有一个加载进度条栏,显示加载中,我们创建一个这样的布局文件,代码如下 <?xml version="1.0" encoding="utf-8"?> <Linear

.Net程序员玩转Android开发---(13)ListView单击事件

大家都知道ListView用来显示数据列表,每一个列表都有列表项组成,如果我们单击选中一个列表,想获取列表中的详细信息或者打开一个新窗口把列表信息传递过去怎么办那?这一节我们演示一下ListView的单击事件,通过这节我们会对ListVIEW有更深入的理解,先看下效果图 下面看下演示代码 主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht