您好我无法使用复选框从listview中删除多个项目。我可以从列表视图中选择多个项目,但只有所选的第一个项目被删除而其他项目没有被删除。这是我的代码。在此先感谢!
public class MainActivity extends Activity
{
ListView lv;
ArrayAdapter<String> adapter;
Button delete;
ArrayList<String> data = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.listView1);
delete = (Button)findViewById(R.id.button1);
data.add("Windows");
data.add("Android");
data.add("Apple");
data.add("Blackberry");
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data);
lv.setAdapter(adapter);
delete.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
deleteCheckedItems();
adapter.notifyDataSetChanged();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private void deleteCheckedItems() {
int count = adapter.getCount();
for (int i = 0; i < count; i++)
{
if (lv.isItemChecked(i))
{
data.remove(i);
}
}
}
}
答案 0 :(得分:7)
使用SparseBooleanArray获取已检查的项目,然后删除相同的项目并刷新列表视图。
public class MainActivity extends Activity
{
ListView lv;
ArrayAdapter<String> adapter;
Button delete;
ArrayList<String> data = new ArrayList<String>();
SparseBooleanArray mCheckStates ;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
lv = (ListView)findViewById(R.id.listView1);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
delete = (Button)findViewById(R.id.button1);
data.add("Windows");
data.add("Android");
data.add("Apple");
data.add("Blackberry");
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data);
lv.setAdapter(adapter);
delete.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
SparseBooleanArray checked = lv.getCheckedItemPositions();
for (int i = 0; i < lv.getCount(); i++){
if (checked.get(i)==true)
{
data.remove(i);
}
adapter.notifyDataSetChanged();
}
lv.clearChoices();
}
});
}
}
编辑:
尝试以下
delete.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
SparseBooleanArray checkedItemPositions = lv.getCheckedItemPositions();
int itemCount = lv.getCount();
for(int i=itemCount-1; i >= 0; i--){
if(checkedItemPositions.get(i)){
adapter.remove(data.get(i));
}
}
checkedItemPositions.clear();
adapter.notifyDataSetChanged();
}
});
答案 1 :(得分:0)
对removeAll
使用data
并将要删除的元素数组传递给方法。共鸣是这样的:
例如,你有10个元素,删除第4个元素后,所有索引5-9都移动到4-8,因此你的循环不正确,因为你使用old
索引。
答案 2 :(得分:0)
delete.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
SparseBooleanArray checkedItemPositions = lv.getCheckedItemPositions();
int itemCount = lv.getCount();
for(int i=0; i <itemCount; i++){
if(checkedItemPositions.get(i)){
adapter.remove(data.get(i));
--i;
}
}
checkedItemPositions.clear();
adapter.notifyDataSetChanged();
}
});
答案 3 :(得分:0)
也许您应该尝试下面的代码。代码基于并发性。 在&#34; OnClick&#34;被称为Bremselected的事件。对ListView进行迭代,直到&#34;检查&#34;复选框成立。然后移除项目并再次调用Bremselected(有重复),新的迭代从头开始,使用&#34; size&#34;递减。
public void Bremselected(View v)
{
final int size=lv.getChildCount(); /// lv=(ListView)
for(int i=0;i<size;i++){
CheckBox mchb=(MCheckBox) lv.getChildAt(i);
if(mchb.isChecked()){
lv.removeViewAt(i);
Bremselected(v);
break;
}
}
}