Đọc this câu hỏi, tôi đã thử ví dụ được đưa ra trong câu trả lời và nó hoạt động tốt. Bây giờ tôi muốn thực hiện tương tự nhưng với bộ điều hợp tùy chỉnh sử dụng lớp Student
. Vì vậy, tôi có:ListView với bộ điều hợp tùy chỉnh, thêm từng thành phần
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;
}
}
và:
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;
}
}
Vấn đề là chỉ hàng đầu tiên sẽ được hiển thị và Toast
sau một vài giây. Tôi không hiểu tại sao (trong nhật ký) chỉ có một cuộc gọi đến getView
! Có lỗi trên mã của tôi không? Một cái gì đó mất tích? Ai đó có thể giúp tôi?
kiểm tra students.size của bạn()? –