2012-09-01 1 views
1

Je travaille sur l'application Download Manager, et ma structure est la suivante:ListView et ReferenceHolder

je deux package première est toute l'activité et de premier plan sur les services publics. (Activités, ListAdapters et etc) Et le second est le paquet comprend toutes les classes actives de fond. (Les fils de téléchargement incluent FTP, HTTP, HTTPS et etc.).

Aussi, pour garder les détails des fichiers de téléchargement, je définis la classe comme ci-dessous:

public class DownloadInfo { 
    public DownloadInfo(String url, int connection, int progress, boolean status) { 
     this.M_url = url; 
     this.M_connection = connection; 
     this.M_progress = progress; 
     this.B_status = status; 
    } 

    String M_url; 
    int M_connection; 
    int M_progress; 
    boolean B_status; 
} 

Et aussi le ArrayList<DownloadInfo> qui continue téléchargé/téléchargement des listes de fichiers. Pour initialiser le ListView, je l'ai déclaré la classe qui hérite de ArrayAdapter<DownloadInfo> comme suit:

public class FillDownloadList extends ArrayAdapter<DownloadInfo> { 
    private ArrayList<DownloadInfo> M_dlList; 
    private Context M_context; 
    private DownloadViewHolder holder; 

    public FillDownloadList(Context context, ArrayList<DownloadInfo> dlList) { 
     super(context, R.layout.download_item, dlList); 
     this.M_dlList = dlList; 
     this.M_context = context; 
    } 

    public View getView(final int position, View convertView, 
      android.view.ViewGroup parent) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.download_item, parent, 
        false); 

      holder = new DownloadViewHolder(); 

      holder.activityButton = ((Button) convertView 
        .findViewById(R.id.dl_button)); 

      holder.linkText = ((TextView) convertView 
        .findViewById(R.id.link_textview)); 
      holder.speedText = ((TextView) convertView 
        .findViewById(R.id.speed_textview)); 
      holder.percentBar = ((ProgressBar) convertView 
        .findViewById(R.id.dl_progressbar)); 

      convertView.setTag(holder); 
     } else { 
      holder = (DownloadViewHolder) convertView.getTag(); 
     } 

     holder.linkText.setText(this.M_dlList.get(position).M_name); 
     holder.percentBar.setProgress(this.M_dlList.get(position).M_progress); 

    // Doing some initializing and setting the download thread based on DownloadInfo `B_status` parameter. 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e("log", M_dlList.get(position).M_url); 
       Log.e("log", System.out.println(holder.linkText.getText()); 
      } 
     }); 

     return convertView; 
    } 

    private static class DownloadViewHolder { 
     TextView linkText; 
     TextView speedText; 
     Button activityButton; 
     ProgressBar percentBar; 
    } 
} 

Pour augmenter les performances de l'adaptateur, je déclare les cours DownloadViewHolder à maintenir la référence (pour éviter de gonfler inutilement). Lorsque j'ai cliqué sur les éléments de ListView, la sortie LogCat n'est pas compréhensible pour moi: - /! Parce que le second Log.e imprime toujours le dernier élément ajouté à listView. Qu'est-ce qui ne va pas?

Quelqu'un pourrait-il me guider pour résoudre?

Merci à l'avance :)

Répondre

1

Il y a un problème avec votre code, Lorsque vous cliquez sur happends, cliquez sur écoute décrochez support, mais il est titulaire de la dernière vue élément de la liste, pour l'empêcher, vous devez créer titulaire dans getView() et passez-le à onClickListener via le constructeur.

+0

Parfait! Merci :) –