我做了一个“感觉”错误的设计。所以也许你可以告诉我如何更好,或者我的解决方案是不是那么糟糕。
模型是:
我的应用程序中的菜单结构有数据库表。对于主菜单,子菜单等。数据库表如下所示:
CREATE TABLE `main_menu` (
`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`sortIndex` INTEGER,
`intent` TEXT
);
然后在代码中我查询数据库并将所有列信息放入这样的类:
public class MainMenu {
private int id;
private String name;
private int sortIndex;
private String intent;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSortIndex() {
return sortIndex;
}
public void setSortIndex(int sortIndex) {
this.sortIndex = sortIndex;
}
public String toString() {
return this.name;
}
public String getIntent() {
return intent;
}
public void setIntent(String intent) {
this.intent = intent;
}
}
在下一步中,菜单的使用方式如下:
mainMenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Log.e(this.getClass().getName(), "ListItem clicked id:"
+ id);
Intent intent = new Intent();
switch ((int)id) {
case 0:
intent.setAction(values.get(0).getIntent());
break;
case 1:
intent.setAction(values.get(1).getIntent());
break;
case 2:
intent.setAction(values.get(2).getIntent());
break;
case 3:
intent.setAction(values.get(3).getIntent());
break;
case 4:
intent.setAction(values.get(4).getIntent());
break;
case 5:
intent.setAction(values.get(5).getIntent());
break;
case 6:
intent.setAction(values.get(6).getIntent());
break;
}
try{
startActivity(intent);
}catch(Exception e){
Log.e(this.getClass().getName(), e.getMessage());
}
}
});
这个结构的优点是,我可以按照自己的意愿更改菜单项的排序顺序,但我不能将它们放到它们中。在我的情况下,两个菜单项开始相同的活动,但具有不同的标志。所以我绕道而行。我打电话给另一个Activity,用正确的标志从那里开始“真正的”活动。
所以这感觉并不好,但这是我的知识让我做到的唯一方式。除了必须在
中硬编码条目的数量switch(){
case:
}
阻止,当我决定将所有信息都放入数据库时,这并不是我想要的。
答案 0 :(得分:0)
因为您使用行ID来从values
ArrayList获取操作,所以不需要使用switch-case
。只需传递id
来获取ArrayList中的单击项动作:
Intent intent = new Intent();
intent.setAction(values.get((int)id).getIntent());
startActivity(intent);
注意:强>
您的逻辑不清楚为什么使用id
从values
ArrayList获取单击的行数据,因为id
是ListView行的long
id。而不是点击的行的位置。
可能你应该使用position而不是id
来从ArrayList获取动作
Intent intent = new Intent();
MainMenu clickedObject = (MainMenu)adapter.getItem(position);
intent.setAction(clickedObject.getIntent());
startActivity(intent);
确保您在适配器中覆盖getItem
并从中返回values.get(position)
。