2013-07-31 5 views
1

Я создал список с таймером обратного отсчета, результат показывает хороший результат в первый раз, но при прокрутке списка он перетасовывается, и результат становится неправильным.Проблема с CountDownTimer Listview Android

Класс адаптера:

public class EventsListAdapter extends BaseAdapter { 

    LayoutInflater inflater; 
    Activity context; 

    List<MyEvents> list; 

    long startTime = 0L; 
    long countUp; 
    String hrs = "00"; 
    String mins = "00"; 
    String secs = "00"; 
    private MyCustomTimer myTimer; 
    public EventsListAdapter(Activity context, List<MyEvents> list) { 
     this.context = context; 
     inflater = context.getLayoutInflater(); 
     this.list = list; 
    } 

    public void setActivityList(List<MyEvents> LoadList) { 
     list = LoadList; 
    } 

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

    public Object getItem(int position) { 
     return list.get(position); 
    } 

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

    static class ViewHolder { 
     TextView name; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     MyEvents eventsData = list.get(position); 

     View rowView = convertView; 
     ViewHolder viewHolder; 
     if (rowView == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.likes_inflate, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.name = (TextView) rowView.findViewById(R.id.lblName); 
      if (eventsData.isStarted()){ 
       myTimer = new MyCustomTimer(viewHolder.name); 
       myTimer.setTimer(eventsData.start_date); 
      } 
      rowView.setTag(viewHolder); 
     }else{ 
      viewHolder = (ViewHolder) rowView.getTag(); 
     } 

     return rowView; 
    } 
} 

CountDownTimer класс:

class MyCustomTimer{ 
     TextView tv; 
     public MyCustomTimer(TextView tv) { 
      this.tv = tv; 
     } 

     void setTimer(final long time) { 
      new CountDownTimer(time, 1000) { 
       public void onTick(long millisUntilFinished) { 
        //Set formatted date to your TextView     
        tv.setText(Utilities.getDurationBreakdown(millisUntilFinished)); 

       } 
       public void onFinish() { 
        tv.setText("Done!"); 
       } 
      }.start(); 
     } 
    } 

ли так с ничего делать дополнительно этим кодом? Пожалуйста, предложите.

ответ

0

Когда вы просматриваете представление списка, вызывается getView(). Так что счетчик начинается снова. Ведите счетчик в переменной, например, в хэш-карте. проверьте эту переменную в getView(), а затем установите значение счетчика в соответствии с ним.

+0

Я проверил счетчик уже запущен или нет, если он начал, я не вызываю таймер. Я редактировал код. Все та же проблема. – fargath

+2

Если вы обнаружите, что счетчик запущен, установите счетчик снова на время, когда оно осталось. То есть, возьмите переменную и назначьте ей счетчик времени. Если счетчик равен 10, переменная должна быть 10. Поэтому в getView() назначить счетчик этой переменной. надеюсь, что вы получите это. –

+0

Я получил решение, я назначил переменную, чтобы установить счетчик, и сделать адаптер notifydatasetchanged() для каждого тика по таймеру. теперь он отлично работает. – fargath