我正在尝试在我的应用程序中实现列表中的菜单(打开活动和对话框),就像之前执行此操作的其他应用程序一样(例如Google Play上的“类别”列表等等)。我注意到这并不像我想的那么简单。
我想到的是创建两个列表,一个用于动作名称,第二个用于图标。然后使用SimpleAdapter
将它们连接到列表中的项目。在onItemClicked
事件中,要做一个巨大的switch-case段,并执行每个项目需要执行的操作。
我认为这不是正确的做法。有不同的方法(并且更简单)吗?
答案 0 :(得分:1)
是的,你可以:
1.使用反射来调用方法 - 并将方法设置为项目的标记。然后项目cliked从View的标签获取Method。
1.1。或者你可以使用方法的String名称,然后调用我的代码:
public static Object makeNativeApiFunctionCall(Object target, String functionName, Object... parameters) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Object responseObject;
Method method = target.getClass().getMethod(functionName, parameters.getClass());
responseObject = method.invoke(target, new Object[]{parameters});
return responseObject;
}
2.对于这种最佳方式,使用BaseAdapter并使用自己的项目类型(如
class MyListMenuItem{
String methodName;
String title;
Integer imgResource;
}
3.此外,您可以在项目的XML布局中使用SimpleAdapter和一个隐藏的textView。然后点击item从这个隐藏的textView名称中获取方法(如String)。当然你需要为此textView名称设置方法。
它会:
String[] texts = { "sometext 1", "sometext 2" };
int[] images = { R.id.img1, R.id.img2};
String methods={"Method1","Method2"};
ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(
texts.length);
Map<String, Object> m;
for (int i = 0; i < texts.length; i++) {
m = new HashMap<String, Object>();
m.put(ATTRIBUTE_NAME_TEXT, texts[i]);
m.put(ATTRIBUTE_NAME_METHOD, methods[i]);
m.put(ATTRIBUTE_NAME_IMAGE, images[i]);
data.add(m);
}
String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_METHOD,
ATTRIBUTE_NAME_IMAGE };
int[] to = { R.id.tvText, R.id.hiddenTextView, R.id.ivImg };
SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.item,
from, to);
lvSimple = (ListView) findViewById(R.id.lvSimple);
lvSimple.setAdapter(sAdapter);