Android: accedi alle visualizzazioni figlio da un ListView
-
05-07-2019 - |
Domanda
Devo scoprire la posizione dei pixel di un elemento in un elenco che è stato visualizzato usando un ListView
. Sembra che dovrei ottenere uno dei TextView's e quindi utilizzare getTop ()
, ma non riesco a capire come ottenere una vista figlio di un ListView
.
Aggiornamento: i figli del ViewGroup
non corrispondono 1 a 1 con gli elementi nell'elenco, per un ListView
. Invece, i figli di ViewGroup
corrispondono solo a quelle viste che sono visibili in questo momento. Quindi getChildAt ()
opera su un indice interno al ViewGroup
e non ha necessariamente nulla a che fare con la posizione nell'elenco che ListView utilizza.
Soluzione
Vedi: ListView Android: ottieni l'indice dei dati di oggetto visibile e combinare con parte della risposta di Feet sopra, può darti qualcosa del tipo:
int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);
Il vantaggio è che non stai iterando sui figli di ListView, il che potrebbe subire un calo delle prestazioni.
Altri suggerimenti
Questo codice è più facile da usare:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
Una rapida ricerca dei documenti per la classe ListView ha rivelato i metodi getChildCount () e getChildAt () ereditati da ViewGroup. Puoi iterarli attraverso di loro usando questi? Non sono sicuro, ma vale la pena provare.
Trovato qui
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
View v;
int count = parent.getChildCount();
v = parent.getChildAt(position);
parent.requestChildFocus(v, view);
v.setBackground(res.getDrawable(R.drawable.transparent_button));
for (int i = 0; i < count; i++) {
if (i != position) {
v = parent.getChildAt(i);
v.setBackground(res.getDrawable(R.drawable.not_clicked));
}
}
}
});
Fondamentalmente, crea due Drawable : uno trasparente e un altro il colore desiderato. Richiedi lo stato attivo nella posizione selezionata ( int position
come definito) e cambia il colore di detta riga. Quindi attraversa il ListView
principale e modifica tutte le altre righe di conseguenza. Questo spiega quando un utente fa clic più volte sul listview
. Questo viene fatto con un layout personalizzato per ogni riga in ListView
. (Molto semplice, basta creare un nuovo file di layout con un TextView
- non impostare attivabile o cliccabile!).
Non è richiesto alcun adattatore personalizzato: utilizzare ArrayAdapter
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
Ciò presuppone che tu conosca la posizione dell'elemento in ListView:
View element = listView.getListAdapter().getView(position, null, null);
Quindi dovresti essere in grado di chiamare getLeft () e getTop () per determinare gli elementi sulla posizione dello schermo.