首页 > 解决方案 > 如何以一种智能的方式(以及超过 100 个项目)创建这个 Android 自定义“复选框”,如选择?

问题描述

我正在尝试为此布局创建项目选择逻辑。基本上每个项目都充当一个复选框。从理论上讲,选择的想法非常简单,您单击一个项目 - 被选中,再次单击它 - 被取消选择,单击另一个项目 - 新项目被选中,旧项目被取消选中。基本上你不能选择多个。

更重要的是,每次勾选一个项目,圆角矩形背景从白色(不可见)变为蓝色并带有波纹效果(我已经有这个背景资源用XML制作),然后文本颜色也从蓝色变为白色对比背景,并且图标的资源图像更改为白色对应物(在下图中,它不会导致我忘记添加它,但账单图标应该更改为白色 PNG 计数器部分)。

我正在寻找的是具有最少行数的智能代码,可用于 100 多个不同项目的列表。对于这样的选择也是一个更好的 XML 布局。我最初对线性布局中的项目进行了硬编码,我知道这是一种不适用于许多元素的廉价方式。

在此处输入图像描述

这是我为此编写的代码,我尝试在列表中添加每个文本和图标(包括它们的 XML ID)并动态更改它们,但我需要一个比我更好的解决方案。

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

同样,即使我也知道代码底部的布尔值非常不专业,我需要更好的选择代码。谢谢你。

标签: javaandroidxmlselection

解决方案


推荐阅读