我有一个ListView,可点击的组件包含超过25个项目。我想要实现的是当点击列表中的一个项目时,它会将您发送到与该项目相关的活动。
例如: 在列表中:狗种,猫种,鹿种
当" Cat Species"单击:打开有关不同种类猫的信息的活动。
既然我在列表中有很多项目,我不想创建几十个意图但是想要使用一个字符串(通过点击指定的项目收到的字符串)来创建一个意图并开始与该项目相关的活动。
所以我的问题是:如何将字符串转换为意图? 换句话说:我怎样才能获得字符串" Cat Species"进入课程项目" CatSpecies.class"?然后可以用来启动另一个活动的意图。
这里代码部分使用:
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item value (including spaces): "Cat Species"
String speciesValue = (String) listView.getItemAtPosition(position);
// Name of the class, spaces removed: "CatSpecies"
speciesValue = speciesValue.replace(" ", "");
// Converts the speciesValue string into a .class: CatSpecies.class
Class<?> speciesString = null;
if (speciesValue != null) {
try {
speciesString = Class.forName(speciesValue);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Starts the intent to the provided String: CatSpecies.class
Intent speciesActivity = new Intent(this, speciesString);
startActivity(speciesActivity);
}
});
答案 0 :(得分:0)
您可以初始化Map<String, Class>
并使用它来获得您想要的内容,例如
Map<String, Class> map;
private void init() {
map = new HashMap<String, Class>;
map.put(ITEM_CAT, CatSpecies.class);
....
}
然后致电
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// ListView Clicked item value (including spaces): "Cat Species"
String speciesValue = (String) listView.getItemAtPosition(position);
Class clazz = map.get(speciesValue);
// Starts the intent to the provided String: CatSpecies.class
Intent speciesActivity = new Intent(this, clazz);
startActivity(speciesActivity);
}
});
这是一个快速解决方案,但如果可扩展,则为idk。
无论如何,为了使您的代码有效,您还应该传递您正在处理的包。
因此,例如,如果CatSpecies
与此类位于同一个包中,则应该具有类似
Class<?> speciesString = null;
if (speciesValue != null) {
try {
speciesString = Class.forName(this.getPackage() + speciesValue);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然而,这也很容易出错。
在我看来,最好的解决方案是让你的适配器扩展BaseAdapter
,并覆盖getItem
。在适配器内部,您可以访问所有类,所以
Class[] classes = new Class[] { CatSpecies.class, DogSpecies.class}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return classes[arg0];
}
那么,就这样,你可能会有像
这样的东西@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String speciesValue = (String) listView.getItemAtPosition(position);
Class speciesClass = listView.getAdapter().getItem(position);
Intent speciesActivity = new Intent(this, speciesClass );
startActivity(speciesActivity);
}
});