Non credo ci sia alcun modo integrato per fare ciò che si sta tentando con la funzionalità integrata di Android. Per eseguire alcuni test, ho iniziato con il codice degli esempi dell'API Android (C:\<android-sdk-directory>\samples\android-15\ApiDemos\src\com\example\android\apis\view\ExpandableList3.java
).
Ho utilizzato ExpandableListView.CHOICE_MODE_SINGLE
. La modalità scelta si applica a qualsiasi cosa sia selezionata o selezionata View
. (Il codice sorgente ExpandableListView
dice che determina il numero di elementi possono essere selezionato in una sola volta, ma in ListView
, sembra applicarsi a ciò che è controllato.) Si noti inoltre che il dottore dice che non si può ottenere un risultato valido da getCheckedItemPosition
per a ListView
in modalità scelta singola. Questo sembra essere vero.
I miei test hanno mostrato che ExpandableListActivity
non rende automaticamente selezionato o selezionato l'elemento selezionato/toccato, né attribuisce automaticamente il focus al figlio cliccato. Solo lo ExpandableListActivity
stesso e il gruppo che detiene l'elemento figlio sono focalizzati auotmaticamente dopo aver fatto clic su uno dei figli.
Ecco un po 'del mio codice (in gran parte preso dagli esempi Android):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String NAME = "NAME";
final String IS_EVEN = "IS_EVEN";
List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
for (int i = 0; i < 12; i++) {
Map<String, String> curGroupMap = new HashMap<String, String>();
groupData.add(curGroupMap);
curGroupMap.put(NAME, "Group " + i);
curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even" : "This group is odd");
List<Map<String, String>> children = new ArrayList<Map<String, String>>();
for (int j = 0; j < 12; j++) {
Map<String, String> curChildMap = new HashMap<String, String>();
children.add(curChildMap);
curChildMap.put(NAME, "Child " + j);
curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child is odd");
}
childData.add(children);
}
SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
this,
groupData,
android.R.layout.simple_expandable_list_item_1,
new String[] {NAME, IS_EVEN},
new int[] {android.R.id.text1, android.R.id.text2},
childData,
R.layout.child,
new String[] {NAME, IS_EVEN},
new int[] {android.R.id.text1, android.R.id.text2}
);
ExpandableListView expListView = (ExpandableListView)findViewById(android.R.id.list);
setListAdapter(adapter);
expListView.setChoiceMode(ExpandableListView.CHOICE_MODE_SINGLE);
expListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expListView, View viewClicked, int groupPosition, int childPosition, long childRowId) {
viewClicked.setSelected(true); // the only way to force a selection of the clicked item
Nota l'ultima riga, che costringe il bambino cliccato per avere uno stato selezionato. È quindi possibile utilizzare un XML selector
con un elenco di stati Drawable
per evidenziare l'elemento selezionato quando è selezionato. (Questo non funziona completamente - più su quello sotto.)
All'interno onChildClick
nel mio ExpandableListActivity
, ho fatto alcuni test e trovato il seguente:
groupPosition; // index of group within the ExpandableListViewActivity
childRowId; // for my particular ExpandableListView, this was the index of the child in the group
childPosition; // for my particularExpandableListView, this was also the index of the child in the group
expListView.getCheckedItemPosition(); // null - from ListView class
expListView.getSelectedView(); // null - from AbsListView class
expListView.getSelectedItemId(); // a long, based on the packed position - from AdapterView class
expListView.getSelectedId(); // -1 - from ExpandableListView class, calls getSelectedPosition()
expListView.getSelectedPosition(); // -1 - from ExpandableListView class, calls getSelectedItemPosition()
expListView.getSelectedItemPosition(); // -1 - from AdapterView class
expListView.getFocusedChild(); // null - from ViewGroup class
expListView.getItemIdAtPosition(1); // a long (View ID) - from AdapterView class
viewClicked.isFocused()); // false
viewClicked.isPressed()); // false
viewClicked.isSelected()); // true only if we explicitly set it to true
expListView.isFocused()); // true
expListView.isPressed()); // false
expListView.isSelected()); // false
expListView.getCheckedItemPosition())); // -1 - from ListView
expListView.getSelectedId())); // -1 - from ExpandableListView
/* expListView.getChildAt(childPosition) is not helpful, because it looks at the rendered
LinearLayout with a bunch of TextViews inside it to get the index and find the child,
and you won't generally know where to look for the child you want */
Ho provato anche la creazione di una nuova OnItemClickListener
e attuare il suo metodo onItemClick
. Anche se la documentazione suggerisce che onItemClickListener
funzionerà in qualche modo su ExpandableListView
s, non l'ho mai visto chiamare.
La prima cosa che ho provato a cambiare il colore di sfondo sull'elemento figlio scelto e tenerlo evidenziato non ha funzionato bene. Ho impostato uno Drawable
per android:state_window_focused="true"
all'interno del file XML selector
. Ha funzionato in qualche modo, ma ha presentato diversi problemi.
La seconda cosa che ho provato è stata selezionare esplicitamente l'elemento premuto in onChildClick
chiamando viewClicked.setSelected(true);
. I problemi qui erano minori:
1) Se si scorreva fino a quando l'elemento evidenziato era fuori visualizzazione e si ritornava ad esso, l'evidenziazione era scomparso, 2) Lo stesso accadrebbe se avessi ruotato il telefono, e 3) Lo stato l'elemento evidenziato non veniva più selezionato non appena non era più visibile sul display.
L'Android ExpandableListView
apparentemente non era pensato per funzionare come un menu di navigazione a sinistra in stile fisarmonica, anche se questo sembra un uso abbastanza ovvio. Se vuoi usarlo in questo modo, penso che dovrai fare una buona dose di personalizzazione e scavare nel modo in cui vengono disegnati gli View
s.
Buona fortuna.
La mia risposta è stata utile? C'è una ragione per cui non l'hai contrassegnata come la risposta accettata? – hotshot309
Sì, è stato molto utile grazie (mi dispiace ho dimenticato di votare). Continuerò a contrassegnarlo come la risposta accettata nel caso in cui qualcuno condivida un modo di crescere a casa per ottenere l'effetto che sto cercando. Grazie ancora! – Scott