2017-01-02 2 views
0

J'essaie de mettre à jour un textView avec minuteur à partir de 00:00:00 chaque seconde en utilisant Handler. Je travaille également avec un adaptateur personnalisé. Chaque rangée dispose donc d'un bouton textView, start et stop timer. J'ai essayé de mettre à jour le timerTextView dans la même rangée mais j'ai fini par mettre à jour le textView dans la dernière rangée dans le listView.Quelqu'un peut-il me dire comment mettre à jour un textView (Timer TextView qui met à jour chaque seconde en utilisant Handler) dans la même ligne en utilisant Custom Adapter

public class ItemAdapter extends ArrayAdapter<Items> 
{ 


TextView labelTimer; 
int passedSeconds = 0; 
Boolean isActivityRunning = false; 
Timer timer; 
TimerTask timerTask; 
Context myContext; 
int myLayoutResourceID; 
Items[] myData = null; 
ItemHolder holder = null; 
Integer pos; 



public ItemAdapter(Context myContext, int myLayoutResourceID, Items[]  myData) { 
super(myContext,myLayoutResourceID,myData); 
this.myContext = myContext; 
this.myData = myData; 
this.myLayoutResourceID = myLayoutResourceID; 
} 

@Override 
public Items getItem(int position) 
{ 
return super.getItem(position); 
} 




@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
View row = convertView; 
//ItemHolder holder = null; 


if(row == null) { 
    LayoutInflater inflater = LayoutInflater.from(myContext); 
    row = inflater.inflate(myLayoutResourceID, parent, false); 


    holder = new ItemHolder(); 


    holder.nameView = (TextView) row.findViewById(R.id.nameTextView); 
    holder.timerView = (TextView) row.findViewById(R.id.timerTextView); 
    holder.imageView = (ImageView) row.findViewById(R.id.imageView); 
    holder.startButton = (Button) row.findViewById(R.id.startButton); 
    holder.stopButton = (Button) row.findViewById(R.id.stopButton); 


    row.setTag(holder); 
} 

else 
{ 
    holder = (ItemHolder) row.getTag(); 
} 

Items item = myData[position]; 


holder.timerView.setText(item.timer); 

final Button srBtn = holder.startButton; 
srBtn.setText("START"); 

//Setup and reuse the same listener each row 

Integer rowPosition = position; 
pos = position; 


holder.startButton.setTag(rowPosition); 
holder.timerView.setTag(rowPosition); 

final TextView timeV = holder.timerView; 
labelTimer = timeV; 
labelTimer.setTag(pos); 


Log.v("Get tag while creating"+labelTimer.getTag()+" ",""); 



//Setting the view to reflect the data we need to display 
holder.nameView.setText(item.itemName); 



int resid = myContext.getResources().getIdentifier(item.itemImage,"drawable",myContext.getPackageName()); 
holder.imageView.setImageResource(resid); 

holder.startButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (isActivityRunning) { 
      //pause running activity 
      timer.cancel(); 
      srBtn.setText("START"); 
      isActivityRunning = false; 
     } else { 
      reScheduleTimer(); 
      srBtn.setText("PAUSE"); 
      isActivityRunning = true; 
     } 

    } 
}); 



holder.stopButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     timer.cancel(); 
     passedSeconds = 0; 
     timeV.setText("00 : 00 : 00"); 
     srBtn.setText("START"); 
     isActivityRunning = false; 
    } 
}); 
return row; 
} 




public void reScheduleTimer(){ 

timer = new Timer(); 
timerTask = new myTimerTask(); 
timer.schedule(timerTask, 0, 1000); 
} 


private class myTimerTask extends TimerTask { 
@Override 
public void run() { 
    // TODO Auto-generated method stub 
    passedSeconds++; 
    updateLabel.sendEmptyMessage(0); 
}  
} 


private Handler updateLabel = new Handler(){ 
@Override 
public void handleMessage(Message msg) { 
    // TODO Auto-generated method stub 
    //super.handleMessage(msg); 
    int seconds = passedSeconds % 60; 
    int minutes = (passedSeconds/60) % 60; 
    int hours = (passedSeconds/3600); 

    Log.v("Get tag while updating = "+labelTimer.getTag()+" ",""); 
    labelTimer.setText(String.format("%02d : %02d : %02d", hours, minutes, seconds)); 
} 
}; 

private static class ItemHolder { 
TextView nameView; 
TextView timerView; 
ImageView imageView; 
Button startButton; 
Button stopButton; 
} 

} 

Quelqu'un peut-il m'expliquer comment implémenter cela. Les réponses qui sont données ci-dessous ne me fournissent pas de solution.

Le lien pour application similaire est: https://play.google.com/store/apps/details?id=com.aloggers.atimeloggerapp&hl=en

Répondre

1

Je vois au moins quelques façons. dépend de vos porouses. 1) Créer un contrôleur qui devrait pouvoir accéder à chaque vue créée dans l'adaptateur. titulaire (dans la vue TAG devrait avoir assez d'informations pour trouver l'objet de codel pour la vue particulière). Il accueillera également un TimerTask. Le rappel de la tâche de rimer devrait faire pour chaque vue mettant à jour le cercle. 2) cette méthode utilise l'API listView standard avec l'ensemble de données de notification modifié.

+0

Pourriez-vous s'il vous plaît me donner un code à votre explication –

+0

désolé, je n'ai pas le temps d'écrire l'application exemple. –

0

J'ai fait la même chose en gonflant des rangées dans la disposition principale, parce que cela ne fonctionne pas bien avec l'adaptateur.

Après avoir lié toutes les vues, j'ai utilisé le gestionnaire.

final Handler handler = new Handler(); 

private void getList() { 
    // arr_savedeal is my ArrayList 
    if (arr_savedeal != null) { 
     lnr_saved_deal.removeAllViews(); 

     for (int i = 0; i < 5; i++) { 
      // here i am inflating my rows in main layout using linear inflator, same like you did in getView() method of adapter 
      rowSavedDeal(arr_savedeal.get(i), i); 
     } 

     if (arr_savedeal.size() > 0) { 
      handler.postDelayed(updateTimerThread, 1000); // where 1000 is 1000ms , means its 1s. 
     } 
    } 
} 

private Runnable updateTimerThread = new Runnable() { 
    @Override 
    public void run() { 
     //Do something after 1 second, I am refreshing view here. 
     getList(); 
    } 
}; 

Essayez ce code. J'espère que ceci vous aidera.

+0

De cette façon, vous n'aurez aucune vue de liste - cela fonctionnera avec peu de vues. si vous avez plus de 2-3 écrans verticaux, votre approche – TAC