簡體   English   中英

從網格視圖簡化加載繪圖

[英]Simplifying Loading drawables from grid view

我的項目的drawable文件夾中有大量資源,所有這些資源都顯示在GridView ,現在,當用戶從GridView選擇圖像時,該圖像應加載並顯示在屏幕上。 問題是我的班級變得非常大,僅需執行面向“ if”的編程即可知道單擊了哪個圖像。 我相信,有一種使用HashMap等加載資源的更有效的方法。

這是僅一個菜單的一個小示例:

secondList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg20, View arg21, int arg22, long arg23) {
                clearbackground2();
                arg21.setBackgroundResource(R.drawable.fondoselected);
                ((TextView) arg21.findViewById(R.id.textoItem)).setTextColor(Color.parseColor("#8fb5e3"));
                if (arg22 == 0) {
                    final int menuSecondSelected = arg22;
                    txtThirdTitleList.setText("Curvas");
                    thirdList.setAdapter(new SketchMenuSideAdapter((Activity) view.getContext(), getResources().getStringArray(R.array.viaCurva), getResources().obtainTypedArray(R.array.viaCurvaIcon), 3));
                    thirdList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> argTrh20, View argTrh21, int arg22, long arg2Trh3) {
                            if (arg22 == 0) {
                                addNewImage(menuSecondSelected, "1carril", null, null);
                            }
                            if (arg22 == 1) {
                                addNewImage(menuSecondSelected, "2carriles", null, null);
                            }
                            if (arg22 == 2) {
                                addNewImage(menuSecondSelected, "3carriles", null, null);
                            }
                            if (arg22 == 3) {
                                addNewImage(menuSecondSelected, "abierta1", null, null);
                            }
                            if (arg22 == 4) {
                                addNewImage(menuSecondSelected, "abierta2", null, null);
                            }
                            if (arg22 == 5) {
                                addNewImage(menuSecondSelected, "abierta3", null, null);
                            }
                            if (arg22 == 6) {
                                addNewImage(menuSecondSelected, "abierta4", null, null);
                            }
                            if (arg22 == 7) {
                                addNewImage(menuSecondSelected, "abierta5", null, null);
                            }
                            if (arg22 == 8) {
                                addNewImage(menuSecondSelected, "cerrada1", null, null);
                            }
                            if (arg22 == 9) {
                                addNewImage(menuSecondSelected, "cerrada2", null, null);
                            }
                            if (arg22 == 10) {
                                addNewImage(menuSecondSelected, "cerrada3", null, null);
                            }
                            if (arg22 == 11) {
                                addNewImage(menuSecondSelected, "cerrada4", null, null);
                            }
                            if (arg22 == 12) {
                                addNewImage(menuSecondSelected, "cerrada5", null, null);
                            }
                            if (arg22 == 13) {
                                addNewImage(menuSecondSelected, "carril1", null, null);
                            }
                            if (arg22 == 14) {
                                addNewImage(menuSecondSelected, "carril2", null, null);
                            }
                            if (arg22 == 15) {
                                addNewImage(menuSecondSelected, "carril3", null, null);
                            }
                            if (arg22 == 16) {
                                addNewImage(menuSecondSelected, "carril4", null, null);
                            }
                            if (arg22 == 17) {
                                addNewImage(menuSecondSelected, "carril5", null, null);
                            }
                            if (arg22 == 18) {
                                addNewImage(menuSecondSelected, "carril6", null, null);
                            }
                        }
                    });
                }

僅這種菜單就有大約6000行,有人可以建議一種更好的方法嗎?

我建議使用SparseArray 它是Android平台中的一個集合,用於將整數映射到對象。 在功能上,它等於Map<Integer, Object> HashMap(略微)更快,但是SparseArray針對內存使用進行了優化。

這可以提高可讀性,因為您只需定義和填充一次地圖,然后僅用一種方法即可獲得相應的值。

SparseArray<String> menuMap = new SparseArray<>();
menuMap.put(0, "1carril");
menuMap.put(1, "2carril");
menuMap.put(2, "3carril");
menuMap.put(3, "abierta1");
menuMap.put(4, "abierta2");
menuMap.put(5, "abierta3");
menuMap.put(6, "abierta4");
menuMap.put(7, "abierta5");
menuMap.put(8, "carril1");
menuMap.put(9, "carril2");
menuMap.put(10, "carril3");

然后只需在需要的位置獲取映射值:

@Override
public void onItemClick(AdapterView<?> argTrh20, View argTrh21, int arg22, long arg2Trh3) {
    String value = menuMap.get(arg22);
    if(value != null) {
        addNewImage(menuSecondSelected, value, null, null);
    }
}

如果您有足夠的物品,這將是適當的。 這將大大增加您需要該值時的可讀性。 您仍然必須首先將所有對添加到地圖上,但這可以避免(即使是在其他類中)。 您還可以更輕松地更改或添加新值。

在效率方面:您至少應使用if-else或switch語句。 除此之外,它變化不大,如果有足夠的物品,它甚至可能會偏向地圖。 但這不是真正的問題。 可讀性和可維護性比微小的效率差異更為重要。


編輯:它實際上可以更短。 我現在才意識到arg22只是列表中的位置。
首先,適當命名您的參數。 argTrh20argTrh21arg22是可怕的名稱。
但是,由於位置始終在0到某個值之間,因此您可以使用數組。 您不需要將整數映射到值,因為那可以只是數組中的位置。
現在,您可以用更少的行和更少的不必要的代碼來定義它:

String[] menuValues = {"1carril", "2carril", "3carril", "rest here", "..." };

獲取值現在減少為:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    if(position < menuValues.length) { // this is just a defensive check. If you are sure the array is the same length as the max amount of items, this can be omitted.
        addNewImage(menuSecondSelected, menuValues[position], null, null);
    }
}

希望能幫助到你

對於性能,您可以使用開關代替if

為了提高可讀性,所以您的主類不是那么大

為此新建一個班級:

主要:

thirdList.setOnItemClickListener(new clicked())

OnItemClicked類:

public Class clicked implements AdapterView.OnItemClickListener{
public void onItemClick(AdapterView<?> argTrh20, View argTrh21, int arg22, long arg2Trh3) {
                        if (arg22 == 0) {
                            addNewImage(menuSecondSelected, "1carril", null, null);
                        }
                        if (arg22 == 1) {
                            addNewImage(menuSecondSelected, "2carriles", null, null);
                        }
                        if (arg22 == 2) {
                            addNewImage(menuSecondSelected, "3carriles", null, null);
                        }
                        if (arg22 == 3) {
                            addNewImage(menuSecondSelected, "abierta1", null, null);
                        }
                        if (arg22 == 4) {
                            addNewImage(menuSecondSelected, "abierta2", null, null);
                        }
                        if (arg22 == 5) {
                            addNewImage(menuSecondSelected, "abierta3", null, null);
                        }
                        if (arg22 == 6) {
                            addNewImage(menuSecondSelected, "abierta4", null, null);
                        }
                        if (arg22 == 7) {
                            addNewImage(menuSecondSelected, "abierta5", null, null);
                        }
                        if (arg22 == 8) {
                            addNewImage(menuSecondSelected, "cerrada1", null, null);
                        }
                        if (arg22 == 9) {
                            addNewImage(menuSecondSelected, "cerrada2", null, null);
                        }
                        if (arg22 == 10) {
                            addNewImage(menuSecondSelected, "cerrada3", null, null);
                        }
                        if (arg22 == 11) {
                            addNewImage(menuSecondSelected, "cerrada4", null, null);
                        }
                        if (arg22 == 12) {
                            addNewImage(menuSecondSelected, "cerrada5", null, null);
                        }
                        if (arg22 == 13) {
                            addNewImage(menuSecondSelected, "carril1", null, null);
                        }
                        if (arg22 == 14) {
                            addNewImage(menuSecondSelected, "carril2", null, null);
                        }
                        if (arg22 == 15) {
                            addNewImage(menuSecondSelected, "carril3", null, null);
                        }
                        if (arg22 == 16) {
                            addNewImage(menuSecondSelected, "carril4", null, null);
                        }
                        if (arg22 == 17) {
                            addNewImage(menuSecondSelected, "carril5", null, null);
                        }
                        if (arg22 == 18) {
                            addNewImage(menuSecondSelected, "carril6", null, null);
                        }
                    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM