0

我正在开发一个 Android 应用程序,我有这个枚举,它将显示在一个 Spinner 中,使用statureString.

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());
    }
}

以下是我添加将此枚举设置为 ArrayAdapter 的方法Spinner

private void setSpinStatureData()
{
    mSpinStature.setAdapter(new ArrayAdapter<Stature>(mActivity, android.R.layout.simple_dropdown_item_1line, Stature.getSortedVaules()));
}

如您所见,枚举上的第一项是noSelected,我需要它必须始终是 Spinner 上的第一项,下一项将按字母顺序排列。

我使用statureString是因为这个 var 将被本地化。

如何使 noSelected 成为第一项?

4

3 回答 3

0

a) 很明显,但是太明显了,我必须打印出来。使您的getSortedValues()方法仅将副本返回到已排序的数组。

public Stature[] getSortedValues() {
  if (mySortedArray == null) {
    mySortedArray = new Stature{noSelected, small...}
  }
  return mySortedArray.clone();
}

b)实现一个java.util.Comparator定义你想要的排序并使用它而不是EnumByToStringComparator.INSTANCE

于 2013-06-23T16:53:06.487 回答
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()我设置了本地化。EnumDescription

于 2013-06-24T08:40:36.087 回答
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());
    }
}
于 2013-06-23T16:51:15.473 回答