5

पढ़ना this प्रश्न, मैंने उत्तर में दिए गए उदाहरण की कोशिश की और यह ठीक काम कर रहा है। अब मैं ऐसा करना चाहता हूं लेकिन Student कक्षा का उपयोग कर कस्टम एडाप्टर के साथ। तो मेरे पास है:कस्टम एडाप्टर के साथ ListView, तत्वों को एक करके

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

अपने students.size जाँच()? –

उत्तर

1

कोशिश इस दूसरी पंक्ति जोड़कर:

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

कि अन्य मदों दिखाता है?

4

इसके अलावा Adapter से अपने add() विधि में notifyDataSetChanged() फोन:

public void add(Student album) 
{ 
    Log.w("StudentAdapter","add"); 
    students.add(album); 
    notifyDataSetChanged(); 
} 
संबंधित मुद्दे