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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top