在我的应用程序中,我必须显示listview中每个项目的倒数计时器.我已经能够使用CountDownTimer来做到这一点.但是,问题是当向上或向下滚动列表视图时,计时器开始闪烁.搜索了很多,但无法得到解决方案.
我的适配器类
public class BuyListinglistadapter extends BaseAdapter {
private Context mContext;
private ArrayList<VehicleAttributes> mVehicleList = new ArrayList<VehicleAttributes>();
private Date currentDate;
//Saving position in map to check if timer has been //started for this row
private HashMap<Integer,Boolean> timerMap = new HashMap<Integer,Boolean>();
public BuyListinglistadapter(Context context,ArrayList<VehicleAttributes> vehicleList,boolean showGridView) {
this.mContext = context;
this.mVehicleList = vehicleList;
this.showGridView = showGridView;
currentDate = new Date(System.currentTimeMillis());
int listSize = mVehicleList.size();
for (int i = 0; i < listSize; i++)
timerMap.put(i,false);
}
@Override
public int getCount() {
return mVehicleList.size();
}
@Override
public Object getItem(int position) {
return mVehicleList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position,View convertView,ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.row_buy_listing_grid,parent,false);
holder = new ViewHolder();
holder.timer_layout = (LinearLayout) convertView
.findViewById(R.id.timer_layout);
holder.txt_remaining_days = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_days);
holder.txt_remaining_hours = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_hours);
holder.txt_remaining_mins = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_mins);
holder.txt_remaining_secs = (RobotoCondensedBoldTextView) convertView
.findViewById(R.id.txt_remaining_secs);
holder.listing_status = (ImageView) convertView
.findViewById(R.id.listing_status);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
final VehicleAttributes vehicleAttributes = mVehicleList.get(position);
AuctionModel mAuctionModel = vehicleAttributes.getAuctionDetailModel();
if (mAuctionModel != null) {
holder.img_auction.setVisibility(View.VISIBLE);
Date auctionStartDate = Util
.getDateFromString(mAuctionModel.getStarted_at(),"yyyy-MM-dd hh:mm:ss","GMT");
Date auctionEndDate = Util.getDateFromString(
mAuctionModel.getEnded_at(),"GMT");
long diff = currentDate.getTime() - auctionEndDate.getTime();
if (diff < 0)
diff = -diff;
else
diff = 0;
if (timerMap.get(position) == null || !timerMap.get(position)) {
timerMap.put(position,true);
MyCountDown countDown = new MyCountDown(position,diff,1000,holder.txt_remaining_days,holder.txt_remaining_hours,holder.txt_remaining_mins,holder.txt_remaining_secs);
countDown.start();
}
}
return convertView;
}
private class MyCountDown extends CountDownTimer {
RobotoCondensedBoldTextView txt_remaining_days;
RobotoCondensedBoldTextView txt_remaining_hours;
RobotoCondensedBoldTextView txt_remaining_mins;
RobotoCondensedBoldTextView txt_remaining_secs;
int position;
public MyCountDown(int position,long millisInFuture,long countDownInterval,RobotoCondensedBoldTextView txt_remaining_days,RobotoCondensedBoldTextView txt_remaining_hours,RobotoCondensedBoldTextView txt_remaining_mins,RobotoCondensedBoldTextView txt_remaining_secs) {
super(millisInFuture,countDownInterval);
this.position = position;
this.txt_remaining_days = txt_remaining_days;
this.txt_remaining_hours = txt_remaining_hours;
this.txt_remaining_mins = txt_remaining_mins;
this.txt_remaining_secs = txt_remaining_secs;
}
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
updateTimerLabel(position,millisUntilFinished,txt_remaining_days,txt_remaining_hours,txt_remaining_mins,txt_remaining_secs);
}
}
private void updateTimerLabel(int position,long millis,RobotoCondensedBoldTextView txt_remaining_secs) {
String days = String.format("%02d",TimeUnit.MILLISECONDS.toDays(millis));
String hours = String.format(
"%02d",TimeUnit.MILLISECONDS.toHours(millis)
- TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS
.toDays(millis)));
String mins = String.format(
"%02d",TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS
.toHours(millis)));
String secs = String.format(
"%02d",TimeUnit.MILLISECONDS.toSeconds(millis)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS
.toMinutes(millis)));
txt_remaining_days.setText(days);
txt_remaining_hours.setText(hours);
txt_remaining_mins.setText(mins);
txt_remaining_secs.setText(secs);
}
static class ViewHolder {
NetworkImageView mVehicleImage;
RobotoCondensedBoldTextView txt_remaining_days,txt_remaining_secs;
LinearLayout timer_layout;
}
}
解决方法
UPDATE
我在这里更新了我的答案看看:(它使用带有recyclerview的cardview,但同样的原则也适用于listview)
How to change text based on time and date?
创建倒计时器实例和取消它时必须小心.如果您不取消计时器,它将更新错误的视图.