2011-11-06 54 views
1

我创建了一个具有复选框的自定义ListView。我想删除“删除”菜单选项选择中的选定项目。 我正在处理CheckBox上的onCheckedChanged事件。在这里我维护一个ArrayList来记下所选元素的位置。现在,当用户选择“删除”菜单项时,我会从ListAdapter的ArrayList中删除选择的项目。错误的列表项被删除,而不是使用自定义列表适配器选择的项目

下面是我的代码,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    names = new ArrayList<String>(); 
    names.add("first"); 
    names.add("second"); 
    names.add("three"); 
    names.add("four"); 
    names.add("five"); 
    names.add("six"); 
    names.add("seven"); 
    names.add("eight"); 
    names.add("nine"); 

    listAdapter = new SelfAdapter(this,names); 

    this.setListAdapter(listAdapter);      
} 

    @Override 
public boolean onOptionsItemSelected(MenuItem menuItem){ 
    int menuId = menuItem.getItemId(); 
    ArrayList<Integer> selectedItems; 
    switch(menuId){ 
    case R.id.delitem: 
     Log.d(TAG,"del item selected"); 
     selectedItems = listAdapter.getSelected(); 
      **//pick the selected position items and delete them from the 
      // listadapter arraylist** 
     for(Integer element: selectedItems){ 
      Log.d(TAG,"Selected:"+element.toString()); 
      names.remove(element.intValue()); 
      listAdapter.notifyDataSetChanged(); 
     }   
    } 
    return true; 
} 

下面是自定义适配器的代码,

}

现在的问题是,如果选择第1,第2项(例如)然后我看到错误的项目被删除,并在完全错误后填充listview。后来如果我试图删除它抛出的“索引越界异常”的项目。我猜getView方法中的代码出错了。

有人可以帮助我找出在这里做错了什么。

感谢

+0

你能提供具体的问题吗?选择第一和第二项时,哪些项目会被删除?之后listview有什么用? –

+0

@Ted Hopp - 无论我选择的项目被删除的项目是完全不同的(没有模式)...说如果我选择第一和第二项目,然后删除第八和第九项目..但这只是一个例子。 ..没有一定的模式 – droidsites

回答

1

当您从names中删除元素时,还需要从checkedPos阵列中删除元素。否则,这两个阵列将具有不同的长度。然后,当您再次尝试时,checkedPos将比names更长,并且最终导致索引越界异常。

此外,当您从names删除时,不能使用正常的迭代器。如果您应该删除索引1和2中的名称,那么当您删除名称1时,名称2会移动到位置1,但您的索引不会相应更新。最简单的解决方案是向后遍历位置数组,从names的末尾删除,然后从头开始删除。

P.S.从序号(“第一”,“第二”)切换到列表中间的基数(“三”,“四”等)有些奇怪。

+0

谢谢。没有完全解决我的问题,但它是非常大的提示,我得到了...... :-) – droidsites

+0

也许它会在删除'names'中的元素后清除'checkedPos'数组。 –

+0

再次感谢。现在我只是先在位置上降序排列(因为所选项目是随机的),然后从“Data arrayList”中删除每个元素,然后清除。修复了我完整的问题:-) – droidsites

0

必须删除 名称=新的ArrayList < STRING>();

但您删除selectedItems;

相关问题