Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cambiar ListView choiceMode de singleChoice a multipleChoiceModal

Tengo un ListView que normalmente es el singleChoice choiceMode . Cuando el usuario presiona largo tiempo en un elemento, quiero entrar en un modo de acción que permite seleccionar varios elementos para que puedan realizar una acción en cualquier elemento seleccionado.

Soy capaz de configurar el ListView para que esté en el modo singleChoice y el usuario es capaz de seleccionar elementos de la lista para mostrar un fragmento de detalles junto a él y tener el elemento de la lista se muestra en su estado activado.

También puedo configurar el ListView para que esté en el choiceMode multipleChoiceModal y realizar una pulsación larga en un elemento inicia el modo de acción y permite varias selecciones, pero ahora el ListView no permitirá una sola selección en el modo normal (sin acción modo).

¿Cómo puedo tener un ListView que está en el modo singleChoice y luego la transición al modo multipleChoiceModal cuando un elemento se presiona durante mucho tiempo?

Este es el más cercano que he sido capaz de llegar a:

  1. singleChoice modo ListView en singleChoice
  2. OnItemLongClickListener de ListView y en ese oyente:
    1. OnItemLongClickListener de ListView en null
    2. Establecer el choiceMode de ListView a multipleChoiceModal
    3. Call view.performClick() en el elemento que se pulsó durante mucho tiempo.

Este enfoque tiene un par de problemas.

  1. El modo de acción no se inicia hasta que la segunda vez presiono un elemento.
  2. Cuando llamo a getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); onDestroyActionMode Obtengo un java.lang.StackOverflowError porque ese método termina tratando de destruir el modo de acción también (pero aún no hemos vuelto de la destruir).

  • WebView loadDataWithBaseUrl - problema extraño en android 4.0.3
  • Cómo hacer que mi proyecto sea compatible con diferentes versiones de sdk mientras utiliza funciones para una versión específica
  • Mejores prácticas / patrones de diseño de codificación para Android
  • Tema del holo del uso en Android <
  • Android 4.0 / ICS - Icono de la aplicación en la barra de acciones no se puede hacer clic
  • Cómo detectar los clics de botón del sistema "Aplicaciones recientes" (Honeycomb +)
  • ¿Por qué no puedo obligar a una de mis Vistas a renderizarla en el software?
  • WebView en Android ICS, problemas de iframe con android_assets
  • 2 Solutions collect form web for “Cambiar ListView choiceMode de singleChoice a multipleChoiceModal”

    Utilicé esto en uno de mis programas

    Nosotros el ListView.CHOICE_MODE_MULTIPLE_MODAL entonces lv.setMultiChoiceModeListener(new ModeCallBack());

      public class ModeCallBack implements ListView.MultiChoiceModeListener{ View mSelectView; TextView mSelectedCount; ArrayList<Long> mCheckedItems; @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); SharedPreferences.Editor edit = pref.edit(); if(item.getItemId() == R.id.bowler_delete){ for(int i=0; i<mCheckedItems.size(); i++){ long id = mCheckedItems.get(i); getActivity().getContentResolver().delete(BowlersDB.CONTENT_URI,BowlersDB.ID+"="+id,null); } }else if(item.getItemId() == R.id.bowler_add_ball){ if(mCheckedItems.size() > 1){ Toast.makeText(getActivity(),"Can only add bowling balls to one bowler at a time",Toast.LENGTH_SHORT).show(); }else{ edit.putLong(Preferences.BOWLER_SELECTED_FOR_BALL,mCheckedItems.get(0)).commit(); ListFragment lf = new ManufacturersList(); FragmentTransaction ft; ft = getFragmentManager().beginTransaction(); ft.replace(R.id.frameOne, lf).addToBackStack(null).commit(); //mRemover.rFragment(); } }else if(item.getItemId() == R.id.add_bowler_to_team){ for(int i=0; i<mCheckedItems.size(); i++){ long id = mCheckedItems.get(i); ContentValues values = new ContentValues(); values.put(TeamBowlers.BOWLER_ID,id); values.put(TeamBowlers.TEAM_ID,pref.getLong(Preferences.TEAM_SELECTED,1)); getActivity().getContentResolver().insert(TeamBowlers.CONTENT_URI, values); } FragmentManager fm = getFragmentManager(); fm.popBackStack(); } mode.finish(); return true; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflate = getActivity().getMenuInflater(); if(fromTeam){ inflate.inflate(R.menu.bowlers_team_action_menu, menu); }else{ inflate.inflate(R.menu.bowler_action_menu, menu); } if(mSelectView == null){ mSelectView = (ViewGroup)LayoutInflater.from(getActivity()).inflate(R.layout.select_count_layout,null); mSelectedCount = (TextView)mSelectView.findViewById(R.id.count_tv); } if(mCheckedItems == null){ mCheckedItems = new ArrayList<Long>(); } mode.setCustomView(mSelectView); return true; } @Override public void onDestroyActionMode(ActionMode mode) { mCheckedItems = null; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { if(mSelectView == null){ mSelectView = (ViewGroup)LayoutInflater.from(getActivity()).inflate(R.layout.select_count_layout,null); mSelectedCount = (TextView)mSelectView.findViewById(R.id.count_tv); } if(mCheckedItems == null){ mCheckedItems = new ArrayList<Long>(); } return true; } @Override public void onItemCheckedStateChanged(ActionMode mode, int position,long id, boolean checked) { final int count = lv.getCheckedItemCount(); mSelectedCount.setText(String.valueOf(count)); if(checked){ mCheckedItems.add(id); }else{ mCheckedItems.remove(id); } } } 

    Esto permite la sola opción solo click del listview y la selección múltiple del tecleo largo. Todo esto se extrajo de la aplicación de mensajería ICS para que pueda navegar por ella también

    Realmente parecía awkard este cambio de modo de elección ya que no hay solución limpia y simple que podría google. HFM (tener fe hombre) y KISS (mantener simple estúpido) ayudó;)

    1.start en la opción del solo modo y fije a todos los oyentes (esto se hace donde usted fija el adaptador de la lista)

     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setOnItemLongClickListener(liListener); listView.setMultiChoiceModeListener(mcListener); 

    2.implementar las interfaces para cambiar entre los modos de elección. El TRUCO para hacer que funcione es volver al modo de elección única fuera de la implementación, es decir, DESPUÉS de destruir el modo de acción !! Así que simplemente use una bandera simple para marcar la destrucción de CAB. Otro TRUCO es devolver onItemLongClick falso para que el modo de elección tenga tiempo de entrar en efecto.

     private OnItemLongClickListener liListener = new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); isCABDestroyed = false; return false; // so this action does not consume the event!!! } }; private MultiChoiceModeListener mcListener = new MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { final int checkedCount = listView.getCheckedItemCount(); switch (checkedCount) { case 0: mode.setSubtitle(null); break; case 1: mode.setSubtitle("One item selected"); break; default: mode.setSubtitle("" + checkedCount + " items selected"); break; } } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.delete: //do your action command here mode.finish(); return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { isCABDestroyed = true; // mark readiness to switch back to SINGLE CHOICE after the CABis destroyed } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } }; 

    3.Aquí está el interruptor de nuevo

      @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); if(isCABDestroyed) { listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //do your action command here } l.setItemChecked(position, true); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.