使用 putExtra 为 ListView 动态创建意图?
creating intents dynamically with putExtra for a ListView?
我的设计 "feels" 错了。所以也许你可以告诉我如何改进,或者我的解决方案是否还不错。
型号是:
我的应用程序中有用于菜单结构的数据库表。对于主菜单、子菜单等。数据库表如下所示:
CREATE TABLE `main_menu` (
`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`sortIndex` INTEGER,
`intent` TEXT
);
然后在代码中查询数据库并将所有列信息放入 class 中,如下所示:
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 但具有不同的标志。所以我绕了个弯。我用正确的标志调用另一个 Activity 从那里开始 "real" Activity。
所以这感觉一点都不好,但这是我的知识让我这样做的唯一方式。除了必须在
中硬编码条目数这一事实
switch(){
case:
}
块,当我决定将所有信息放入数据库时,这并不完全是我想要的。
因为您正在使用行 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。而不是被点击的行的位置。
可能您应该使用位置而不是 id
从 ArrayList
获取操作
Intent intent = new Intent();
MainMenu clickedObject = (MainMenu)adapter.getItem(position);
intent.setAction(clickedObject.getIntent());
startActivity(intent);
确保您正在覆盖 Adapter 中的 getItem
并从中返回 values.get(position)
。
我的设计 "feels" 错了。所以也许你可以告诉我如何改进,或者我的解决方案是否还不错。
型号是:
我的应用程序中有用于菜单结构的数据库表。对于主菜单、子菜单等。数据库表如下所示:
CREATE TABLE `main_menu` (
`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`name` TEXT,
`sortIndex` INTEGER,
`intent` TEXT
);
然后在代码中查询数据库并将所有列信息放入 class 中,如下所示:
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 但具有不同的标志。所以我绕了个弯。我用正确的标志调用另一个 Activity 从那里开始 "real" Activity。
所以这感觉一点都不好,但这是我的知识让我这样做的唯一方式。除了必须在
中硬编码条目数这一事实switch(){
case:
}
块,当我决定将所有信息放入数据库时,这并不完全是我想要的。
因为您正在使用行 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。而不是被点击的行的位置。
可能您应该使用位置而不是 id
从 ArrayList
Intent intent = new Intent();
MainMenu clickedObject = (MainMenu)adapter.getItem(position);
intent.setAction(clickedObject.getIntent());
startActivity(intent);
确保您正在覆盖 Adapter 中的 getItem
并从中返回 values.get(position)
。