在我的应用程序中,我必须显示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?
创建倒计时器实例和取消它时必须小心.如果您不取消计时器,它将更新错误的视图.