我正在尝试在我的应用程序的列表中实现菜单(打开活动和对话框),就像以前这样做的其他应用程序一样(例如 Google Play 上的“类别”列表等等)。我注意到这并不像我想象的那样简单。
我想到的是创建两个列表,一个用于操作名称,第二个用于图标。然后使用SimpleAdapter
将它们连接到列表中的项目。并且在onItemClicked
事件上,做一个巨大的switch-case段,并执行每个item需要做的动作。
我认为这不是正确的做法。有不同的方法(而且更简单)可以做到这一点?
我正在尝试在我的应用程序的列表中实现菜单(打开活动和对话框),就像以前这样做的其他应用程序一样(例如 Google Play 上的“类别”列表等等)。我注意到这并不像我想象的那样简单。
我想到的是创建两个列表,一个用于操作名称,第二个用于图标。然后使用SimpleAdapter
将它们连接到列表中的项目。并且在onItemClicked
事件上,做一个巨大的switch-case段,并执行每个item需要做的动作。
我认为这不是正确的做法。有不同的方法(而且更简单)可以做到这一点?
是的你可以:
1.使用反射调用方法 - 并将方法设置为项目的标签。然后项目单击从 View 的标签中获取方法。
1.1.或者你可以使用方法的字符串名称,然后调用我的代码:
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。然后从这个隐藏的 textView 方法名称(作为字符串)中单击项目。当然,在您需要为此 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);