阅读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
!
我的代码有错误吗?有什么遗失?有人能帮助我吗?
答案 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();
是否显示其他项目?