¿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 .

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; } }; 

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.

  • Android ListView y OnClickListener: Cómo obtener el elemento seleccionado
  • Cómo traducir el lienzo y seguir recibiendo los eventos táctiles en los lugares correctos
  • Configuración del color de fondo de los elementos ListView en el botón
  • La mejor manera de reordenar elementos en Android 4 + ListView
  • ¿Cómo resaltar el elemento seleccionado en ListView?
  • Vinculación de fragmentos en listview
  • Guardar y volver a cargar ListView utilizando las preferencias compartidas
  • OnTouchListener evita comentarios visuales
  • El contenido del adaptador ha cambiado pero ListView no recibió una notificación, nada actualizado en el fondo
  • Colocar ViewPager como una fila en ListView
  • ¿Hay una manera de permitir que el usuario seleccione el texto de muchos `EditText`s en una fila (que están en ListView)?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.