从列表中删除Android是错误的

时间:2013-11-07 11:55:19

标签: android arraylist

我目前从webservice检索数据的代码如下:

try{
    for(int i = 0; i <= list.size() - 1; i++){
        SoapObject request = new SoapObject(NAMESPACE + "/", "get_all");    
        request.addProperty("host", host);
        request.addProperty("user", user);
        request.addProperty("pass", pass);
        request.addProperty("bd", bd);              
        request.addProperty("id", list.get(i));

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, 60000);
        try {
            androidHttpTransport.call(URL + "/get_all", envelope);
        } catch (Exception e) {
            Log.e("Error HH:", e.toString());
            break;
        }

        SoapObject rep = (SoapObject) envelope.bodyIn;
        JSONArray jr = new JSONArray(rep.getPropertyAsString(0)); 

        JSONObject jb = (JSONObject) jr.get(0); 
        db.update_text(jb.getString("text_priority"), jb.getInt("id"));
        updateLabel("Importing id: " + jb.getString("id"));
        publishProgress((i * 100) / list.size()); 
    }
}catch (Exception e) {
    Log.e("Error H:", e.toString());
}

它在标签中正确显示如下:

  

“导入ID:1”

     

“导入ID:2”

     

“导入ID:3”

     

“导入ID:4”

     

“导入ID:5”

     

“导入ID:6”

一切正常。虽然,我想删除每当完全调用变量“list”中的ID时。

try {
    androidHttpTransport.call(URL + "/get_all", envelope);
    list.remove(list.get(i));
} catch (Exception e) {
    Log.e("Error HH:", e.toString());
    break;
}

但是,使用此代码,我的标签输出如下:

  

“导入ID:1”

     

“导入ID:3”

     

“导入ID:5”

     

“导入ID:7”

我也试过这个:

try {
    androidHttpTransport.call(URL + "/get_all", envelope);
    list.remove(i);
} catch (Exception e) {
    Log.e("Error HH:", e.toString());
    break;
}

但是我得到了相同的结果,任何人都可以告诉我为什么?感谢。

1 个答案:

答案 0 :(得分:2)

您需要从列表中的最后一项开始,如果要在迭代项目的同时删除项目,则需要向后工作。因此,将for循环更改为:

for(int i = list.size()-1; i >= 0; i--)

由于在从数组中删除项目时将所有内容移到左侧,因此您需要确保光标也在同一方向上移动。因此,如果我们有一个包含4个项目的数组,并且正在查看第0个位置的项目:

[itemA itemB itemC itemD] (i=0)
 ^

然后删除该项并递增我们的计数器:

[itemB itemC itemD] (i=1)
         ^

我们跳过itemB直接进入itemC!但是从后到前:

[itemA itemB itemC itemD] (i = 3)
                      ^

并删除:

[itemA itemB itemC] (i=2)
               ^

我们没有错过任何东西。