2016-05-26 1 views
1

У меня возникла проблема с notifyOnDataSetChanged(). Я могу получить представление в виде списка для загрузки новых данных, создав новый CustomAdapter, но не используя notifyOnDataSetChanged ().Работает и настраивается новый пользовательский адаптер, но 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); 
       } 
      } 
    ); 

UPDATE: @ ответ САБИХ работал. На основе ответов от @Sabeeh и @ViniciusRodriguesLima ниже, я должен был изменить свой CustomAdapter.java следующим образом ссылаться на переменную list (в дополнение к добавлению метода обновления()):

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

Я попытался предложения от следующие страницы не принесло:

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

+0

отправьте код адаптера, и вы должны обновить список в адаптере, а затем позвонить notifyDataSetChanged() – Sabeeh

ответ

1

Пожалуйста, попробуйте следующее:

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

когда вы передаете объект источника данных адаптеру, вы jus t передать его по значению. Когда вы обновляете свои данные в области действия, ваш адаптер ничего не знает об этом. Вот почему Sabeeh создал метод обновления внутри адаптера, таким образом, он может обновлять свой источник данных адаптера. - Vinicius Rodrigues Lima

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

+0

Спасибо @Sabeeh. Сможете ли вы объяснить, почему мой код не выполняет то же самое? (Я принял ваш ответ) – Vinnie

+1

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

+0

Спасибо @ViniciusRodriguesLima. Это имеет большой смысл. – Vinnie

0

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

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

    adapter.notifyOnDataSetChanged(); 
}