Ho implementato un codice di rilevamento dei gesti in modo da poter rilevare quando una riga nella mia listview (che si trova in un FrameLayout) è stata strisciata.Come ottenere la posizione (sullo schermo) della riga in listview
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
int itemId = MainActivity.this.getListView().pointToPosition((int) e1.getX(),(int) e1.getY());
Offer order = (Offer)MainActivity.this.getListView().getAdapter().getItem(itemId);
View v = MainActivity.this.getListView().getChildAt(itemId);
}
}
voglio visualizzare una vista sopra la parte superiore della riga strisciato con una serie di opzioni sensibili al contesto per quella riga.
miei problemi è che i seguenti metodi:
v.getTop()
v.getBottom()
ritorno valori corretti solo prima che la vista è stato fatto scorrere. Probabilmente potrei fare qualche calcolo per calcolare gli offset usando le posizioni di scorrimento ecc. Ma ho anche notato che ottengo solo valori quando faccio scorrere una riga che è visibile sullo schermo per cominciare. Se faccio scorrere verso il basso l'elenco e poi faccio scorrere una riga (che non era originariamente fuori dallo schermo), questi metodi restituiscono valori nulli.
I metodi indicati sembrano soffrire dello stesso problema ...
v.getLocationOnScreen(loc)
v.getLocationInWindow(loc)
In definitiva, sto cercando di trovare la distanza tra la parte superiore del listView visibile e la fila che è stato fregato. Quindi userò questa distanza per aggiungere una vista al FrameLayout genitore con il padding dell'altezza appropriato (in modo che copra la riga strisciata).
Qualsiasi aiuto sarebbe molto apprezzato!
Grazie per la risposta. In realtà non sto tenendo traccia degli oggetti vista. In fase di esecuzione, ottengo dinamicamente la fila quando viene strisciata. Quindi faccio le chiamate sopra per cercare di capire la sua posizione sullo schermo. Non sto cambiando la riga stessa Voglio semplicemente visualizzare una vista sopra la parte superiore della riga. Ho un listener di scorrimento che rimuove la nuova vista non appena si scorre di nuovo l'elenco. Una dimostrazione della funzione può essere vista in questa demo di tweetie 2 per iPhone: http://www.youtube.com/watch?v=Vxjj3F5MCpQ#t=1m12s – Damian
Potresti approfondire come si ottiene dinamicamente una sospensione della riga in fase di esecuzione, quando viene strisciata? –
Utilizzo di GestureDetector e GestureListener in ListView. Ho aggiornato lo snippet di codice sopra per includere il metodo onFling (e params) che viene chiamato quando un utente fa scorrere il dito sulla lista. Alcune semplici operazioni matematiche vengono utilizzate per verificare che l'utente stia scorrendo da sinistra a destra, quindi pointToPosition viene utilizzato per trovare a quale riga corrisponde il passaggio. – Damian