2017-02-16 49 views
0

Так у меня есть кусок кода, который похож на этотArrayAdapter не обновляет вид, когда notifyDataSetChanged() называется

floorList = new ArrayList<String>(); 
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, floorList); 
    arrayAdapter.setNotifyOnChange(true); 
    floorSpinner.setAdapter(arrayAdapter); 
    floorList.add("a"); 

    Call<ParkourResponse<ParkingPlaceResponseObject>> getPlaceDetailCall = Helper.getParkourService().getPlaceDetail(placeID); 
    getPlaceDetailCall.enqueue(new Callback<ParkourResponse<ParkingPlaceResponseObject>>() { 
     @Override 
     public void onResponse(Call<ParkourResponse<ParkingPlaceResponseObject>> call, Response<ParkourResponse<ParkingPlaceResponseObject>> response) { 
      ParkingPlaceResponseObject placeDetail = response.body().getRespObject(); 
      Floor[] floorArray = placeDetail.getFloor(); 
      floorList.clear(); 
      arrayAdapter.notifyDataSetChanged(); 
      for(int i = 0; i < floorArray.length; i++){ 
       floorList.add(Integer.toString(floorArray[i].getNumber())); 
      } 
     } 

     @Override 
     public void onFailure(Call<ParkourResponse<ParkingPlaceResponseObject>> call, Throwable t) { 

     } 
    }); 

Так что, когда я попытался добавить «а», которая не является частью службы Retrofit, счетчик обновлен.

Но все, что я делаю для floorList внутри onResponse(), не обновляет адаптер и счетчик. Я попытался очистить его от onResponse(), а затем вызвать notifyDataSetChanged(), даже если он не удаляет опцию «a» из счетчика.

Кто-нибудь знает, как это исправить?

+0

хорошо 'notifyDataSetChanged' shoudl быть obviosuly окликнул изменения сделаны ... также ** вы не должны ** передавать при изменении 'ArrayList', который вы передаете' ArrayAdapter' ... вы должны напрямую использовать методы ArrayAdapter для удаления/добавления элементов – Selvin

+0

это не потому, что вы вносите изменения в вашем полном списке внутри вашего onResponse. Вы должны обновить список, который используется классом адаптера. Лучше сделать способ в своем адаптере и передать этот список и вызвать notifyDataSetChanged. – Gautam

+0

Я назвал его, но floorList все еще не обновляется, не говоря уже о 'add' внутри' onResponse() ', даже' floorList.clear() 'не очищает массив FloorList @Selvin – Jegul

ответ

0

Обратите внимание на комментарии Selvin и Гаутамы, а после этого ответа, так как они правильно и поможет вам понять, почему код должен выглядеть следующим образом:

floorList = new ArrayList<String>(); 
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, floorList); 
arrayAdapter.setNotifyOnChange(true); 
floorSpinner.setAdapter(arrayAdapter); 
arrayAdapter.add("a"); //I would jsut pass this into the adapter's constructor 

Call<ParkourResponse<ParkingPlaceResponseObject>> getPlaceDetailCall = Helper.getParkourService().getPlaceDetail(placeID); 
getPlaceDetailCall.enqueue(new Callback<ParkourResponse<ParkingPlaceResponseObject>>() { 
    @Override 
    public void onResponse(Call<ParkourResponse<ParkingPlaceResponseObject>> call, Response<ParkourResponse<ParkingPlaceResponseObject>> response) { 
     ParkingPlaceResponseObject placeDetail = response.body().getRespObject(); 
     Floor[] floorArray = placeDetail.getFloor(); 
     arrayAdapter.clear(); //update the adapter, not the external list 
     arrayAdapter.setNotifyOnChange(false); //we'll only update after list is full, for efficiency 
     for(int i = 0; i < floorArray.length; i++){ 
      arrayAdapter.add(Integer.toString(floorArray[i].getNumber())); 
     } 
     arrayAdapter.setNotifyOnChange(true); 
     arrayAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onFailure(Call<ParkourResponse<ParkingPlaceResponseObject>> call, Throwable t) { 

    } 
}); 
+0

Я предпочел бы перевести 'clear()' после 'setNotifyOnChange (false) '... также нет необходимости в' notifyDataSetChanged() 'после' setNotifyOnChange (true) '... но до тех пор, пока' onResponse' будет вызываться, чем он должен работать ... – Selvin

+0

Я дважды проверял - setNotifyOnChange не уведомляет DataSetChanged, по крайней мере на 25. Очистить можно было перемещать после того, как мы остановили уведомления, но я оставил его раньше, потому что мы не знаем, как долго будет выполняться цикл. Это действительно зависит от предпочтений OPs, когда он реализует его. –

+0

[вы правы] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java#L328) ... Я неправильно понял документация: * если это правда, изменения в списке будут автоматически вызывать notifyDataSetChanged() * модификация ... не вызывает setNotifyOnChange себя с истинным – Selvin