ListView y elementos con temporizador de cuenta atrás

Tengo un problema con mi vista de lista, quiero establecer un temporizador de cuenta regresiva para todos los elementos de ListView, y ya he buscado en Google una solución para esto, pero no funciona correctamente. El problema es que ListView reutiliza (recicla) las vistas, y siempre obtengo un tiempo de artículo incorrecto. Utilizo una etiqueta para mi vista, pero aún no funciona, no puedo entender dónde cometí un error, ayúdeme, por favor. Gracias.

Así que aquí hay una imagen que muestra mi problema: pic1 donde acabo de comenzar una actividad;

pic2 donde acabo de desplazarme hacia arriba y abajo

Y aquí mi código (toda la clase):

ACTUALIZADO
    public class PromoListActivity extends SherlockActivity {
private ListView mPromoList;
private PromoListAdapter mAdapter;
private ViewFlipper mFlipper;
private Button mBtnRepeat;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_news_list);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    setTitle("Сохранённые акции");
    mFlipper = (ViewFlipper) findViewById(R.id.flipper);
    mPromoList = (ListView) findViewById(R.id.newsList);
    mBtnRepeat = (Button) findViewById(R.id.btnRepeat);

    //-->
    final Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            mAdapter.notifyDataSetChanged();
            timerHandler.postDelayed(this, 1000); // run every minute
        }
    };
    //<--


    mBtnRepeat.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            mFlipper.setDisplayedChild(0);
            getDummyData();
        }
    });
    mPromoList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            startActivity(new Intent(PromoListActivity.this, PromoActivityDetails.class));

        }
    });
    getDummyData();
}

private class PromoListAdapter extends BaseAdapter {
    private ArrayList<PromoAction> mItems = new ArrayList<PromoAction>();
    private LayoutInflater layoutInflater;

    private PromoListAdapter(Context context, ArrayList<PromoAction> mItems) {
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.mItems = mItems;
    }

    public int getCount() {
        return mItems.size();
    }

    public PromoAction getItem(int position) {
        return mItems.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewItem viewItem;
        PromoAction promoAction = getItem(position);
        if (convertView == null) {
            viewItem = new ViewItem();
            convertView = layoutInflater.inflate(R.layout.listviewitem_action, null);
            viewItem.name = (TextView) convertView.findViewById(R.id.promoAction_name);
            viewItem.desc = (TextView) convertView.findViewById(R.id.promoAction_desc);
            viewItem.timer = (TextView) convertView.findViewById(R.id.promoAction_timer);
            viewItem.timer.setTag(position);
            convertView.setTag(viewItem);
        } else {
            viewItem = (ViewItem) convertView.getTag();
        }
        setTime(promoAction,viewItem.timer,viewItem.timer.getTag().toString());
        viewItem.name.setText(promoAction.name);
        viewItem.desc.setText(promoAction.descr);
        return convertView;
    }

    private void setTime(final PromoAction promoAction, final TextView tv, final String tag) {
        if (tv.getTag().toString().equals(tag)) {
            long outputTime = Math.abs(promoAction.timer_end
                    - System.currentTimeMillis());
            Date date = new java.util.Date(outputTime);
            String result = new SimpleDateFormat("hh:mm:ss").format(date);
            tv.setText(result);
        }
    }

    public class ViewItem {
        TextView name;
        TextView desc;
        TextView timer;
    }
}

private void getDummyData() {
    ArrayList<PromoAction> list = new ArrayList<PromoAction>();
    for (int i = 1; i < 10; i++) {
        PromoAction action = new PromoAction();
        action.name = "Lorem ipsum dolor sit amet";
        action.descr = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ";
        switch (i) {
        case 1: {
            action.timer_start = 1385971000;
            action.timer_end = 1386104000;
        }
        case 2: {
            action.timer_start = 1385889000;
            action.timer_end = 1385812550;
            break;
        }
        case 3: {
            action.timer_start = 1385884200;
            action.timer_end = 1385912100;
            break;
        }
        default: {
            action.timer_start = 1385856000;
            action.timer_end = 1385892000;
            break;
        }
        }
        list.add(action);

    }
    mAdapter = new PromoListAdapter(PromoListActivity.this, list);
    mPromoList.setAdapter(mAdapter);
    mFlipper.setDisplayedChild(1);
}

}

Respuestas a la pregunta(2)

Su respuesta a la pregunta