Android 秒杀倒计时 解决listview上下滑动计时改变问题

主activity   就是一个listview  不多说了
package com.example.daotimer;


import java.util.ArrayList;
import java.util.List;


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;


public class MainActivity extends Activity {
ListView listView;
List<Info> infos = new ArrayList<Info>();
SpecialGoodsAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
listView = (ListView) findViewById(R.id.mylist);
for (int i = 0; i < 10; i++) {
Info info = new Info();
info.Goods_Name = "绿豆";
info.Goods_Price = "111";
info.Goods_SpecialPrice = "22";
infos.add(info);
}


adapter = new SpecialGoodsAdapter(this, infos);


listView.setAdapter(adapter);


}


class Info {
String Goods_Price, Goods_SpecialPrice, Goods_Name;
long[] SpecialFrom = { 4, 10, 20, 10 }, SpecialEnd;


}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}
自定义的计时控件  可以自由更改颜色

package com.example.daotimer;


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.text.Html;
import android.util.AttributeSet;
import android.widget.TextView;


/**
 * 自定义倒计时文本控件
 * 
 * @author Administrator
 * 
 */
public class TimeTextView extends TextView implements Runnable {


Paint mPaint; // 画笔,包含了画几何图形、文本等的样式和颜色信息


private long[] times;


private long mday, mhour, mmin, msecond;// 天,小时,分钟,秒


private boolean run = false; // 是否启动了


public TimeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.TimeTextView);


array.recycle(); // 一定要调用,否则这次的设定会对下次的使用造成影响
}


public TimeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mPaint = new Paint();
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.TimeTextView);


array.recycle(); // 一定要调用,否则这次的设定会对下次的使用造成影响
}


public TimeTextView(Context context) {
super(context);
}


public long[] getTimes() {
return times;
}


public void setTimes(long[] times) {
this.times = times;
mday = times[0];
mhour = times[1];
mmin = times[2];
msecond = times[3];


}


/**
* 倒计时计算
*/
private void ComputeTime() {
msecond--;
if (msecond < 0) {
mmin--;
msecond = 59;
if (mmin < 0) {
mmin = 59;
mhour--;
if (mhour < 0) {
// 倒计时结束
mhour = 59;
mday--;


}
}


}


}


public boolean isRun() {
return run;
}


public void setRun(boolean run) {
this.run = run;
}


@Override
public void run() {
// 标示已经启动
// 标示已经启动
run = true;


ComputeTime();

//更改颜色
String strTime = "还剩" + "<font color=\"#FF0033\">" + mday + "</font>"
+ "天" + "<font color=\"#FF0033\">" + mhour + "</font>" + "小时"
+ "<font color=\"#FF0033\">" + mmin + "</font>" + "分钟"
+ "<font color=\"#FF0033\">" + msecond + "</font>" + "秒";


this.setText(Html.fromHtml(strTime));


postDelayed(this, 1000);


}
}
自定义adapter  
package com.example.daotimer;


import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import com.example.daotimer.MainActivity.Info;


import android.content.Context;
import android.graphics.Paint;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


public class SpecialGoodsAdapter extends BaseAdapter {
Boolean flag = true;
private Context context;
private List<Info> list = new ArrayList<MainActivity.Info>();


public SpecialGoodsAdapter(Context context, List<Info> list) {

this.context = context;
this.list = list;
}


@Override
public int getCount() {
// TODO Auto-generated method stub
System.out.println(list.size());
return list.size();
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}


@Override
public View getView(int arg0, View convertView, ViewGroup arg2) {
// 开始计时,性能测试用nanoTime会更精确,因为它是纳秒级的
// long startTime = System.nanoTime();
Log.d("position", "getView " + arg0 + " " + convertView);
Info info = list.get(arg0);
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.activity_main, null);
viewHolder = new ViewHolder();
viewHolder.goodName = (TextView) convertView
.findViewById(R.id.temai_Name);
viewHolder.price = (TextView) convertView
.findViewById(R.id.temai_yuanjia_text);


viewHolder.specialPrice = (TextView) convertView
.findViewById(R.id.temai_xiajia_text);
// 特卖倒计时控件
viewHolder.mTimeText = (TimeTextView) convertView
.findViewById(R.id.temai_timeTextView);


viewHolder.showDate = (TextView) convertView
.findViewById(R.id.index_temai_day);
viewHolder.showDate_l = (LinearLayout) convertView
.findViewById(R.id.temai_weikaishi);
viewHolder.showTime = (LinearLayout) convertView
.findViewById(R.id.temai_yikaishi);
viewHolder.koukou = (TextView) convertView
.findViewById(R.id.temai_zhekou_text);
viewHolder.image = (ImageView) convertView
.findViewById(R.id.index_temai_image);
Log.d("GoogleIO", "new position:" + viewHolder.goodName.getText());
if (flag) {
// 特卖倒计时开始
viewHolder.mTimeText.setTimes(info.SpecialFrom);
// 已经在倒计时的时候不再开启计时
if (!viewHolder.mTimeText.isRun()) {
viewHolder.mTimeText.run();
}
viewHolder.showDate_l.setVisibility(View.GONE);
viewHolder.showTime.setVisibility(View.VISIBLE);
flag = false;
} else {
viewHolder.showTime.setVisibility(View.GONE);
viewHolder.showDate_l.setVisibility(View.VISIBLE);
viewHolder.showDate.setText(60 + "");
flag = true;
}
convertView.setTag(viewHolder);
viewHolder.mTimeText.setTag(info);
} else {
viewHolder = (ViewHolder) convertView.getTag();
// 让listview上下滑动不更改ITEM的状态
viewHolder.mTimeText.setTag(info);
}


// // setData
String off = getOff(info.Goods_Price, info.Goods_SpecialPrice);
viewHolder.goodName.setText(info.Goods_Name);
viewHolder.price.setText(info.Goods_Price);
viewHolder.price.getPaint().setFlags(
Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
viewHolder.specialPrice.setText(list.get(arg0).Goods_SpecialPrice);
viewHolder.koukou.setText(off + "折");


// // 停止计时
// long endTime = System.nanoTime();
// // 耗时
// long spendTime = (endTime - startTime);
//
// sumTime += spendTime;
// Log.d("GoogleIO",
// "position at:" + arg0 + "--sumTime:" + String.valueOf(sumTime));
return convertView;
}


public String getOff(String price, String specialPrice) {


double off = Double.parseDouble(specialPrice)
/ Double.parseDouble(price) * 10;


DecimalFormat df = new DecimalFormat("0.0");
String off_String = df.format(off);


if (off_String.equals("NaN") || off_String.equals("1")) {
off_String = "10";
}
return off_String;
}


static class ViewHolder {
ImageView image;
TextView goodName;
TextView price;
TextView specialPrice;
TextView koukou;
TimeTextView mTimeText;
TextView showDate;
LinearLayout showDate_l;
LinearLayout showTime;


}


protected void resetViewHolder(ViewHolder viewHolder) {
viewHolder.image.setImageBitmap(null);
viewHolder.goodName.setText("");
viewHolder.price.setText("");
viewHolder.specialPrice.setText("");
viewHolder.koukou.setText("");
viewHolder.mTimeText.setText("");
viewHolder.showDate.setText("");


}


static class DateTool {
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy年MM月dd日    HH:mm:ss     ");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = formatter.format(curDate);


public Boolean Istart(String arg0) {
if (str.equals(arg0)) {
return true;
}
return false;


}


public Boolean Isend(String arg0) {
if (str.equals(arg0)) {
return true;
}
return false;


}


}
}

可以到这下载demo

http://download.csdn.net/detail/q646031500/9199767


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值