使用putExtra为ListView动态创建意图?

时间:2015-02-07 14:48:06

标签: android android-intent

我做了一个“感觉”错误的设计。所以也许你可以告诉我如何更好,或者我的解决方案是不是那么糟糕。

模型是:

我的应用程序中的菜单结构有数据库表。对于主菜单,子菜单等。数据库表如下所示:

    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:
}

阻止,当我决定将所有信息都放入数据库时​​,这并不是我想要的。

1 个答案:

答案 0 :(得分:0)

因为您使用行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。而不是点击的行的位置。

可能你应该使用position而不是id来从ArrayList获取动作

Intent intent = new Intent();
MainMenu clickedObject = (MainMenu)adapter.getItem(position);
intent.setAction(clickedObject.getIntent());
startActivity(intent);

确保您在适配器中覆盖getItem并从中返回values.get(position)