使用 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);

注:

您的逻辑不清楚为什么要使用 idvalues 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)