Frage

Ich habe einen angepassten Basisadapter für meine ListView mit diesem Code:

public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) 
  { 
  } 
  else 
  {
   holder = (ViewHolder) convertView.getTag();
  }
  convertView = mInflater.inflate(R.layout.user_submissions_customisation, null);
   holder = new ViewHolder();
   holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName);
   holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle);
   holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate);
   holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage);
   holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage);
   holder.statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage);
   convertView.setTag(holder);

  ImageView statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage);
  ImageView statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage);
  ImageView statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage);

  MDPIActivity mdpi = new MDPIActivity();
  Context context =mdpi.getContext();
  LocalDatabase localDatabase = new LocalDatabase(context); //Instantiation of the DB
  int status = localDatabase.getSubmissionStatus(position+1);

  if (status==102 | status==19)
  {
      statusRejected.setVisibility(View.VISIBLE);
  }
  else
  {
      if (status==29)
      {
      statusOk.setVisibility(View.VISIBLE);
      }
      else
      {
          statusProcessing.setVisibility(View.VISIBLE);
      }
  }

  holder.JournalName.setText(submissionsArrayList.get(position).getJournalTitle()+"-"+submissionsArrayList.get(position).getID());
  holder.SubmissionTitle.setText(submissionsArrayList.get(position).getTitle());
  holder.SubmissionDate.setText(submissionsArrayList.get(position).getDate());

  return convertView;
}

 static class ViewHolder {
  TextView JournalName;
  TextView SubmissionTitle;
  TextView SubmissionDate;
  ImageView statusOk;
  ImageView statusRejected;
  ImageView statusProcessing;
 }

Alle Arbeiten willkommen, aber die Erstellung der Liste auf dem Display und das Scrollen ist ziemlich langsam. Ich habe dies auch für die Éy -Liste verwendet:

android:fastScrollEnabled="true"
android:scrollingCache="true"
android:smoothScrollbar="true"

Die Ansicht, die sich von der vorherrschenden Ansicht zum ListView wechselt, ist jedoch langsam und auch das Scrollen der Liste.

War es hilfreich?

Lösung

Alles von ab getrennt zuerst tun dieses Ding
Verschieben Sie diesen Code in der IF -Bedingung, wenn "Ansicht konvertieren" null ist "

convertView = mInflater.inflate(R.layout.user_submissions_customisation, null); holder = new ViewHolder(); holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName); holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle); holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate); holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage); holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage); holder.statusProcessing=(ImageView)convertView.findViewById(R.id.statusProcessingImage); convertView.setTag(holder);

Sie verwenden den Adapter nicht effizient, indem Sie wie Sie codieren.
Der oben genannte Weg wird die Leistung mit Sicherheit verbessern.

In einer Nussschale müssen Sie die Ansicht für die List -Zeile nur dann aufblasen, wenn die Konvertierungsansicht null ist.
Außerdem müssen unterschiedliche Ansichten in der Ansicht der Zeile mit der ConvertView selbst initialisiert werden.
Anschließend setzen Sie die Ansicht der Halter als Tag für die Konvertituransicht und der Adapter bietet kontinuierlich die gleiche Ansicht, anstatt die neuen jedes Mal aufzublasen.

Bearbeiten:Sie sollten den Code für den Kontext verschieben und die DB aus der Methode von GetView () instanziieren.
Machen Sie einfach eine Klassenvariable "mcontext" in Ihrer Adapterklasse und instanziieren Sie sie im Konstruktor Ihres Adapters, indem Sie den Kontext Ihrer Aktivität übergeben.
Dann an derselben Stelle (Konstruktor) auch die DB instanziieren.

Andere Tipps

Warum du stets Eine Konvertierung aufblasen? Wenn Sie nicht null anzeigen, sollten Sie die Ansicht ändern, wie Sie möchten, und keine Ansicht aufblasen. Verwenden Sie so diesen Code oben auf GetView

if (convertView == null) {
    convertView = mInflater.inflate(R.layout.user_submissions_customisation, null);
} else {
    //convertView  is already inflated. No inflate it again!
    holder = (ViewHolder) convertView.getTag();
}
holder = new ViewHolder();
holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName);

Versuche dies:

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

    if (convertView == null) 
      { 
         convertView = mInflater.inflate(R.layout.user_submissions_customisation, null);
         holder = new ViewHolder();
         holder.JournalName = (TextView) convertView.findViewById(R.id.JournalName);
         holder.SubmissionTitle = (TextView) convertView.findViewById(R.id.SubmissionTitle);
         holder.SubmissionDate = (TextView) convertView.findViewById(R.id.SubmissionDate);
         holder.statusOk=(ImageView)convertView.findViewById(R.id.statusOkImage);
         holder.statusRejected=(ImageView)convertView.findViewById(R.id.statusRejectedImage);
         holder.statusProcessing=ImageView)convertView.findViewById(R.id.statusProcessingImage);
         convertView.setTag(holder);
      } 
      else 
      {
       holder = (ViewHolder) convertView.getTag();
      }

   ...
}

Auf diese Weise ist Ihre Initialisierung des Objekts des Holders nur für das erste Element Ihrer Liste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top