android – 带有Coundown计时器的ListView.滚动列表视图时,计时器闪烁

在我的应用程序中,我必须显示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?

创建倒计时器实例和取消它时必须小心.如果您不取消计时器,它将更新错误的视图.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...