ListView and items with countdown timer

android, countdowntimer, listview, multiplication

Solution

I solved this differently in my case. Instead of having a timer handler set inside your `getView()`, I just set the time difference between the current time and your desired time to the `TextView` every time `getView()` is called. So move this code of yours back inside `getView()`:

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);

Then create a handler in the activity to call `notifyDatasetChanged()` every one minute on the listview's adapter:

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        myAdapter.notifyDataSetChanged();
        timerHandler.postDelayed(this, 60000); //run every minute
    }
};

I stop this handler on `onPause()`:

@Override
protected void onPause() {
    timerHandler.removeCallbacks(timerRunnable);
    super.onPause();
}

And I start it again on `onResume()`:

@Override
protected void onResume() {
    timerHandler.postDelayed(timerRunnable, 500);
    super.onResume();
}

And that's it. :)

Hope it helps.

Problem

i have a issue with my Listview, i want to set a countdown timer to all ListView's items, and i allready have googled a solution for this, but it isn't work correctly. The Problem is that ListView reuses(recycling) a views, and i always get a wrong item time. I use a tag for my view, but it still not work, i can't understand where i made a mistake, please help me. thx. So here a pictures that shows my problem: pic1 Where i've just started an Activity; pic2 Where i've just scrolled down and up And here my code(whole class): UPDATED ``` 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); } ``` }

Original source