2016-10-21 47 views
0

我有一个ExpandableListView和一个复选框,以根据用户偏好删除项目。它“技术上”起作用,但我遇到的问题是我必须单击复选框4或5次以实际删除所有需要的条目。从ExpandableListView删除多个项目

任何想法我失踪?

chkOnline.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if(isChecked){ 
      for(int i = 0; i < devices.size(); i++){ 
       if(!devices.get(i).isOnline()){ 
        devices.remove(i); 
       } 
      } 
      adapter.notifyDataSetChanged(); 
      } 
    } 
}); 

回答

1

这里的问题是,你正在改变列表的大小,同时消除其项目:

假设你的列表的大小为3:

//first iteration 
i = 0, limit = 2 (i < size()) 
l = [1,2,3] 
1 is online => l = [2,3] 

//second iteration 
i = 1, limit = 1 (because size() now returns 2 and i < size()) 
l = [2,3] 

而且没有循环结束检查原始列表中的最后一个元素(3)。

为了解决这个问题,你可以简单地从结束迭代开始:

for(int i = devices.size() - 1; i >= 0; i--){ 
    if(!devices.get(i).isOnline()){ 
     devices.remove(i); 
    } 
} 
+0

我爱你佩德罗。 +1甚至没有想到这一点 – basic