Как правильно создать этот пользовательский «флажок» для Android, например, выделение для более чем 100 элементов? - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь создать логику выбора элементов для этого макета.В основном каждый элемент действует как флажок.Теоретически, идея выбора довольно проста: вы нажимаете на элемент один раз - выбираете, нажимаете на него снова - отменяете выбор, нажимаете на другой элемент - выбирается новый, а старый не выбирается.В принципе, вы не можете выбрать более одного.

Что более важно, так это то, что каждый раз, когда вы проверяете элемент, округленный прямоугольный фон меняется с белого (невидимого) на синий с эффектом ряби (у меня уже есть это).фоновый ресурс сделан в XML), затем цвет текста также меняется с синего на белый, чтобы контрастировать с фоном, а также изображение ресурса для значка меняется на белый аналог (на изображении ниже это не означает, что я забыл добавить его,но значок счета должен быть заменен на белую часть счетчика PNG.

Мне нужен интеллектуальный код с минимальными строками, который можно использовать для списка из более чем 100 различных элементов.Также лучший XML-макет для такого выбора.Сначала я жестко закодировал элементы в Linear Layouts и знаю, что это дешевый способ, который не работает со многими элементами.

enter image description here

Это код, который я написал для этого, я попытался добавить каждый текст и значки в списки (включая их идентификаторы XML) и изменить их динамически, ноМне нужно лучшее решение, чем мое.

optionContainers = new LinearLayout[10];
optionTexts = new TextView[10];
optionIcons = new ImageView[10];

drawableBuilderBlue = new int[]{R.drawable.food_blue, R.drawable.flowers_blue, R.drawable.groceries_blue, R.drawable.transport_blue, R.drawable.holiday_blue, R.drawable.bills_blue, R.drawable.clothes_blue, R.drawable.items_blue, R.drawable.pharmacy_blue, R.drawable.others_blue};
drawableBuilder = new int[]{R.drawable.food, R.drawable.flowers, R.drawable.groceries, R.drawable.transport, R.drawable.holiday, R.drawable.bills, R.drawable.clothes, R.drawable.items, R.drawable.pharmacy, R.drawable.others};
idContainers = new String[]{"option_container_1", "option_container_2", "option_container_3", "option_container_4", "option_container_5", "option_container_6", "option_container_7", "option_container_8", "option_container_9", "option_container_10"};
idTexts = new String[]{"option_text_1", "option_text_2", "option_text_3", "option_text_4", "option_text_5", "option_text_6", "option_text_7", "option_text_8", "option_text_9", "option_text_10"};
idIcons = new String[]{"option_icon_1", "option_icon_2", "option_icon_3", "option_icon_4", "option_icon_5", "option_icon_6", "option_icon_7", "option_icon_8", "option_icon_9", "option_icon_10"};
isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;

for (int i = 0; i < idContainers.length; i++) {
    tempC = getResources().getIdentifier(idContainers[i], "id", getPackageName());
    tempT = getResources().getIdentifier(idTexts[i], "id", getPackageName());
    tempI = getResources().getIdentifier(idIcons[i], "id", getPackageName());
    optionContainers[i] = dialog.findViewById(tempC);
    optionTexts[i] = dialog.findViewById(tempT);
    optionIcons[i] = dialog.findViewById(tempI);
    optionContainers[i].setBackgroundResource(R.drawable.white_selection);
    optionTexts[i].setTextColor(Color.parseColor("#9ca5c4"));
    optionTexts[i].setTypeface(SR);
    optionIcons[i].setImageResource(drawableBuilderBlue[i]);

    int finalI = i;
    optionContainers[i].setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            optionContainers[finalI].setBackgroundResource(R.drawable.blue_selection);
            optionTexts[finalI].setTextColor(Color.parseColor("#ffffff"));
            optionIcons[finalI].setImageResource(drawableBuilder[finalI]);
            for(int j = 0; j<finalI; j++)
            {
                optionIcons[j].setImageResource(drawableBuilderBlue[j]);
                optionContainers[j].setBackgroundResource(R.drawable.white_selection);
                optionTexts[j].setTextColor(Color.parseColor("#9ca5c4"));
            }
            for(int k=finalI+1; k<idContainers.length; k++)
            {
                optionIcons[k].setImageResource(drawableBuilderBlue[k]);
                optionContainers[k].setBackgroundResource(R.drawable.white_selection);
                optionTexts[k].setTextColor(Color.parseColor("#9ca5c4"));
            }
            switch (finalI)
            {
                case 0: isFood = true; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 1: isFood = false; isFlowers = true; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 2: isFood = false; isFlowers = false; isGroceries = true; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 3: isFood = false; isFlowers = false; isGroceries = false; isTransport = true; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 4: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = true; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 5: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = true; isClothes = false; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 6: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = true; isItems = false; isPharmacy = false; isOthers = false;
                    break;
                case 7: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = true; isPharmacy = false; isOthers = false;
                    break;
                case 8: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = true; isOthers = false;
                    break;
                case 9: isFood = false; isFlowers = false; isGroceries = false; isTransport = false; isHoliday = false; isBills = false; isClothes = false; isItems = false; isPharmacy = false; isOthers = true;
                    break;
            }
        }
    });
}

Опять же, даже я знаю, что логические значения в нижней части кода крайне непрофессиональны, и мне нужен лучший код для выбора.Спасибо.

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