SingleChoiceMode bei einer ListActivity funktioniert nicht

  • Antworten:5
  • Bentwortet
Gian U.
  • Forum-Beiträge: 117

23.12.2010, 20:36:09 via Website

Hallo

Ich will, dass der User in meiner ListActivity einen bestimmten Eintrag auswählen kann und dann per Menu damit etwas machen kann (bearbeiten, löschen, etc.). Die onCreate()-Methode sieht so aus:

1@Override
2 public void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4
5 mModel = new VocabularyModel(this);
6
7 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
8 mListAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_single_choice, mModel.getAllLists(), new String[] {ListTbl.TITLE}, new int[] {android.R.id.text1});
9 this.setListAdapter(mListAdapter);
10 this.registerForContextMenu(getListView());
11 }

Wenn ich aber später per getListView().getSelectedPosition() den gewählten Eintrag abrufen will, funktioniert das irgendwie nicht. Ich bekomme immer INVALID_POSITION zurück, obwohl etwas ausgewählt ist.

Hatte schon mal jemand ein ähnliches Problem und kann mir helfen?

Vielen Dank für eure Bemühungen
Gian Ulli

Mnemono - Efficient learning!

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

24.12.2010, 08:16:49 via Website

Ich habe den Choicemode noch nie bei SingleChoice Listen gesetzt.

Interessant wäre der Code rund um das Auslesen. Du machst das im onListItemClick() und erhältst die Position frei Haus geliefert. Oder wie/wo machst Du das?

Frohe Weihnachten
Harald


Nachtrag: Je länger ich darüber nachdenke desto mehr glaube ich das ein Gedankenfehler Deinerseits existiert. Kann aber auch sein das ich Deine Anforderungen nicht verstehe. Sei also gnädig mit mir.

Du schreibst das Du alle Aktivitäten durch das Kontextmenü der ListView initiierst. In diesem Fall benötigt man keine SingleChoice ListView. Es reicht dazu eine normale ListView (z.B. SimpleListItem...) und onListItemClick(). Du zeigst eine Liste an, der Benutzer klickt lang auf einen Eintrag und das Kontextmenü erscheint. Durch das Drücken eines Kontextmenü Eintrags passiert dann etwas.

Eine SingleChoice benutzt man wenn der Benutzer etwas auswählen kann und dann z.B. noch zusätzlich auf einen Knopf drückt (z.B. auf einem Detail Dialog mit einem Ok Knopf zum Speichern der Daten).

Meines Erachtens ist das in den Android 2.2 Einstellungen an manchen Stellen ebenfalls uneinheitlich gelöst. Dabei ist das in den IBM CUA Richtlinien (der Umgang mit dem Benutzer durch die UI ;-)) aus den 80er Jahren des letzten Jahrhunderts so schön geregelt...

— geändert am 24.12.2010, 11:08:34

Antworten
Gian U.
  • Forum-Beiträge: 117

25.12.2010, 10:37:19 via Website

Ich will die Aktionen nicht im Contextmenu öffnen sonder mit dem "normalen" menu, das über den Menubutton zu erreichen ist. Das Problem habe ich aber gelöst: Ich habe einfach einen OnItemClickListener implementiert und speichere den gewählten Eintrag in einer Variabel ab, die ich dann weiter verwenden kann.

Gruss Gian

Mnemono - Efficient learning!

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

25.12.2010, 18:25:22 via Website

Schon das Du es hinbekommen hast.

Ich bin von Kontextmenüs ausgegangen da dies der natürliche Weg für Aktionen ist die einen Listeneintrag betreffen. Stell Dir mal 1000 Einträge in der Liste vor. Dann hättest Du theoretisch 1000 zusätzliche Views (die RadioButtons) in der Liste. Das wäre eine ziemliche Verschwendung. Gut das Android die Listen-Views recycled ;-)

Frohe Weihnachten
Harald

Antworten
Gian U.
  • Forum-Beiträge: 117

26.12.2010, 13:36:58 via Website

In den UI-Guidelines von Google steht, dass man alle Aktionen eines Kontextmenüs auch anders erreichbar machen muss. Ich habe daher eine SingleChoice-Liste programmiert. Aber wenn ich so darüber nachdenke, werde ich sie wohl entfernen bzw. ersetzen und die Aktionen aus einer anderen Activity erreichbar machen...

Vielen Dank für deinen Gedankenanstoss

Gian

Mnemono - Efficient learning!

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

26.12.2010, 18:52:27 via Website


In den UI-Guidelines von Google steht, dass man alle Aktionen eines Kontextmenüs auch anders erreichbar machen muss.

Ja klar, aber nicht in der selben Activity - dafür baust Du ja auch noch zusätzlich eine Details-Activity ein, oder?

Hier die Passage die wahrscheinlich zu der Aussage führte:

Also note, as shown in the following screenshot, the Context menu and the next screen both hold the same complete set of commands that can be performed on this contact. The Context menu displays the commands in a list, while the "View contact" activity splits them into various items in the Options menu, icon buttons and list items.

Because of this duplication, using the Context menu is considered a shortcut for going to the next screen and performing the operation there. Context menus are less discoverable than either buttons fixed on-screen or the Options menu. Many users never discover or use Context menus. It is for this reason that, for the most part, any command on a Context menu should also appear on the most intuitive operation's screen.


Das bedeutet das das Kontextmenü üblicherweise die selben Einträge enthält wie die darauf folgende Activity (nicht die selbe Activity). Falls der Benutzer das Kontextmenü nicht in Betracht zieht führt ein simpler Klick zur Detailseite des angeklickten Listeneintrags und dort sind dann noch mal die selben Menüeinträge - diesmal aber als Optionsmenü.Genau das meine ich ja. Wenn Du es genau so machst benötigst Du die Radiobuttons in der Liste nach wie vor nicht.

Der intuitive Weg ist der einfache Klick auf einen Listeneintrag der die Detailseite startet und dort dann alle möglichen Aktionen im Optionsmenü anbietet. Das ist von Google gewünscht. Das Kontextmenü ist dann für den mehr erfahreneren Anwender der länger auf den Listeneintrag klickt, das Kontextmenü erhält und von dort die Aktionen sehr schnell feuert. Damit ist alles abgedeckt.

Ich persönlich baue eigentlich alle Anwendungen genau so. Leider schlunze ich das manchmal - unser Gespräch hat mich aber darin bestärkt das noch mal nachzuziehen. Danke dafür.

Gruß
Harald

— geändert am 26.12.2010, 19:13:08

Antworten