Sto lavorando alla mia prima app che utilizza RecyclerView e mentre sto facendo grandi progressi, sospetto strongmente che il mio design abbia bisogno di alcuni cambiamenti.
Ho chiesto in più punti nelle ultime settimane per esempi completi di un RecyclerView che legge, aggiorna, inserisce e cancella e sono uscito vuoto quindi sto indovinando la mia strada sulla base di varie osservazioni di passaggio. Penso di aver sbagliato in almeno un paio di aspetti. Se puoi rispondere a queste domande, puoi aiutarmi a tornare in pista.
In primo luogo, vorrei spiegare il più conciso possibile come ho progettato questa app. Immagino che questo ti renda evidente i miei errori:)
My RecyclerView è basato sulle vendite nella piccola azienda in cui lavoro. Ogni vendita comprende un codice cliente, un numero ordine, una data ordine, un numero di biglietti venduti e un nome venditore. Il mio progetto utilizza un listener per reagire a un FAB (FloatingActionBar) e, se premuto, passa a un'attività Aggiungi che richiede all'utente le informazioni necessarie per creare una nuova vendita. Nessuna informazione è passata a questa attività perché nessuna è necessaria. L'attività Aggiungi convalida i dati e, quando l'utente preme un pulsante Aggiungi, i nuovi dati tornano alla mia attività principale. L'attività principale inserisce una riga in una tabella MySQL remota tramite uno script PHP richiamato da un AsyncTask nella mia app. Al ritorno dal database, se l'inserto ha funzionato (potrebbe non riuscire se si trattasse di un record duplicato), aggiungo le informazioni al mio ArrayList e notifyItemInserted nel metodo onPostExecute (). Tutto sembra funzionare bene anche se ottengo sempre due copie della nuova vendita in RecyclerView. La prossima volta che lo schermo si aggiorna però - quando faccio un altro Aggiungi, Aggiorna o Rimuovi - la vendita duplicata scompare.
Ogni elemento nel mio RecyclerView contiene tutte le informazioni per una vendita, più due immagini cliccabili, una destinata all'Editing (è una matita blu) e una destinata a Rimuovere (è un bidone della spazzatura rosso). Se l'utente desidera modificare quella vendita, fa clic sulla matita blu; se vuole eliminarlo, fa clic sul bidone della spazzatura rosso. Io uso gli ascoltatori per determinare quale immagine è stata cliccata.
Quando qualcuno fa clic sul grafico Modifica, avvio un'attività Modifica, passando le informazioni dalla vendita esistente a quella attività. L'attività visualizza le informazioni e l'utente può modificare uno dei cinque campi. Tutte le modifiche vengono convalidate e, se tutte le convalide hanno esito positivo, le informazioni modificate vengono passate all'attività principale che aggiorna la riga esistente nel database nel metodo doInBackground () di un AsyncTask. Se l'aggiornamento ha esito positivo, provo a modificare le informazioni nel mio ArrayList e notifyItemChanged in onPostExecute (). Questo fallisce sempre.
Quando qualcuno fa clic sull'icona Rimuovi, avvio un'attività Rimuovi, passando le informazioni dalla vendita esistente a quella attività. L'attività visualizza le informazioni e l'utente può solo premere Rimuovi per confermare che la vendita deve essere rimossa o premere Annulla per interrompere la rimozione. Se si preme Rimuovi, le informazioni della vendita vengono passate a MainActivity che rimuove la riga esistente nel database nel metodo doInBackground () di un AsyncTask. Se l'eliminazione del database ha esito positivo, provo a eliminare l'elemento da ArrayList e quindi notifyItemRemoved in onPostExecute (). Questo fallisce sempre.
Come puoi vedere, le opzioni Modifica e Rimuovi falliscono ogni volta. Il motivo è che esiste una indexOutOfBoundsException rispetto alla posizione utilizzata nel tentativo di modificare o rimuovere l'elemento da ArrayList.
Ora che hai una comprensione della situazione, posso finalmente porre le mie domande specifiche:
- È ragionevole / appropriato usare Attività per eseguire il lavoro che ho descritto per Aggiungere, Modificare e Rimuovere processi in primo luogo o farei meglio a renderli frammenti?
- È appropriato eseguire l'attività del database e l'aggiustamento di ArrayList nell'attività principale o dovrei lasciare che le attività Aggiungi, Modifica e Rimuovi (o frammenti se è meglio) eseguano il lavoro?
Penso che il mio problema fondamentale sia che il mio codice non può "vedere" tutto ciò che deve vedere nel punto in cui sta facendo il suo lavoro. Penso di aver bisogno di riprogettare un po 'le cose per far funzionare meglio l'app.
RecyclerView sembra essere piuttosto fondamentale quindi voglio assicurarmi di scrivere tutto correttamente. Infatti, data l'assenza di buoni esempi che mostrano un RecyclerView che ha tutte le funzionalità che sto descrivendo, mi piacerebbe scrivere un tutorial o fare una serie di video che mostra la mia app finita con tutte le parti critiche spiegate in modo che altri possano impara da esso.