Come in, gli ELEMENTI di un ListView possono essere frammenti. So che puoi assegnare un XML TextView a un ListView per cambiare il suo aspetto, ma puoi aggiungere Frammenti in un ListView.Un ListView può contenere frammenti
Ad esempio: ho un frammento. L'XML di detto frammento contiene un ImageView, un paio di TextViews di grandi dimensioni e un TextView di piccolo stile. Il codice classe Fragment riceve un pacchetto, quindi in base ai contenuti popola di conseguenza TextView e ImageView. Sia il Fragment XML che il Fragment codice funzionano senza problemi (Posso visualizzare un Frammento singolo bene). Ho un FragmentActivity in cui voglio visualizzare l'elenco di Fragments di cui sopra. Ecco il codice che sto usando per cercare di popolare il ListView all'interno di vista del FragmentActivity:
ArrayList<Fragment> fragList = new ArrayList<Fragment>();
Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
Bundle bundle = new Bundle();
bundle.putInt("key", 0);
fragment.setArguments(bundle);
fragList.add(fragment);
ArrayAdapter<Fragment> adapter = new ArrayAdapter<Fragment>(this, R.layout.tile_item, fragList);
listItems.setAdapter(adapter);
Ecco il mio modo di pensare su questo. Faccio un ArrayList of Fragments per contenere tutte le mie viste istanziate. Creo quindi un frammento, creo un pacchetto, aggiungo dati al pacchetto (in modo che il frammento possa effettuare il marshalling dei dati nelle sue viste correttamente), aggiungi il pacchetto al frammento, quindi aggiungi il frammento alla lista degli array. Dopo di ciò, creo un ArrayAdapter, aggiungo il layout degli elementi che voglio usare e l'elenco dei Frammenti che ho creato; quindi impostare ListView per leggere dal mio adattatore.
Chiunque esegua questo codice otterrà probabilmente NPE @ che istanzia l'ArrayAdapter. Cosa dà? È possibile? Prima che continui a tormentarmi, qualcuno può dirmi se sto solo perdendo il mio tempo? C'è un modo migliore? Stavo pensando di usare una ScrollView, ma tanta parte della funzionalità di un ListView dovrebbe essere nuovamente implementata e odio-odio-odiare reinventando la ruota quando non è necessario.
Grazie a chiunque stia leggendo, e soprattutto grazie per i vostri pensieri se decidete di lasciarli. Ho provato a cercare in giro una risposta affermata a questo, ma tutto quello che mi sembra di trovare sono domande/pagine web riguardanti l'uso di una ListView INSIDE di un frammento; non usare Frammenti COME GLI ELEMENTI di un ListView
Modifica: ho preso i suggerimenti di seguito e ho iniziato a indagare di più. Dal modo in cui appaiono le cose dovrei essere in grado di usare un adattatore personalizzato che gonfia i frammenti invece di costruire semplicemente da XML (per mancanza di un modo migliore per descrivere il processo) Tuttavia, la mia attuale implementazione sta lanciando un NPE quando provo a impostare l'adattatore.
Ecco il mio codice adattatore personalizzato (abbreviato per brevità):
public class AdapterItem extends ArrayAdapter<Fragment> {
Context c;
List<Fragment> f;
public AdapterItem(Context c, List<Fragment> f) {
super(c, R.layout.tile_item, f);
this.c = c;
this.f = f;
}
@Override
public View getView(int pos, View v, ViewGroup vg) {
LayoutInflater i = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return i.inflate(R.layout.tile_item, vg, false);
}
}
e qui è come sto attuazione:
ArrayList<Fragment> fragList = new ArrayList<Fragment>();
Fragment fragment = Fragment.instantiate(this, TileItem.class.getName());
Bundle bundle = new Bundle();
bundle.putInt("key", 0);
fragment.setArguments(bundle);
fragList.add(fragment);
AdapterItem adapter = new AdapterItem(this, fragList);
adapter.add(fragment);
listItems.setAdapter(adapter);
quindi è stato un paio di giorni e sono abbastanza sicuro che questo thread è stato sepolto. Tuttavia, ho pensato di aggiungere un ultimo aggiornamento nel caso qualcuno volesse provare questo e una ricerca su Google li porta qui. Quindi nella mia implementazione sto ricevendo un NPE quando ListView riceve l'adattatore. Non ci vuole un chirurgo di razzo per capire che è certamente l'adattatore e non il ListView a lanciare l'errore. Per la vita di me non riesco a capire perché però ...
In ogni caso, penso di avere qualche idea però. Prima, una piccola storia passata: un po 'di tempo fa stavo cercando di fare FrammentTransactions all'interno di un FragmentDialog. Ogni volta che ho provato a farlo, avrei ottenuto un NPE. Alla fine, attraverso molte ricerche, ho scoperto che la ragione riguardava il modo in cui i Frammenti sono istanziati. Quando viene chiamato un frammento ha bisogno del contesto dal suo genitore. Poiché il genitore di una finestra di dialogo è l'attività che lo ha avviato, la finestra di dialogo stessa non ha soddisfatto i criteri necessari.Credo che quando si tenta di aggiungere frammenti a un ListView, questo è anche il caso. Dal momento che il ListView non soddisfa l'accordo con l'istanziamento di un frammento getta l'NPE e, quindi, mi lascia sospeso e tornare alle convenzioni. D @ mn ... avevo davvero sperato che sarei stato in grado di farlo. Usare Frammenti invece di semplici XML avrebbe reso molto più facile organizzare/cercare nella lista. Oh beh ... suppongo che non possa essere fatto nel caso qualcuno si stia chiedendo.
Perché anche * vuole * frammenti di essere "ELEMENTI di un ListView"? Gli sviluppatori hanno creato 'ListView's per anni senza che i loro elementi fossero frammenti. Cosa ti aspetti di guadagnare dal farli diventare frammenti? – CommonsWare
Bene, per esempio mi aspetto di poter mostrare più di una semplice TextView all'interno di una lista (infatti sarò in grado di mostrare un'immagine e alcune righe di testo in più). Inoltre, sarò in grado di riutilizzare il codice frammento più e più volte da diverse attività senza duplicare il codice. Ho anche visto elenchi a scorrimento di elementi più dinamici di una semplice TextView (come gli elenchi di Google Play, sono più complessi di un semplice TextView). Come si ottiene? Lo stesso effetto non sarebbe possibile (più facile) usando un frammento? – user1449018
Puoi farlo utilizzando l'adattatore e le viste personalizzate gonfiati da XML per le tue righe. –