Sto tentando di avere una ListView
personalizzata fatta di Cell
personalizzata in base a un elenco personalizzato objects
.Fabbrica di celle personalizzate JavaFX con oggetti personalizzati
L'oggetto personalizzato è il nome classe chiamata Message
che contiene un paio di campi per il messaggio contenuti, destinatario, timestamp e stato (leggere, inviata ecc).
Dopo aver guardato a questa domanda: Customize ListView in JavaFX with FXML ho successo:
- creato un ListView con cellule personalizzati dove il disegno cella è definita in un file di FXML;
- associato a un controller in modo che i dati di ciascuna cella possano essere riempiti con l'elemento corrente della raccolta;
Tuttavia, non sono riuscito a collegare entrambi: non riesco a trovare un modo in modo che la voce corrente del ListView viene inviato il controller cella.
Ecco il mio codice per la fabbrica delle cellule e il riempimento ListView di elementi:
final ObservableList observableList = FXCollections.observableArrayList();
observableList.setAll(myMessages); //assume myMessage is a ArrayList<Message>
conversation.setItems(observableList); //the listview
conversation.setCellFactory(new Callback<ListView<Message>, ListCell<Message>>() {
@Override
public ConversationCell<Message> call(ListView<Message> listView) {
return new ConversationCell();
}
});
E ora, la classe ConversationCell:
public final class ConversationCell<Message> extends ListCell<Message> {
@Override
protected void updateItem(Message item, boolean empty) {
super.updateItem(item, empty);
ConversationCellController ccc = new ConversationCellController(null);
setGraphic(ccc.getView());
}
}
non posso mostrare il ConversationCellController ma tutto quello che posso dire , questo è dove (nel suo costruttore) carico il file FXML che progetta la cella e quindi posso riempire i valori con l'oggetto Messaggio specificato.
Il metodo getView()
restituisce il riquadro radice che contiene la cella ora piena e progettata.
Come ho già detto, il lavoro di progettazione, ma io non riesco a collegare gli elementi ListView con il CellFactory perché nel metodo
protetta updateItem vuoto (oggetto del messaggio, booleano vuoto)
vuoto è impostato su true e l'articolo è effettivamente null.
Cosa posso fare per fare in modo che funzioni?
'vuoto' è impostato su true su tutte le istanze? una cella è considerata vuota se non ha alcun oggetto, cioè è solo lì per riempire lo spazio sotto le celle effettive. Se il tuo ListView è abbastanza grande da mostrare 10 elementi ma ne hai solo 3, avrai 7 oggetti 'ConversationCell' che sono vuoti. Per inciso, non riesco a vedere dove 'ConversationCellController' dovrebbe ottenere l'oggetto. Se si è certi che si ottenga 'empty = true' su celle con dati reali, potrebbe essere utile se si riuscisse a trovare un esempio minimo che mostri questo problema. – Itai
Penso che l'implementazione di 'ListView' crea inizialmente abbastanza celle per riempire il display e chiama' updateItem (null, true); 'su tutte loro, quindi chiama' updateItem (...) 'su quelle non vuote, con i dati appropriati (anche se non ne sono certo, e non ho il tempo di scavare il codice sorgente in questo momento). In ogni caso, tutte le implementazioni di celle devono gestire il caso di cella vuota. –
"Non riesco a mostrare il ConversationCellController" Perché no? –