0

私は Android アプリを開発しています。この列挙型は、 を使用してアルファベット順に並べられたスピナーに表示されます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()));
}

ご覧のとおり、Enum の最初の項目は、noSelectedこれが常に Spinner の最初の項目でなければならず、次の項目はアルファベット順に並べられる必要があります。

statureStringこの var はローカライズされるため、使用します。

noSelected を最初の項目にするにはどうすればよいですか?

4

3 に答える 3

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ます。Description

于 2013-06-24T08:40:36.087 に答える