ListView с пользовательским адаптером, добавление элементов по одному

Читая этот вопрос, я попробовал пример, приведенный в ответе, и он работает нормально. Теперь я хочу сделать то же самое, но с пользовательским адаптером, использующим класс Student. Итак, у меня есть:

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  students;
    private StudentAdapter studentsAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

//    setListAdapter(new ArrayAdapter(this,
//                        android.R.layout.simple_list_item_1,
//                        new ArrayList()));

    students = new ArrayList();
    students.clear();
    studentsAdapter = new StudentAdapter(this, students);
    setListAdapter(studentsAdapter);

    new AddStringTask().execute();
    }

//  class AddStringTask extends AsyncTask
    class AddStringTask extends AsyncTask
    {
    @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)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;
  }
}

и:

public class StudentAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private List students;
    private ViewHolder holder;

    public StudentAdapter(Activity context,List 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;
}

}

Проблема в том, что отображается только первая строка и Toast через несколько секунд. Я не понимаю, почему (в логе) есть только один вызов getView! Есть ли ошибка в моем коде? Что-то упущено? Кто-нибудь может мне помочь?

5
задан Community 23 May 2017 в 12:32
поделиться