ListView avec un adaptateur personnalisé, en ajoutant des éléments un par un

Lecture cette question, j'ai essayé l'exemple donné dans la réponse, et ça fonctionne très bien.
Maintenant, je veux faire la même chose mais avec un adaptateur personnalisé à l'aide d'un Student classe. J'ai donc:

public class AsyncDemo extends ListActivity {
private static final String[] items={"lorem", "ipsum", "dolor",
"sit", "amet", "consectetuer",
"adipiscing", "elit", "morbi",
"vel", "ligula", "vitae",
"arcu", "aliquet", "mollis",
"etiam", "vel", "erat",
"placerat", "ante",
"porttitor", "sodales",
"pellentesque", "augue",
"purus"};
private List<Student>  students;
private StudentAdapter studentsAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//   setListAdapter(new ArrayAdapter<String>(this,
//                       android.R.layout.simple_list_item_1,
//                       new ArrayList<String>()));
students = new ArrayList<Student>();
students.clear();
studentsAdapter = new StudentAdapter(this, students);
setListAdapter(studentsAdapter);
new AddStringTask().execute();
}
// class AddStringTask extends AsyncTask<Void, String, Void>
class AddStringTask extends AsyncTask<Void, Student, Void>
{
@Override
protected Void doInBackground(Void... unused)
{
for (String item : items)
{
Student student = new Student();
student.setName(item);
publishProgress(student);
//       publishProgress(item);
SystemClock.sleep(200);
}
return(null);
}
//   @SuppressWarnings("unchecked")
//   @Override
//   protected void onProgressUpdate(String... item) {
//     ((ArrayAdapter<String>)getListAdapter()).add(item[0]);
//   }
@Override
protected void onProgressUpdate(Student... student)
{
((StudentAdapter)getListAdapter()).add(student[0]);
}
@Override
protected void onPostExecute(Void unused) {
Toast
.makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT)
.show();
}
}
}
package com.commonsware.android.async;
public class Student
{
private String name;
public void setName(String name) 
{
this.name = name;
}
public String getName() 
{
return name;
}
}

et:

public class StudentAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Student> students;
private ViewHolder holder;
public StudentAdapter(Activity context,List<Student> students)
{
this.inflater = LayoutInflater.from(context);
this.students = students;
}
public void add(Student album)
{
Log.w("StudentAdapter","add");
students.add(album);
}
@Override
public int getCount()
{
Log.w("StudentAdapter","getCount : " + students.size());
return students.size();
}
@Override
public Object getItem(int position)
{
Log.w("StudentAdapter","getItem");
return students.get(position);
}
@Override
public long getItemId(int position)
{
Log.w("StudentAdapter","getItemId");
return position;
}
private class ViewHolder
{
TextView  tv_album_name;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Log.w("StudentAdapter","getView");
View rowView = convertView;
if(rowView == null)
{
rowView = inflater.inflate(R.layout.student_item,null);
holder = new ViewHolder();
holder.tv_album_name = (TextView) rowView.findViewById(R.id.tv_student_name);
rowView.setTag(holder);
}
else
{
holder = (ViewHolder) rowView.getTag();
}
holder.tv_album_name.setText(students.get(position).getName());
return rowView;
}
}

Le problème est que seule la première ligne est affichée et la Toast après quelques secondes. Je ne comprends pas pourquoi(dans le journal) il y a un seul appel à la getView!
Est-il une erreur dans mon code? Il manque quelque chose? Quelqu'un peut-il m'aider?

vérifiez vos élèves.size() ?

OriginalL'auteur tweetysat | 2012-02-23