2013-05-06 24 views
8

Ho un'app che mostra la guida TV per un elenco di canali. La mia interfaccia utente è composta da un sacco di viste personalizzate con diverse larghezze che mostrano i programmi TV, tutte queste viste personalizzate sono aggiunte in una scrollview orizzontale che viene aggiunta a una vista a scorrimento in modo che le mie viste possano scorrere in 2 dimensioni sinistra-destra e superiore- giù. Funziona tutto bene fino a quando non aggiungo molte viste e inizia a rallentare molto. Quindi ho bisogno di un modo per riciclare le visualizzazioni come fa listiew in una scrollview, forse c'è una scrollview personalizzata che fa questo, o qualcuno ha un'idea su come fare questo, è strano che scrollview non è supportato da un adattatore come gridview e listview.viste di riciclaggio in vista di scorrimento

This is how my UI looks

+2

Non è affatto strano. Scorrimento 'ScrollView' ... perché dovrebbero essere supportati da un adattatore? Se vuoi una vista che funzioni con 'Adapter', allora dovresti guardare' AdapterView' e le sue sottoclassi. Infatti, dal suono di esso probabilmente è necessario creare il proprio 'AdattatoreView 'personalizzato. – kabuko

+1

Creare un AdapterView personalizzato suona come un sovraccarico, forse c'è una soluzione più semplice – user924941

+0

Ho fatto qualcosa di simile molto recentemente e, come dici tu, le prestazioni sono orribili. Mi è venuto in mente una volta completato il progetto che avrei potuto ottenere lo stesso risultato con un 'WebView' che visualizzava un file HTML locale. Questo potrebbe non essere abbastanza sofisticato per la tua app se vuoi che ogni programma sia selezionabile, ma ho pensato di parlarne comunque. A proposito, dovrei dire che non ho mai implementato questo approccio e quindi non è stato verificato. –

risposta

7

Ho fatto qualcosa di simile solo le mie viste non erano collegate come le tue ma erano tutte di diverse dimensioni.

Per prima cosa è necessario definire se l'intera area (non solo la schermata di visualizzazione) ha il numero definitivo o dinamico delle viste personalizzate.

Se si dispone del numero definitivo di viste e delle rispettive posizioni, è necessario creare la propria mappa di posizione con l'elenco di Rect (Rect ha una buona funzione se il punto xy appartiene). Quindi definisci il numero massimo di Visualizzazioni visibili sul tuo schermo. Affinché funzioni senza carico costante, dovresti avere le viste visibili massime + almeno una linea di viste del bordo degli oggetti totali. Dopo tutto questo dovresti facilmente avere il tuo sistema di posizionamento in cui carichi le visualizzazioni che sono all'interno del tuo schermo + un po 'di overhead (scopo di questo è che vuoi che i tuoi utenti abbiano transizione fluida mentre scorrono almeno per una certa lunghezza), se tu è necessario caricarne alcuni nello stesso tempo in cui si scaricano (leggere riutilizzo/non disporre di oggetti e crearli su eventiScroll) e posizionarli in base alle proprie esigenze.

E se si desidera determinare quali viste devono essere visibili, basta scorrere l'elenco e chiedere se le viste Rect si intersecano con il proprio Rect dell'area da caricare.

Speranza questa immagine aiuta un po 'di più

Example

So che suona un po' di confusione e di difficile attuazione, ma non ha chiesto una semplice domanda :) Spero che questo aiuti e godetevi la vostra lavoro.

+0

Risposta stupenda. L'hai implementato per caso se puoi condividere il codice? –

+0

Il problema con il codice già utilizzato è il fatto che ti confonderà e molto probabilmente ti allontanerà dalla soluzione. Sentiti libero di mandarmi un messaggio sulla mia email se hai qualche domanda specifica. Questo è un problema logico non basato su codice. –

+0

@ MarkoLazić Come indirizzi la posizione di scorrimento quando rimuovi viste a sinistra? – milosjovac

1

Uno ScrollView che è sostenuta da un adattatore e ricicla vista è un ListView, con un paio di funzioni extra opzionali sulla parte superiore.

Forse vuoi un HorizontalScrollView supportato da un adattatore? La ricerca di HorizontalListView ti darà alcuni risultati, es: https://github.com/dinocore1/DevsmartLib-Android.

+0

Non riesco ad usare listview nella mia situazione e ho provato orizzontaleListView il problema è che ho bisogno di più righe quindi ho usato più HorizontalListViews ma poi ho bisogno che tutti scorrono allo stesso tempo quando si scorre una riga, ho cambiato la classe HorizontalListView così invierà gli eventi di scorrimento con la distanza alle restanti visualizzazioni del listino, ma rimarranno indietro rispetto al primo listview che viene scostato – user924941

+0

Perché non puoi utilizzare un ListView? Un ListView che consuma tutti gli eventi touch e scorre i suoi figli funzionerebbero. È sufficiente ripopolare e ripristinare la posizione di scorrimento di HorizontalScrollViews per ogni riga quando vengono riciclati e – FunkTheMonk

+0

funziona, ma è molto lento e le righe rimanenti rimangono indietro rispetto alla prima riga che scorre, e 2 ° ho 20 righe orizzontali, 20 HorizontalListViews rallenterà qualsiasi telefono molto di più rispetto alla scrollview che ho ora – user924941

Problemi correlati