我正在尝试使用libgdx List小部件来列出arraylist中的所有项目。好吧,实际上我的arraylist是一个对象列表,每个对象都包含一个字符串作为对象" name"。
但是,当我尝试用List显示它们时,它会水平列出,而不是垂直列出。如果我试图显示正常数组的内容,它会垂直列出内容。我在课堂上实现了屏幕。
例如,
ArrayList<String> PartyListEntries = new ArrayList<>();
private List PartyList = new List(skin);
PartyListEntries.add("ham");
PartyListEntries.add("hag");
PartyListEntries.add("ham");
PartyList.setItems(PartyListEntries);
table.setFillParent(true);
table.top().left().padTop(10).padLeft(10);
table.add(PartyList);
stage.addActor(table);
这表明:[火腿,火腿,火腿]
但是如果我创建一个String数组并且数组内容为{&#34; ham&#34;,&#34; hag&#34;,&#34; ham&#34; }
然后显示
[火腿]
[HAG]
[火腿]
水平(没有换行符)。
这是我的第一个问题。我的第二个问题是,当字符串值相同时,它会选择它们。在第二个例子中,如果我将默认选择设置为索引零,则将索引0 [ham]和索引2 [ham]都设置为选中状态。它将对每个与所选内容具有相同值的字符串执行此操作。我......不希望它这样做。我希望他们被视为独特的,因为他们是。
我正在尝试查看List的代码,但说实话,它超越了我。我不知道导致这些问题的原因。我真的可以试着想出来,我可能会花费很长时间,但我想也许你们已经知道造成这种情况的原因了。或者也许可以为我提供一个很好的替代List。
谢谢!
答案 0 :(得分:5)
关于第一个问题:Libgdx小部件只使用你给它的任何对象的toString
方法来制作文本标签。这就是为什么你用list和String数组得到不同的结果。这只是编写每个类的人如何将数组格式化为String的偏好。如果要使用List类,可以将其子类化并将toString
方法更改为您想要的方式,或者您可以创建一个List包装类,该类执行自己的将列表转换为String的方法。
关于第二个问题:这是Java的特点。如果您对字符串进行硬编码(将它们放在带引号的类中的实际代码中),则编译器会将所有匹配的字符串放入String类的单个共享实例中。所以“ham”和“ham”是String的相同实例,是同一个对象。
你可以通过使用像这样的String构造函数包装你的字符串来解决这个问题。 new String("ham")
。这将强制它创建一个单独的String实例。
示例:
String s0 = "a";
String s1 = "a";
String s2 = new String("a");
boolean b0 = s0.equals(s1); //evaluates true
boolean b1 = s0.equals(s2); //evaluates true
boolean b2 = s0==s1; //evaluates true
boolean b3 = s0==s2; //evaluates false
如果在运行时从文件加载字符串,匹配的字符串将是不同的实例。