5

Okuma this Sorunun cevabında verilen örneği denedim ve iyi çalışıyor. Şimdi aynı şeyi yapmak istiyorum ama Student sınıfını kullanarak özel bir bağdaştırıcıyla. Yani var:ListView özel bir adaptör ile, elemanların birer birer eklenmesiyle

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

ve:

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

} 

sorun yalnızca ilk satır görüntülendiğini ve birkaç saniye sonra Toast. Neden (günlükte) getView'a sadece bir çağrı olduğunu anlamıyorum! Kodumda bir hata var mı? Eksik bir şey? Birisi bana yardım edebilir mi?

+0

sizin students.size kontrol()? –

cevap

1

deneyin bu ikinci satırı ekleyerek:

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

diğer öğeleri gösterir?

4

Ayrıca Adapter adresinin add() yönteminde notifyDataSetChanged() çağırır:

public void add(Student album) 
{ 
    Log.w("StudentAdapter","add"); 
    students.add(album); 
    notifyDataSetChanged(); 
} 
İlgili konular