最小化开关盒

时间:2014-08-21 15:01:37

标签: java android eclipse

我正致力于创建应用程序以从文本文件中读取歌词。有没有办法最小化这个代码,因为交换机案例可以达到数百?

    int itemPosition=position;
    itemName=song[position];
    Intent openViewLyric=new Intent(this, ViewLyric.class);

    switch(itemPosition)
    {
        case 0:
            openViewLyric.putExtra("song", itemName);
            openViewLyric.putExtra("resid", R.raw.above_all);
            startActivity(openViewLyric);
            break;

        case 1:
            openViewLyric.putExtra("song", itemName);
            openViewLyric.putExtra("resid", R.raw.age_to_age);
            startActivity(openViewLyric);
            break;

        case 2:
            openViewLyric.putExtra("song", itemName);
            openViewLyric.putExtra("resid", R.raw.as_the_deer);
            startActivity(openViewLyric);
            break;

4 个答案:

答案 0 :(得分:3)

您的案例使用不同的数据重复相同的代码。

您可以从Map中提取数据,然后将该代码写入一次。即使使用稀疏数组,地图也能正常工作。如果已知数组相当满,则可以使用基本数组。

例如,如果R.raw是一个枚举类,那么你可以初始化一次:

 private static Map<Integer,R.raw> s_mapPositionToData 
     = new HashMap<Integer,R.raw>();
 static {
     // Fill the map
 }

然后在上面的代码中使用它代替开关:

 int itemPosition=position;
 itemName=song[position];
 R.raw itemRaw s_mapPositionToData.get( position );
 Intent openViewLyric=new Intent(this, ViewLyric.class);

 openViewLyric.putExtra("song", itemName);
 openViewLyric.putExtra("resid", itemRaw );
 startActivity(openViewLyric);

您可以在包含类型的帮助下将itemName放在同一个地图中。例如,您可以声明包含名称和R.raw的类型ExtraSongData,然后将地图声明为Map<Integer,ExtraSongData>

答案 1 :(得分:3)

尽早初始化R数组(假设RR.raw.above_all的类型等),将数组中的位置映射到特定的R值。

R[] allRs = new R[] {
    R.raw.above_all,
    R.raw.age_to_age,
    R.raw.as_the_deer
};

然后您可以用以下内容替换整个switch语句:

openViewLyric.putExtra("song", itemName);
openViewLyric.putExtra("resid", allRs[itemPosition]);
startActivity(openViewLyric);

答案 2 :(得分:1)

创建一个查找列表:

private static List<Object> resids = new ArrayList<Object>(){{
  add(R.raw.above_all);
  add(R.raw.age_to_age);
  .
  .
  .
}}

当您需要使用它时,您只需致电

 openViewLyric.putExtra("song", itemName);
 openViewLyric.putExtra("resid", resids.get(itemPosition));
 startActivity(openViewLyric);

修改

似乎您唯一的选择是应该使用哪个系列。当我首先选择列表时,我将基于definitively more maintainable而不是数组的事实来支持列表,并且Map结构对于您的目的来说太多了(假设itemPosition总是小于或等于列表大小)。

答案 3 :(得分:0)

为什么不用所有值填充地图。这可以在构造函数,onCreate方法甚至静态方法中完成:

Map<Integer, Integer> songsMapping = new HashMap<Integer, Integer>();
songsMapping.put(0, R.raw.above_all);
songsMapping.put(1, R.raw.age_to_age);
songsMapping.put(2, R.raw.as_the_deer);

请注意,songsMapping必须是一个字段才能初始化

然后你的代码会变成这样的东西:

int itemPosition=position;
Intent openViewLyric=new Intent(this, ViewLyric.class);
openViewLyric.putExtra("song", song[position]);
openViewLyric.putExtra("resid", songsMapping.get(itemPosition));
startActivity(openViewLyric);

亲切的问候