每个列表项打开不同的活动

Posted

技术标签:

【中文标题】每个列表项打开不同的活动【英文标题】:Each list item to open different activity 【发布时间】:2015-12-21 16:07:00 【问题描述】:

代码有一个ListView,点击一个列表项会弹出一个AlertDialogAlertDialog 有两个单选按钮“是”和“否”,然后是一个“确定”按钮。

当用户选择“是”时,下一个Activity 将启动,如果选择“否”,他们将留在同一个Activity

我的问题是:无论我选择哪个列表项,我都会被带到相同的 'Next-activity' 。根据我选择的列表项,我想参加不同的活动。

listview = (ListView) findViewById(R.id.mylistview);
final String[] items = new String[]"ios", "android", "WINDOWS";
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_expandable_list_item_1, items);
listview.setAdapter(adapter);

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

        int itemposition = position;

        String itemvalue = (String) listview.getItemAtPosition(position);
        final CharSequence[] items1 = "yes", "no";
        final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("slection confirmation");

        builder.setCancelable(false);
        builder.setSingleChoiceItems(items1, -1, new DialogInterface.OnClickListener() 
            @Override
            public void onClick(DialogInterface dialog, int which) 
                selection = (String) items1[which];
                Toast.makeText(getApplicationContext(), items1[which], Toast.LENGTH_SHORT).show();

            
        );
        builder.setNeutralButton("OK",new DialogInterface.OnClickListener() 
            @Override
            public void onClick(DialogInterface dialog, int which) 
                switch (selection)
                
                    case("yes"):
                        Intent myint=new Intent(MainActivity.this,secondpage.class);
                        myint.putExtra("act1","");
                        startActivity(myint);
                        break;
                    case("no"):
                        dialog.cancel();
                        break;
                
            
        );
        AlertDialog alert = builder.create();
        alert.show();
    
    );



【问题讨论】:

【参考方案1】:

首先,为不同活动的所有类名创建字符串资源。在你的'res/strings.xml'文件中,你可以写

<string name="sFirstClass">my.package.name.MyFirstClass</string>
<string name="sSecondClass">my.package.name.MySecondClass</string>

请注意,使用活动的完整路径很重要。

然后,在 OnItemClickListener 的 'onItemClick()' 方法中,定义一个字符串变量并根据单击的列表项的位置对其进行初始化。

// 'final' is important so the String will be visible 
// inside the dialog button's 'onClick()' method
final String SECONDPAGE_CLASS = getMyClass(position);

其中 'getMyClass()' 是一种匹配位置和目标活动的方法:

private String getMyClass(int pos)

    String myClass;
    switch (pos)
    
     case 0: myClass = getString(R.string.sFirstClass);
             break;
     case 1: myClass = getString(R.string.sSecondClass);
             break;
     //...
     default: // do whatever is appropriate
    
return myClass;

现在,对于您的 OK 按钮,您可以将 Intent 定义为

try 

    Intent myint = new Intent(MainActivity.this, Class.forName(SECONDPAGE_CLASS));

catch (ClassNotFoundException e)

   e.printStackTrace();

【讨论】:

【参考方案2】:

您在 Intent 中对 second.class 进行硬编码,而是尝试使用一个动态变量,该变量根据您单击的项目保存类的值

public static Activity ClASS_NAME;
  //set CLASS_NAME based on item position for example 
     switch (selection)
                        
                            case("yes"):
                                Intent myint=new Intent(MainActivity.this,CLASS_NAME);
                                myint.putExtra("act1","");
                                startActivity(myint);
                                break;
                            case("no"):
                                dialog.cancel();
                                break;
                        

【讨论】:

我明白了,但几周前我开始学习 Android,我不熟悉如何使用动态变量。我会尝试用谷歌搜索它。谢谢你:)

以上是关于每个列表项打开不同的活动的主要内容,如果未能解决你的问题,请参考以下文章

Listview 的项目位置 0 持有另一个包含 10 个项目的列表视图,每个项目打开单个活动但不同的文本数据

如何为各种列表视图项打开不同的 XML?

为每个卡片视图打开 1 个不同的活动

离子框架:每个列表项的不同背景颜色

为 UIActivityViewController Swift 设置不同的活动项

Javascript手风琴 - 折叠除活动之外的所有打开实例