Mehrfachauswahl im benutzerdefinierten ListView mit CAB

Nachdem ich tagelang gelesen und versucht habe, gebe ich auf und bat um Hilfe.

<Edit> Ich benutze ActionBarSherlock. </ Edit>

  • Lokalisierung Android
  • Skia Decoder deklariert Remote Stream nicht
  • Integer.parseInt und NumberFormatException auf Android
  • Circle Overlay Fill Farbe nicht immer auf Google Maps v2 gezeichnet
  • Android canvas drawText set Schriftgröße von der Breite?
  • ZXing, wie man QR-Code und 1D Barcode scannt?
  • Was ich erreichen möchte: Ein ListView mit einem benutzerdefinierten Layout für jede Zeile, wo der Benutzer mehrere Listenelemente auswählen kann. Ein ausgewähltes Listenelement sollte eine andere Hintergrundfarbe haben. Wenn mindestens ein Element ausgewählt ist, sollte eine Kontext-Aktionsleiste (CAB) angezeigt werden. Es sollte mehr oder weniger wie die mehrfache Auswahl von E-Mails in der GMail App aussehen. Der einzige Unterschied besteht darin, dass in der Google Mail-App die Auswahl getroffen wird, indem man auf das Kontrollkästchen einer Zeile klickt, während ich kein Checkbox haben möchte, aber eine Zeile sollte egal auswählen, wo der Benutzer klickt. Mehrfachauswahl in GMail App

    Was ich versuchte: Nach diesem Tutorial , mit einem Checkable Zeilen-Layout mit einigen Logik, um die Hintergrundfarbe zu ändern, wenn der Check-Status umgeschaltet wurde, habe ich alles funktioniert, außer dass ich keinen Klick-Listener wie OnItemClickListener auf dem ListView registrieren konnte, um das CAB anzuzeigen . Weder bietet man einen Klick-Listener für jede Zeile an View geholfen, weil dies verhindert, um die Hintergrundfarbe der ausgewählten Elemente zu ändern. Ich habe auch versucht, ein MultiChoiceModeListener zu dem ListView hinzuzufügen

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { //.. }); 

    Mit dem gleichen Ergebnis, keine Hintergrundfarbe ändern.

    Was ich suche : Ein Tipp oder ein Tutorial oder Beispielcode, wie dies zu tun ist. Wenn Sie einige Code-Snippets benötigen, um zu helfen, lass es mich wissen.

  • Wie kann man überprüfen, ob der Benutzer mit FB SDK 4.0 für Android angemeldet ist?
  • Wie man ein animiertes GIF aus JPEGs in Android (Entwicklung)
  • TargetApi nicht berücksichtigt
  • Bekommen Akku-Level bei Android-Widget
  • IllegalArgumentException beim Hinzufügen von Cloud Messaging-API zu GoogleApiClient
  • Android ormlite like () Funktion funktioniert nicht
  • 3 Solutions collect form web for “Mehrfachauswahl im benutzerdefinierten ListView mit CAB”

    Sehen Sie, ob der Code Ihnen hilft (es ist im Grunde eine ListActivity mit einem benutzerdefinierten Adapter, um den Status der geprüften Elemente (+ unterschiedlicher Hintergrund) zu halten):

     public class CABSelection extends ListActivity { private ArrayList<String> mItems = new ArrayList<String>(); private SelectionAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for (int i = 0; i < 24; i++) { mItems.add("Name" + i); } // R.layout.adapters_cabselection_row is a LinearLayout(with green // background(#99cc00)) that wraps an ImageView and a TextView mAdapter = new SelectionAdapter(this, R.layout.adapters_cabselection_row, R.id.the_text, mItems); setListAdapter(mAdapter); getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { private int nr = 0; @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.cabselection_menu, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { StringBuilder sb = new StringBuilder(); Set<Integer> positions = mAdapter.getCurrentCheckedPosition(); for (Integer pos : positions) { sb.append(" " + pos + ","); } switch (item.getItemId()) { case R.id.edit_entry: Toast.makeText(CABSelection.this, "Edited entries: " + sb.toString(), Toast.LENGTH_SHORT).show(); break; case R.id.delete_entry: Toast.makeText(CABSelection.this, "Deleted entries : " + sb.toString(), Toast.LENGTH_SHORT).show(); break; case R.id.finish_it: nr = 0; mAdapter.clearSelection(); Toast.makeText(CABSelection.this, "Finish the CAB!", Toast.LENGTH_SHORT).show(); mode.finish(); } return false; } @Override public void onDestroyActionMode(ActionMode mode) { nr = 0; mAdapter.clearSelection(); } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { if (checked) { nr++; mAdapter.setNewSelection(position, checked); } else { nr--; mAdapter.removeSelection(position); } mode.setTitle(nr + " rows selected!"); } }); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { l.setItemChecked(position, !mAdapter.isPositionChecked(position)); } private class SelectionAdapter extends ArrayAdapter<String> { private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); public SelectionAdapter(Context context, int resource, int textViewResourceId, List<String> objects) { super(context, resource, textViewResourceId, objects); } public void setNewSelection(int position, boolean value) { mSelection.put(position, value); notifyDataSetChanged(); } public boolean isPositionChecked(int position) { Boolean result = mSelection.get(position); return result == null ? false : result; } public Set<Integer> getCurrentCheckedPosition() { return mSelection.keySet(); } public void removeSelection(int position) { mSelection.remove(position); notifyDataSetChanged(); } public void clearSelection() { mSelection = new HashMap<Integer, Boolean>(); notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views v.setBackgroundColor(Color.parseColor("#99cc00")); //default color if (mSelection.get(position) != null) { v.setBackgroundColor(Color.RED);// this is a selected position so make it red } return v; } } } 

    Die R.layout.adapters_cabselection_row ist ein benutzerdefiniertes Layout für die Zeile (eine sehr einfache) mit einem grünen Hintergrund:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#99cc00" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/the_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ffffff" android:textSize="17sp" android:textStyle="bold" /> </LinearLayout> 

    R.menu.cabselection_menu ist eine Menü-Datei mit 3 Optionen (bearbeiten, löschen, beenden Sie die CAB), die nichts tun, außer Pop ein Toast mit einer Nachricht über die ausgewählten Zeilen:

     <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/edit_entry" android:icon="@android:drawable/ic_menu_edit" android:title="Edit!"/> <item android:id="@+id/delete_entry" android:icon="@android:drawable/ic_menu_delete" android:title="Delete!"/> <item android:id="@+id/finish_it" android:icon="@android:drawable/ic_menu_crop" android:title="Get me out!"/> </menu> 

    Ich denke, der einfachste Weg ist zu bewerben

    android:background="android:attr/activatedBackgroundIndicator"

    Um welches jemals Layout ist das, das du klickst.

    Dies markiert das Layout bei der Auswahl

     listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    Arbeitete für mich sowieso

    Mit ActionBarSherlock ist der in Luksprog's Antwort verwendete MultiChoiceModeListener noch nicht verfügbar, wenn du den API Level <11 unterstützen möchtest.

    Ein Workaround ist, den onItemClickListener zu verwenden.

    Liste Setup:

     listView = (ListView) timeline.findViewById(android.R.id.list); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setItemsCanFocus(false); listView.setAdapter(new ListAdapter(getActivity(), R.layout.cleaning_list_item, items)); 

    Listener von ListFragment oder ListActivity:

     @Override public void onListItemClick(ListView l, View v, int position, long id) { SparseBooleanArray checked = listView.getCheckedItemPositions(); boolean hasCheckedElement = false; for (int i = 0; i < checked.size() && !hasCheckedElement; i++) { hasCheckedElement = checked.valueAt(i); } if (hasCheckedElement) { if (mMode == null) { mMode = ((SherlockFragmentActivity) getActivity()).startActionMode(new MyActionMode()); mMode.invalidate(); } else { mMode.invalidate(); } } else { if (mMode != null) { mMode.finish(); } } } 

    Wo MyActionMode eine Implementierung von ActionMode.Callback ist:

     private final class MyActionMode implements ActionMode.Callback { /* ... */ } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.