我有一个我在Fragment
中使用的数组字符串,我在列表中显示了带有setListAdapter
的数组字符串项:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String[] array = getResources().getStringArray(R.array.examlearray);
final ArrayList<String> str = new ArrayList<String>(Arrays.asList(array));
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, str );
setListAdapter(arrayAdapter);
final ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {...
在我的onActionItemClicked
下我想实现我的 deleteSelectedItem()方法,该方法会从我选择的列表中删除项目,这是我的代码,但它没有删除所选项目,它只是从列表的第一个删除,它想要的地方!!!我该怎么办?,任何帮助将不胜感激!谢谢!
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Respond to clicks on the actions in the CAB
switch (item.getItemId()) {
case R.id.delete:
// deleteSelectedItems();
Log.i(TAG, "deleteSelectedEntries");
SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
for(int i=0;i<checkedItems.size();++i){
if(checkedItems.valueAt(i)){
str.remove(listView.getItemAtPosition(i));
}
}
arrayAdapter.notifyDataSetChanged();
mode.finish();
return true;
}
答案 0 :(得分:1)
SparseBooleanArray
的键表示列表视图中所选项目的位置。因此,而不是str.remove(listView.getItemAtPosition(i));
使用str.remove(checkedItems.keyAt(i));
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Respond to clicks on the actions in the CAB
switch (item.getItemId()) {
case R.id.delete:
// deleteSelectedItems();
Log.i(TAG, "deleteSelectedEntries");
SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
for(int i=0;i<checkedItems.size();++i){
if(checkedItems.valueAt(i)){
str.remove(checkedItems.keyAt(i));
}
}
arrayAdapter.notifyDataSetChanged();
mode.finish();
return true;
}
答案 1 :(得分:0)
在您的代码中,您将从最终的ArrayList str中删除(为什么如果您计划删除/更改数据,则将其声明为最终?)。
你需要使用
arrayAdapter.remove(listView.getItemAtPosition(i))
然后
arrayAdapter.notifyDataSetChanged();
答案 2 :(得分:0)
您的代码在很多情况下返回ArrayIndexOutOfBound
。
一个例子:
你有一个包含14个元素的列表,你可以选择它的第一个和最后一个索引。所以现在在for语句中你会通过你的列表并从中删除:
在这种情况下,您删除列表的第一个索引,因此列表的大小变为13,然后删除最后一个项目,您尝试访问列表中不存在的第14个元素
如何解决:
for(int i=checkedItems.size()-1 ;i>= 0;i--){
if(checkedItems.valueAt(i)){
str.remove(checkedItems.keyAt(i));
}
}