按字母顺序排列枚举上的一些项目(不是全部)

时间:2013-06-23 16:47:34

标签: java android

我正在开发一个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成为第一项?

3 个答案:

答案 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}}本地化。