5

Đọ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?

+0

kiểm tra students.size của bạn()? –

Trả lời

1

Hãy thử thêm dòng thứ hai này:

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

Điều đó cho thấy các mặt hàng khác?

4

Cũng gọi notifyDataSetChanged() trong phương pháp add() của bạn từ Adapter:

public void add(Student album) 
{ 
    Log.w("StudentAdapter","add"); 
    students.add(album); 
    notifyDataSetChanged(); 
} 
Các vấn đề liên quan