Создание и установка нового пользовательского адаптера работает, но notifyOnDataSetChanged() не работает.

У меня возникла проблема с notifyOnDataSetChanged().. Я могу заставить свое представление списка загружать новые данные, создав новый CustomAdapter, но не используя notifyOnDataSetChanged().

private void repopulateListView(JSONObject resp) throws JSONException {
    arrayList.clear();
    List<MyObject> newArrayList = getData(); 
    arrayList.addAll(newArrayList); //I've checked that arrayList contains new data

    /* WORKS, new data is loaded in the list view */
    adapter = new CustomAdapter(MainActivity.this, arrayList);
    listView.setAdapter(adapter);
}

тогда как следующее не работает - представление списка не обновляется, оно просто остается таким, каким оно было до получения новых данных. Я проверил правильность извлечения новых данных.

private void repopulateListVIew(JSONObject resp) throws JSONException {
    arrayList.clear();
    List<MyObject> newArrayList = getData(); 
    arrayList.addAll(newArrayList); //I've checked that arrayList contains new data

    /* DOES NOT WORK, list view does not refresh with new data */
    ((BaseAdapter)adapter).notifyOnDataSetChanged();
}

Мой адаптер был определен так:

adapter = new CustomAdapter(MainActivity.this, arrayList);
listView = (ListView) findViewById(R.id.list_view); 
listView.setAdapter(adapter);
listView.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //additional code
                    startActivity(DetailsActivity);
                }
            }
    );

ОБНОВЛЕНИЕ: ответ @Sabeeh сработал. Основываясь на ответах @Sabeeh и @ViniciusRodriguesLima ниже, мне пришлось отредактировать свой CustomAdapter.java следующим образом, чтобы сослаться на переменную list (в дополнение к добавлению метода update()):

public class CustomAdapter extends ArrayAdapter<MyObject> {
    private Context context;
    private List<MyObject> list = new ArrayList<>(); //add this variable

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inf = LayoutInflater.from(getContext());
        View customView = inf.inflate(R.layout.custom_beer_row, parent, false);
        //final MyObject chosenObj = getItem(position); Changed to the statement below
        final MyObject chosenObj = list.get(position); //this is CORRECT
        ...
    }

Я пробовал предложения со следующих страниц безрезультатно:

Любая помощь будет оценена по достоинству.


person VIN    schedule 26.05.2016    source источник
comment
пожалуйста, опубликуйте код адаптера, и вы должны обновить список в адаптере, а затем вызвать notifyDataSetChanged()   -  person Sabeeh    schedule 26.05.2016


Ответы (2)


Пожалуйста, попробуйте это:

private void repopulateListVIew(JSONObject resp) throws JSONException {
    arrayList.clear();
    List<MyObject> newArrayList = getData();
    arrayList.addAll(newArrayList);
    adapter.update(arrayList);
}

и в вашем классе CustomAdapter напишите следующую функцию

public void update(ArrayList<MyObject> list) {
    //replace arrayList variable with your class ArrayList variable
    this.arrayList = list;
    this.notifyDataSetChanged();
}

когда вы передаете объект источника данных адаптеру, вы просто передаете его по значению. Когда вы обновляете свои данные в области действия, ваш адаптер ничего об этом не знает. Вот почему Sabeeh создал метод обновления внутри адаптера, чтобы он мог обновлять источник данных своего адаптера. – Винисиус Родригес Лима

Я надеюсь, это поможет вам.

person Sabeeh    schedule 26.05.2016
comment
Спасибо @Sabeeh. Не могли бы вы объяснить, почему мой код не выполняет то же самое? (Я принял ваш ответ) - person VIN; 26.05.2016
comment
@Killiam, когда вы передаете объект источника данных адаптеру, вы просто передаете его по значению. Когда вы обновляете свои данные в области действия, ваш адаптер ничего об этом не знает. Вот почему Sabeeh создал метод обновления внутри адаптера, чтобы он мог обновлять источник данных своего адаптера. - person Vinicius Lima; 26.05.2016
comment
Спасибо @ViniciusRodriguesLima. Это имеет большой смысл. - person VIN; 26.05.2016

Объявите переменную adapter как ArrayAdapter и попробуйте использовать следующий код:

private void repopulateListVIew(JSONObject resp) throws JSONException {
    adapter.clear();
    List<MyObject> newArrayList = getData(); 
    adapter.addAll(newArrayList); 

    adapter.notifyOnDataSetChanged();
}
person jaibatrik    schedule 26.05.2016