2015-02-28 3 views
0

Когда я добавить или удалить объект из List<T>, я называю myAdapter.notifyDataSetChanged() к «повторно вызывать» ListView, но это не работает ...ArrayAdapter.notifyDataSetChanged() не похоже на работу

активность:

private ListView lv_course; //Liste des matières 
    private List<Course> courses = new ArrayList<Course>(); 
    private CustomListAdapterCourse customListAdapterCourse; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_course); 

     courses = getDataFromDatabase(); 

     lv_course = (ListView) findViewById(R.id.lv_course); 
     customListAdapterCourse = new CustomListAdapterCourse(this, courses); 
     lv_course.setAdapter(customListAdapterCourse); 

     //... 

    } 

адаптер:

private Context context; 
private List<Course> courses; 

public CustomListAdapterCourse(Context theContext, List<Course> theListCourses) { 
    super(theContext, 0, theListCourses); 
    this.context = theContext; 
    this.courses = theListCourses; 
} 

В другой деятельности, добавить данные в базу данных, и во время onResume():

@Override 
    protected void onResume() { 
     super.onResume(); 
     courses = getDataFromDatabase(); 
     customListAdapterCourse.notifyDataSetChanged(); 
    } 

ListView не обновляется, но когда я закрыть приложение и перезапустить его, он содержит все объекты, которые я создал.

ответ

1

Вы не добавляете новые данные к своему адаптеру. Вам нужно позвонить .add()

customListAdapterCourse.add(your_new_data); 

то на самом деле будет изменения в регистре, когда вы звоните notifyDataSetChanged();

customListAdapterCourse.notifyDataSetChanged(); 

В зависимости от типа адаптера вы можете также использовать loadObjects(), чтобы вызвать обновление ваших данных. Это может вызвать другой запрос для данных (опять же, в зависимости от типа вашего адаптера), если вы знаете, что внесено изменение в базу данных и хотели бы отразить эти изменения в вашем наборе данных/listview. Это будет использоваться, если не требуется использование add() или remove()

customListAdapterCourse.loadObjects();

Но так как кажется, что вы на самом деле загружается courses в адаптер это может не относиться, и вы лучше с add().

customListAdapterCourse.add(your_new_data_row); 
customListAdapterCourse.notifyDataSetChanged(); 

Вы также можете добавить кучу элементов одновременно с:

customListAdapterCourse.addAll(array_of_new_objects); 
customListAdapterCourse.notifyDataSetChanged(); 
3

Вы не обновляете данные своего адаптера, вы просто меняете ссылку на объект, но ссылка в вашем адаптере указывает на старый объект.

Либо создайте экземпляр нового адаптера с новым объектом или добавьте метод внутри адаптера, чтобы изменить свои данные.

Смежные вопросы