ListView带有自定义适配器,逐个添加元素

时间:2012-02-23 15:39:15

标签: android android-listview android-arrayadapter baseadapter

阅读this问题,我尝试了答案中给出的例子并且工作正常。 现在我想做同样的事情,但使用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<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;
  }
}

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;
}

}

问题是只显示第一行,几秒钟后显示Toast。我不明白为什么(在日志中)只有一次调用getView! 我的代码有错误吗?有什么遗失?有人能帮助我吗?

2 个答案:

答案 0 :(得分:4)

还可以从notifyDataSetChanged()

中调用add()方法中的Adapter
public void add(Student album)
{
    Log.w("StudentAdapter","add");
    students.add(album);
    notifyDataSetChanged();
}

答案 1 :(得分:1)

尝试添加第二行:

((StudentAdapter)getListAdapter()).add(student[0]);
((StudentAdapter)getListAdapter()).notifyDataSetChanged();

是否显示其他项目?