我正在开发一个Android应用程序,我将使用statureString
按字母顺序排列的Spinner中显示此枚举。
public enum Stature
{
noSelected (-1, MSDApplication.getAppContext().getString(R.string.no_selected)),
tall (0, MSDApplication.getAppContext().getString(R.string.stature_tall)),
average(1, MSDApplication.getAppContext().getString(R.string.stature_average)),
small(2, MSDApplication.getAppContext().getString(R.string.stature_small));
private final int stature;
private final String statureString;
Stature(int anStature, String anStatureString) { stature = anStature; statureString = anStatureString; }
public int getValue() { return stature; }
@Override
public String toString() { return statureString; }
public static Stature[] getSortedVaules()
{
Stature[] statures = values();
Arrays.sort(statures, EnumByToStringComparator.INSTANCE);
return statures;
}
}
private static class EnumByToStringComparator implements Comparator<Enum<?>>
{
public static final Comparator<Enum<?>> INSTANCE = new EnumByToStringComparator();
public int compare(Enum<?> enum1, Enum<?> enum2)
{
return enum1.toString().compareTo(enum2.toString());
}
}
以下是我如何将此枚举设置为Spinner
的ArrayAdapter:
private void setSpinStatureData()
{
mSpinStature.setAdapter(new ArrayAdapter<Stature>(mActivity, android.R.layout.simple_dropdown_item_1line, Stature.getSortedVaules()));
}
正如你所看到的那样,Enum上的第一个项目是noSelected
,我需要它始终是Spinner上的第一个项目,下一个项目将按字母顺序排序。
我使用statureString
因为此var将被本地化。
如何让noSelected成为第一项?
答案 0 :(得分:0)
声明一个比较器,它将noSelected情况考虑在内,并使它始终小于它所比较的任何东西。
private static class StatureComparator implements Comparator<Stature>
{
public static final StatureComparator INSTANCE = new StatureComparator();
public int compare(Stature first, Stature second)
{
if(first == Stature.noSelected)
return -1;
else if(second == Stature.noSelected)
return 1;
else
return first.toString().compareTo(second.toString());
}
}
答案 1 :(得分:0)
a)很明显,但很明显我必须打印出来。使您的getSortedValues()
方法只返回已经排序的数组。
public Stature[] getSortedValues() {
if (mySortedArray == null) {
mySortedArray = new Stature{noSelected, small...}
}
return mySortedArray.clone();
}
b)实施java.util.Comparator
,定义您想要的顺序并使用它而不是EnumByToStringComparator.INSTANCE
答案 2 :(得分:0)
根据Lesleh回答,我这样做了:
private static class EnumByNameComparator implements Comparator<Enum<?>>
{
public static final Comparator<Enum<?>> INSTANCE = new EnumByNameComparator();
public int compare(Enum<?> enum1, Enum<?> enum2)
{
if (enum2.toString().equals(MSDApplication.getAppContext().getString(R.string.no_selected)))
return Integer.MAX_VALUE;
else if (enum1.toString().equals(MSDApplication.getAppContext().getString(R.string.no_selected)))
return Integer.MIN_VALUE;
else
return enum1.toString().compareTo(enum2.toString());
}
}
我有几个Enums
所有noSelected
项,现在我可以使用这个比较器。
而且,我与toString()
进行比较,因为我设置了Enum
的{{1}}本地化。