5

Questo non è un problema di codice, interpreto le linee guida come se fosse OK.Creazione di una vista simile a un calendario scorrevole su Android

Ho cercato un modo di costruire una vista a scorrimento infinito simile ad un calendario in Android, ma ho raggiunto un'impasse.

In questo momento il mio dilemma è che la maggior parte delle opinioni simili disponibili hanno i loro figli posizionati l'un l'altro in uno stile ricorrente. Con questo intendo:

l'articolo 4 viene dopo l'articolo 3, che viene dopo l'articolo 2, e c'è un riempimento/margine costante tra tutti gli articoli.

Quello che mi serve è un modo per produrre una vista scorrevole infinitamente lunga che può contenere o meno elementi. Gli oggetti dovrebbero essere posizionati in posizioni variabili all'interno della vista. Il modo migliore per descrivere una vista simile è un di un giorno simile a un calendario che è infinitamente scorrevole.

Finora le mie due migliori scommesse utilizzano il nuovo RecyclerView con un LayoutManager personalizzato (ciò sembra molto complesso e non ancora perfettamente documentato da Google). Mi piace questo approccio perché, tra le altre cose, è ottimizzato per la visualizzazione di serie grandi in una vista limitata.

La mia altra soluzione sarebbe quella di costruire un View completamente personalizzato. Tuttavia, con questa soluzione, perdo l'adattatore a meno che non costruisca una vista container (che è probabilmente più complessa della costruzione di un gestore di layout).

Come andresti a risolvere un problema del genere? I suggerimenti sono apprezzati, non ho bisogno di esempi di codice, solo idee su quale percorso è il migliore per risolvere questo problema.

Grazie.

Mi scuso se ho frainteso le linee guida

Edit: Come ho risolto questo problema La mia prima soluzione di utilizzare RecyclerView con un decoratore speciale sembrava promettente, ma è rimasto un "hack" in modo che ha deciso di non optare per questa soluzione poiché temevamo le complicazioni che avrebbe creato in futuro.

Per risolvere il problema sono andato con un SurfaceView invece che con un adattatore, questo significa dover riscrivere tutte le funzionalità dell'adattatore per il mio SurfaceView ma sembrava essere il modo migliore per risolvere questo problema di disegno molto personalizzato e gestione del layout per il mio caso d'uso.

Sarebbe comunque bello creare un Viewgroup personalizzato in grado di gestire questo tipo di problemi di layout.

risposta

0

Quello che si sta cercando è un FragmentStatePagerAdapter, in cui è possibile implementare una vista a scorrimento, ovvero quando l'utente (ad esempio) scorre verso destra, viene visualizzata una vista completamente nuova.

Utilizzando uno FragmentStatePagerAdapter, è possibile gestire una quantità enorme di visualizzazioni senza sovraccaricare la memoria, poiché questo specifico PagerAdapter mantiene solo gli stati delle viste e viene esplicitamente pensato per gestire ampie serie di viste.

Mantenendo l'esempio di un calendario, è possibile implementare la navigazione a scorrimento tra ad esempio settimane e generare le visualizzazioni settimanali su richiesta mantenendo solo per esempio l'anno e il numero della settimana come identificatori.

Ci sono un sacco di tutorial online per Android, forse hai uno sguardo al this uno

+1

Penso che tu abbia frainteso il mio obiettivo un po ', è colpa mia perché avrei dovuto includere uno schizzo di quello che sto cercando di capire. Ma grazie per il feedback. – Andreas

6

ListView e ListAdapter si basano su un elenco fisso, quindi la corrente infinite-scroller solo continuare ad aggiungere sempre più dati alla fine della lista.

Ma quello che vuoi è scroller simile all'app Google Calendar che ha uno bidirezionale scroller infinito. Il problema con l'utilizzo di ListView e ListAdapter in questo caso è che se si aggiungono i dati nella parte anteriore dell'elenco, l'indice di qualsiasi elemento cambia in modo che l'elenco salti.

Se davvero inizi a pensare a questo dal punto di vista MVC, ti rendi conto che lo ListAdapter non fornisce un modello adatto a questa esigenza.

Invece di avere l'indicizzazione assoluta (cioè 1, 2, 3, 4, ecc.), Quello che vuoi veramente è l'indicizzazione relativa, quindi invece di dire "Dammi l'articolo all'indice 42" vuoi dire "ecco un oggetto, dammi i cinque oggetti prima di esso ". O hai qualcosa come una data di calendario che è assoluta; tuttavia — a differenza della memoria del dispositivo — non ha effettivamente né inizio né fine, quindi quello che vuoi veramente qui è una "finestra" in una sezione di quei dati.

Un modello di dati migliore per questo sarebbe una sorta di coda a doppio attacco che è in parte una cache di LRU. Hai posto un limite al numero di elementi nella struttura. Quindi, quando gli articoli precedenti vengono caricati (l'utente sta scorrendo verso l'alto), gli elementi sul back-end vengono spinti e quando vengono aggiunti articoli successivi (l'utente sta scorrendo verso il basso), gli elementi nella parte anteriore vengono spinti.

Inoltre, si avrebbe una soglia in cui, se si è all'interno di alcuni elementi di un lato della struttura, un evento "loadNext" o "loadPrevious" si attiva e richiama una richiamata che si imposta per inviare più dati sul bordo della struttura.

Quindi una volta capito che il tuo modello è completamente diverso, ti rendi conto che anche RecyclerView non ti aiuterà qui perché è legato al modello di indicizzazione assoluto. È necessaria una sorta di sottoclasse ViewGroup personalizzato che ricicla le visualizzazioni degli articoli come un ListView, ma può adattarsi alla coda a doppio attacco. E quando cerchi un repository di codice per qualcosa di simile, non c'è niente là fuori.

Sembra divertente. Pubblicherò un link quando avrò avviato un progetto. (Purtroppo, non sarà fatta in qualsiasi modo tempestivo per aiutare voi in questo momento, mi dispiace.)

Qualcosa che potrebbe aiutare un po 'prima: guardare implementazione del calendario di Google e vedere come lo hanno fatto: Google Calendar Git repo

+1

Penso che tu capisca il mio dilemma, e io sono sulla stessa pagina di te. Non c'è niente là fuori che fa esattamente questo. Gli esempi di scorrimento "infinito" là fuori si limitano a caricare più oggetti, e non è questo il problema per me - come lei sottolinea in modo eloquente. Mi sembra ancora che, tra le opzioni disponibili al momento, RecyclerView con layoutmanager e itemdecorations siano probabilmente l'opzione migliore prima di tentare di modificare il modo in cui i ViewGroup funzionano su Android. Grazie per l'input. – Andreas

+0

Si potrebbe guardare il codice sorgente per il calendario di Google e vedere come lo hanno fatto - Ho aggiornato la mia risposta. Mi piacerebbe avere qualcosa di più generico in grado di scorrere bidirezionalmente per più di semplici date. –

+0

Chiara spiegazione .. Spero che il team di Android UI costruisca un componente UI per l'adattatore infinito di oggetti con relativo modello di dati. –

Problemi correlati