java - 如何以一种智能的方式(以及超过 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;
}
}
});
}
同样,即使我也知道代码底部的布尔值非常不专业,我需要更好的选择代码。谢谢你。
解决方案
推荐阅读
- tensorflow - 使用faster_rcnn_inception_v2_coco_2018_01_28 tensorflow对象检测仅需400步
- html5-canvas - 在画布/ Phaser 3 中创建表格(优先级)
- android - Firebase 基于查询的安全规则不适用于模拟器
- c++ - 简化可扩展的“对数据 Y 执行操作 X”框架
- python - Pandas:根据列表设置值
- reactjs - eslint-plugin-react 使用 Render 返回语法错误
- django - Django中的IP地址超链接
- angular - 如何在 Angular 5 应用程序中使用 Mapbox?
- python - Django - 将 Auth 用户名更改为 Autofield 会破坏代码
- python - pycharm 通过控制台运行代码