我正致力于创建应用程序以从文本文件中读取歌词。有没有办法最小化这个代码,因为交换机案例可以达到数百?
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;
答案 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
数组(假设R
是R.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);
亲切的问候