3

Je travaille sur une application Android qui utilise un ListView, dans lequel chaque ligne est composée d'une vue de texte et une barre de progression. Les choses fonctionnent bien, sauf si l'utilisateur doit faire défiler une longue liste. ProgressBars commence à prendre la progression des autres ProgressBars qui ne sont pas visibles à l'écran. Je comprends que c'est un problème commun qui découle de l'implémentation de GetView, mais je me demande quelle est la meilleure action à prendre avec ProgressBars.Faire défiler ListView de ProgressBars

GetView:

public View getView(int position, View convertView, ViewGroup parent){ 

     View row = convertView; 
     ViewWrapper wrapper; 
     ProgressBar myProgressBar; 
     int initProgress = myData.get(position).getProgress(); 

     if (row == null){ 
      LayoutInflater inflater = context.getLayoutInflater(); 
      row = inflater.inflate(R.layout.row, null); 

      wrapper = new ViewWrapper(row); 
      row.setTag(wrapper);  
     } 

     else{ 
      wrapper = (ViewWrapper)row.getTag(); 

     } 

     RowModel model = getModel(position);   
     wrapper.getPid().setText(model.toString()); 
     myProgressBar = wrapper.getProgressBar(); 
     myProgressBar.setProgress(initProgress); 
     myProgressBar.setMax(100); 

     myProgressBar.setTag(new Integer(position)); 

     return row; 
    } 

ViewWrapper:

public class ViewWrapper { 
    View base; 
    TextView pid = null; 
    ProgressBar pb= null; 

    ViewWrapper(View base){ 
     this.base = base; 
    } 

    TextView getPid(){ 
     if(pid == null){ 
      pid = (TextView)base.findViewById(R.id.pid); 
     } 

     return(pid); 
    } 

    ProgressBar getProgressBar(){ 
     if(pb== null){ 
      pb= (ProgressBar)base.findViewById(R.id.progressbar); 
     } 

     return(pb); 
    } 
} 

Il semble que le problème est lié à:

myProgressBar = wrapper.getProgressBar(); 

parce que ProgressBar commence à obtenir le comportement d'un ProgressBar recyclé. Cependant, je veux qu'il ait son propre comportement.

Quelle est la meilleure façon de remédier à cela? Merci.

Répondre

0

Vous devrez peut-être gonfler la mise en page à chaque fois et ne pas réutiliser convertView transmis. Cela ne devrait pas poser de problème sauf si vous avez BEAUCOUP de lignes.

0

J'ai dû mettre en œuvre une fonctionnalité similaire, voici ce que j'ai fait. Je mis en œuvre les dehors getview

  • OnTouchListener - écouter seekBar événements tactiles
  • OnKeyListener - écouter dpad et trakball événement pour la barre de recherche

Je mets ces auditeurs pour les seekbars de getView

Chaque fois que les écouteurs ont été appelés, je trouverais le parent de seekbars, puis le du parent à la vue de texte.

J'ai maintenant la textview que je dois mettre à jour, et la barre de recherche. Tout ce que je devais faire était de définir le texte à partir du tableau.

Voici un code pour vous aider.

privé OnTouchListener touchListener = new OnTouchListener() {

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
      View parent = (View) v.getParent(); 
      TextView textView = (TextView) parent 
        .findViewById(R.id.id_grade_tooltip); 
      if (textView == null) { 
      } else { 
       SeekBar seekBar = (SeekBar) v; 
       textView.setText(String.valueOf(seekBar.getProgress()) 
         + "%"); 
      } 
      return false; 
    } 
}; 
Questions connexes