我目前从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;
}
但是我得到了相同的结果,任何人都可以告诉我为什么?感谢。
答案 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)
^
我们没有错过任何东西。