2017-02-16 68 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) { 

     } 
    }); 

所以,当我尝试添加“一个”不属于改造服务的一部分,微调器被更新。

但是我对onResponse()中的floorList所做的一切都没有更新适配器和微调器。 我尝试在onResponse()上清除它,然后调用notifyDataSetChanged(),即使这样也不会从微调控件中删除“a”选项。

任何人都知道如何解决这个问题?

+0

以及'notifyDataSetChanged' shoudl被称为obviosuly后改变......也**你不应该**继续改变'ArrayList'你传递给'ArrayAdapter' ...你应该直接使用ArrayAdapter的方法来删除/添加项目 – Selvin

+0

它不会因为你正在进行更改在你的onResponse里的你的floorlist中。您必须更新适配器类正在使用的列表。最好在适配器中创建一个方法并传递该列表并调用notifyDataSetChanged。 – Gautam

+0

好吧,我打电话给它,但floorList仍然没有更新,更不用说'onResponse()'里面的'add',即使'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

我宁愿在'setNotifyOnChange (false)'...在'setNotifyOnChange(true)'之后也不需要'notifyDataSetChanged()'...但只要调用'onResponse',它应该可以工作... – Selvin

+0

我重复检查了 - setNotifyOnChange不通知DataSetChanged,至少在25上。 清除可能会在我们停止通知后移动,但由于我们不知道运行循环将持续多长时间,所以我之前将其保留。当他实现它时,真的是OPs的偏好 –

+0

[你是对的](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java#L328)...我误解了 文档:*如果为true,则对列表的修改将自动调用notifyDataSetChanged()*修改...不会调用setNotifyOnChange本身的真实 – Selvin

相关问题