Как использовать геттер перечисления? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть эта модель объекта с именем расходом Тип:

 public class ExpenseType {

        private String gridText;

        public enum type {
            FOOD(Constants.EXPENSE_TYPE_FOOD, R.drawable.food_blue, R.drawable.food),
            FLOWERS(Constants.EXPENSE_TYPE_FLOWERS, R.drawable.flowers_blue, R.drawable.flowers),
            GROCERIES(Constants.EXPENSE_TYPE_GROCERIES, R.drawable.groceries_blue, R.drawable.groceries),
            HOLIDAY(Constants.EXPENSE_TYPE_HOLIDAY, R.drawable.holiday_blue, R.drawable.holiday),
            PHARMACY(Constants.EXPENSE_TYPE_PHARMACY, R.drawable.pharmacy_blue, R.drawable.pharmacy),
            BILLS(Constants.EXPENSE_TYPE_BILLS, R.drawable.bills_blue, R.drawable.bills),
            CLOTHES(Constants.EXPENSE_TYPE_CLOTHES, R.drawable.clothes_blue, R.drawable.clothes),
            TRANSPORT(Constants.EXPENSE_TYPE_TRANSPORT, R.drawable.transport_blue, R.drawable.transport),
            ITEMS(Constants.EXPENSE_TYPE_ITEMS, R.drawable.items_blue, R.drawable.items),
            OTHERS(Constants.EXPENSE_TYPE_OTHERS, R.drawable.others_blue, R.drawable.others);

            private String expenseKey;
            private int drawableBlue, drawableWhite;

            type(String expenseKey, @DrawableRes int drawableBlue, @DrawableRes int drawableWhite) {
                this.expenseKey = expenseKey;
                this.drawableBlue = drawableBlue;
                this.drawableWhite = drawableWhite;
            }

            public String getKey() {
                return expenseKey;
            }

            public int getDrawableBlue() {
                return drawableBlue;
            }

            public int getDrawableWhite() {
                return drawableWhite;
            }
        }

        public ExpenseType(String gridText) {
            this.gridText = gridText;
        }

        public String getGridText() {
            return gridText;
        }

        public void setGridText(String gridText) {
            this.gridText = gridText;
        }
    }

Строка gridText записывается внутри базы данных, но я не хочу добавлять также доступные для рисования значения в базу данных, поэтому я создалэто перечисление, которое имеет изменяемый вариант.Теперь, в адаптере представления рециркуляции, как я могу получить доступ к getDrawableBlue () из enum, чтобы я мог установить иконку, соответствующую моему costType?

У меня есть этот код в адаптере:

private void checkSelect(ExpenseType expenseType) {
            if(positionSelected == getAdapterPosition()){
                gridIcon.setImageResource(????????);
                return;
            }

Как я могу получить доступ к этому геттеру вместо ????????чтобы я мог получить моё нарисованное значение, хранящееся в этом перечислении?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Это похоже на сбой в дизайне вашего класса.

Ваше перечисление type является вложенным классом в вашем ExpenseType классе. (Примечание: поскольку это enum, это неявно вложенный тип static).

Чтобы вы могли вызывать методы доступа к type, вам нужно как-то ссылаться на его конкретный тип.

Один из способов сделать это - иметь type в качестве поля экземпляра ExpenseType, во многом как String gridText.

Затем вам нужно будет привязать определенный тип type к вашему экземпляру ExpenseType (я знаю, это семантически запутывает, но я не назвал ваши переменные:).

Другими словами, каждый экземпляр ExpenseType имеет свое собственное поле type, назначенное одному типу ... errr .. type.

Таким образом, экземпляр 1 из ExpenseType имеет значение FOOD для своего type, экземпляр 2 из ExpenseType имеет значение FLOWERS для своего type и т. Д.

Затем вы можете добавить геттер и ссылаться на drawableBlue int в checkSelect, вызвав:

// assuming field type can't be null
expenseType.getType().getDrawableBlue()
0 голосов
/ 01 июля 2019

expenseType, по-видимому, относится к типу класса ExpenseType, но перечисление, на которое вы ссылаетесь, это внутреннее перечисление type (которое, должно быть, переименовано).Таким образом, вам нужно либо предоставить поле для type в ExpenseType и получить его для этого, а затем вызвать что-то вроде expenseType.getType().getDrawableBlue(), либо изменить свой код (в зависимости от того, что ExpenseType должно представлять).

Что касается переименования: класс ExpenseType имеет поле gridText, которое может указывать, что оно фактически представляет ячейку.Если это так, я бы предложил сделать что-то вроде этого:

public class ExpenseGridCell {
   private String gridText;

   private ExpenseType type; //that would be your enum tyoe

   public ExpenseType getType() { 
     return type;
   }
}

//I'll move the enum to a separate class which makes it easier to use elsewhere (the outer class would be a "namespace" only anyway)
public enum ExpenseType {
   FOOD(Constants.EXPENSE_TYPE_FOOD,R.drawable.food_blue, R.drawable.food),
   ...;
}

Если gridText не текст ячейки, а одинаковый для каждого типа, то вы можете объединить внутреннее перечисление typeв ExpenseType, то есть что-то вроде этого:

public enum ExpenseType {
   FOOD(Constants.EXPENSE_TYPE_FOOD, "Some grid text for food", R.drawable.food_blue, R.drawable.food),
   ...;

   private String gridText;
   private String expenseKey;
   private int drawableBlue, drawableWhite;

   //appropriate constructor and getters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...