недавно я написал сцену для отображения того же самого, что и в программе recyclerview в javafx, используя пользовательский просмотр списка.Моя настраиваемая ячейка списка
public class QuestionCell extends ListCell<TestGrammarModel.Question> {
private HBox content;
private HBox choose;
private Text question;
private RadioButton optionA;
private RadioButton optionB;
private RadioButton optionC;
private RadioButton optionD;
private Text ans;
private Text key;
private Text number;
private VBox vBox;
private ToggleGroup group;
private boolean isSummitted;
public QuestionCell(boolean isSummitted){
super();
question = new Text();
optionA = new RadioButton();
optionB = new RadioButton();
optionC = new RadioButton();
optionD = new RadioButton();
number = new Text();
content = new HBox(number, question);
choose= new HBox( optionA, optionB ,
optionC ,optionD);
HBox.setMargin(optionA, new Insets(60, 70, 30, 70));
HBox.setMargin(optionB, new Insets(60, 70, 30, 70));
HBox.setMargin(optionC, new Insets(60, 70, 30, 70));
HBox.setMargin(optionD, new Insets(60, 70, 30, 70));
group = new ToggleGroup();
optionB.setToggleGroup(group);
optionA.setToggleGroup(group);
optionC.setToggleGroup(group);
optionD.setToggleGroup(group);
choose.setAlignment(Pos.CENTER);
vBox = new VBox(content, choose);
vBox.setSpacing(10);
this.isSummitted = isSummitted;
}
public ToggleGroup getGroup() {
return group;
}
@Override
protected void updateItem(TestGrammarModel.Question item, boolean empty) {
super.updateItem(item, empty);
if (item !=null && !empty ){
//set text
question.setText(item.getQuestion());
optionA.setText("A: "+item.getOptionA());
optionB.setText("B: "+item.getOptionB());
optionC.setText("C: "+item.getOptionC());
optionD.setText("D: "+item.getOptionD());
//set font
optionA.setFont(Font.font(18));
optionB.setFont(Font.font(18));
optionC.setFont(Font.font(18));
optionD.setFont(Font.font(18));
question.setFont(Font.font(18));
number.setFont(Font.font(18));
//set user date
optionA.setUserData(item.getOptionA());
optionB.setUserData(item.getOptionB());
optionC.setUserData(item.getOptionC());
optionD.setUserData(item.getOptionD());
number.setText(String.valueOf(item.getNumber()) + ": ");
setGraphic(vBox);
//when user did not click on Submit button
if (!isSummitted){
group.selectedToggleProperty().addListener((obs, oldSel, newSel) -> {
if (group.getSelectedToggle() != null) {
if (group.getSelectedToggle().getUserData() != null ){
if (optionA.isSelected())
answer.get(selectedIdx)[getIndex()] = "A";
else if (optionB.isSelected())
answer.get(selectedIdx)[getIndex()] = "B";
else if (optionC.isSelected())
answer.get(selectedIdx)[getIndex()] = "C";
else
answer.get(selectedIdx)[getIndex()] = "D";
System.out.println(answer.get(selectedIdx)[getIndex()]);
}
System.out.println(group.getSelectedToggle().getUserData().toString());
//get topic's index is selected
}
if (answer.get(selectedIdx)[getIndex()].equals(item.getKey())){
answer.get(selectedIdx)[answer.get(selectedIdx).length -2] =
Integer.toString(Integer.parseInt(answer.get(selectedIdx)[answer.get(selectedIdx).length -2 ])+1);
answer.get(selectedIdx)[answer.get(selectedIdx).length -1] =
Integer.toString(Integer.parseInt(answer.get(selectedIdx)[answer.get(selectedIdx).length-1]) -1) ;
}
});
}
}else { setGraphic(null);
}
}
Я устанавливаю здесьCellFactory:
listView.setCellFactory(param -> new QuestionCell(false));
Когда я щелкаю первую или вторую ячейку в настраиваемом представлении списка, при прокрутке автоматически выбирается конечная ячейка списка.до конца списка.Я пытаюсь отладить и выяснить, что всякий раз, когда я прокручиваю просмотр списка, некоторые элементы списка воссоздаются и обновляются.У меня есть поиск в stackoveflow и получить его Странная переработка ячеек в ListView - JavaFX , но это не может мне помочь.Что я делаю не так?Здесь моя проблема.Когда я выбрал в вопросе 1 вопрос А и прокрутил его вниз, вопрос 7 будет автоматически выбран в ответ на вопрос 1 [https://s31.aconvert.com/convert/p3r68-cdx67/zj9aw-aiag5.gif] [1]