android - listpicker - listview app inventor
Eliminar elementos de múltiples elementos de la vista de lista mediante la casilla de verificación en Android (4)
Utilice removeAll
para los data
y pase una matriz de elementos que se eliminarán al método. El reson es esto:
por ejemplo, tiene 10 elementos, después de eliminar el 4to elemento, todos los índices 5-9 se mueven a 4-8, por lo tanto su ciclo no es correcto porque usa índices old
.
Hola, estoy atascado con la eliminación de varios elementos de la vista de lista usando la casilla de verificación. Puedo seleccionar varios elementos de la vista de lista, pero solo se borra el primer elemento que se selecciona, mientras que otros no se eliminan. Aquí está mi código. ¡Gracias por adelantado!
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);
}
}
}
}
Utilice un SparseBooleanArray para obtener los elementos marcados y luego elimine los mismos y actualice la vista de lista.
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();
}
});
}
}
Editar:
Prueba el siguiente
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();
}
});
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();
}
});
Tal vez deberías probar el código a continuación. El código está basado en recurrencia. Después del evento "OnClick" se llama a Bremselected. ListView se repite hasta que se establece la casilla de verificación "marcada". Luego se elimina el elemento y en otro momento (hay recurrencia) se llama a Bremselected y la nueva iteración comienza desde cero con el "tamaño" decrementado.
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;
}
}
}