¿Por qué isItemChecked () devuelve true cuando está en ActionMode?
He configurado una devolución de llamada de ActionMode
para su uso como ActionBar
(CAB) contextual dentro de un ActionBarSherlock
utilizando el proyecto.
Estoy tratando de configurar varios seleccionar para que pueda eliminar varios elementos en un ListView
.
- Android.widget.LinearLayout no se puede convertir en android.widget.TextView
- Listview con el grupo de títulos
- ¿Resplandor de encargo del color del resplandor / del borde para ListView?
- Devolución de una matriz de AsyncTask volver a Actividad principal
- Android: casilla de verificación que se repite cada 10º en un listview
Me di cuenta durante la depuración, cuando el ActionBar
contextual (CAB) no está abierto y llamo a isItemChecked()
en un elemento de lista que toco, devuelve false como debería. Pero cuando el CAB está abierto, los elementos que toco (que no he tocado antes) devuelven true en las llamadas a isItemChecked()
. Entonces, cuando llamo delete en la matriz de getCheckedItemIds()
, esa matriz no contiene los elementos que antes estaban devolviendo true para isItemChecked()
.
¿Alguien ha visto esto?
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.habit); habitListView = (ListView)findViewById(R.id.habitsListView); habitListView.setAdapter(mAdapter); habitListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); habitListView.setItemsCanFocus(false); habitListView.setOnItemLongClickListener(new MyOnItemLongClickListener()); habitListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (habitListView.isItemChecked(position)) { // for debugging, returns false here // when CAB isnt up. int h = 2; } // handle differently when CAB is on. if (mMode != null) { if (habitListView.isItemChecked(position)) { // returns true here when CAB is up // but this is the first time I'm // clicking the item habitListView.setItemChecked(position, false); // turn CAB off if this is the last to be unchecked if (habitListView.getCheckedItemIds().length == 0) { mMode.finish(); } } else { habitListView.setItemChecked(position, true); } } else { // start detail/edit view activity } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getSupportMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.menu_create: Habit test = new Habit("FLOSS", "GOOD", "", ""); mDbHelper.createHabitEntry(test); mAdapter.changeCursor(mDbHelper.getAllEntries()); break; } return false; } private class MyOnItemLongClickListener implements OnItemLongClickListener { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { habitListView.setItemChecked(position, true); mMode = startActionMode(new MyActionModeCallback()); return true; } } private class MyActionModeCallback implements ActionMode.Callback { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub return false; } @Override public void onDestroyActionMode(ActionMode mode) { habitListView.setOnItemLongClickListener(new MyOnItemLongClickListener()); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.getMenuInflater().inflate(R.menu.main_long_click_context, menu); habitListView.setOnItemLongClickListener(null); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_delete: long[] selected = habitListView.getCheckedItemIds(); if (selected.length > 0) { for (long id : selected) { mDbHelper.deleteEntry(id); } } mAdapter.changeCursor(mDbHelper.getAllEntries()); mode.finish(); break; } return true; } };
- Elemento de vista de lista de Android que no muestra el color seleccionado
- Haga clic en ImageView dentro de ListView ListItem y obtenga la posición?
- Android lista personalizada con espacio entre los elementos
- ¿Puedo crear Fragment ListActivity con el paquete de compatibilidad v4?
- Android Listview en PopupWindow onitemclick no funciona en algún dispositivo
- Actualizar dinámicamente los tipos de vista de ListView
- Correcto manera de comprobar todas las casillas de verificación en ListView?
- No se puede establecer el margen del elemento en ListView mediante adaptador personalizado
Así que lo que ha funcionado para mí es simplemente utilizar
habitListView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //handle differently when CAB is on. if (mMode != null){ view.setSelected(!view.isSelected()); updateCABtitle(); //turn CAB off if this is the last to be unchecked if (habitListView.getCheckedItemIds().length == 0){ mMode.finish(); } } else { //start detail/edit view activity Intent intent = new Intent(getApplicationContext(), HabitDetailActivity.class); startActivity(intent); } } });
y
private class MyOnItemLongClickListener implements OnItemLongClickListener{ @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { habitListView.setItemChecked(position, true); mMode = startActionMode(new MyActionModeCallback()); updateCABtitle(); return true; } }
Realmente no entiendo por qué setItemChecked()
no funciona para onItemClick()
pero parece ser para onItemLongClick()
. Parece que hay un manejador de clics por defecto que se llama en AbsListView.PerformItemClick()
que debe hacer algunos toggling de check / unchecked o algo.
- ¿Revestimientos Android para Spannable?
- Android – Imagen en botón presionado evento – Aplicar superposición de imagen a todos