【问题标题】:Add Spinner dynamically in a loop在循环中动态添加 Spinner
【发布时间】:2012-05-05 09:24:11
【问题描述】:

我正在循环中添加say 'n' spinners。但是当我运行我的代码时,只有最后添加的微调器可见。请在下面查看我的代码

Context context = this;
        ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();

        ArrayList<String> hi = new ArrayList<String>();
        hi.add("Test 1");
        hi.add("Test 2");

        list.add(hi);

        ArrayList<String> hi1 = new ArrayList<String>();
        hi1.add("Test 3");
        hi1.add("Test 4");

        list.add(hi1);

        AlertDialog.Builder alert = new AlertDialog.Builder(context);

        alert.setTitle("Test App");
        alert.setMessage("Testing");


        for (int i = 0; i < 2; i++) {
            final Spinner spinner = (Spinner) layout
                    .findViewById(R.id.spinner1);
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list.get(i));

            dataAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(dataAdapter);
                    alert.setView(spinner); 
        }

        alert.show();

【问题讨论】:

    标签: android android-spinner


    【解决方案1】:

    发生这种情况是因为您在 for 循环中所做的只是在 Activity' 布局中搜索 Spinner,然后使用 AlertDialogsetView 方法添加它(此方法不'不要将视图添加到已经存在的其他Views,它只是替换它们)。如果您想将多个Spinner 添加到同一个AlertDialog,您应该这样做:

    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    for (int i = 0; i < 2; i++) {
         Spinner spinner = new Spinner(this);
         ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                       android.R.layout.simple_spinner_item, list.get(i));
         dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         spinner.setAdapter(dataAdapter);
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
         ll.addView(spinner, params);
    }
    alert.setView(ll); 
    

    编辑: 您可以使用适当的布局管理器添加更多视图。例如,对于同一行上的 TextViewSpinner,您可以使用 TableLayout

        TableLayout tl = new TableLayout(this);
        for (int i = 0; i < 2; i++) {
            TableRow tr = new TableRow(this);
            TextView t = new TextView(this);
            t.setText("Text " + i);
            TableRow.LayoutParams params1 = new TableRow.LayoutParams(
                    TableRow.LayoutParams.WRAP_CONTENT,
                    TableRow.LayoutParams.WRAP_CONTENT);
            tr.addView(t, params1);
            Spinner spinner = new Spinner(this);
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list.get(i));
            dataAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(dataAdapter);
            TableRow.LayoutParams params2 = new TableRow.LayoutParams(
                    TableRow.LayoutParams.FILL_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT);
            tr.addView(spinner, params2);
            TableLayout.LayoutParams trParams = new TableLayout.LayoutParams(
                    TableLayout.LayoutParams.FILL_PARENT,
                    TableLayout.LayoutParams.WRAP_CONTENT);
            tl.addView(tr, trParams);
        }
        alert.setView(tl);
    

    【讨论】:

    • 说我想在循环中添加文本视图。那就是我想在同一行显示 textview 和 spinner。我怎样才能做到这一点 ?现在它显示 textview 和 spinner 单独的行。
    • @scooby 我已经编辑了我的答案。我希望你能从那里弄清楚。
    • 我在同一行也有一个 TextView 和一个 Spinner,但为此我使用 LinearLayout 并在 for 循环中创建 15 个这样的布局。你怎么看 - TableLayout 更好还是 15 LinearLayout?
    • @ChinmaySarupria 即使您使用 Tablelayout,您仍然需要子 TableRows 并且 TableLayout 扩展 Linearlayout 它基本上是相同的。查看使用回收小部件(ListView、RecyclerView 等)或 GridLayout。
    【解决方案2】:

    您只是将相同的视图设置了两次。您需要创建一个视图组(在您的情况下,您需要一个LinearLayout)并创建几个新的微调器以放入其中。但是,如果您已经知道需要多少个微调器,则可以创建一个包含所有微调器的新布局,然后执行以下操作:

        LinearLayout viewGroup = (LinearLayout) getInflater().inflate(R.layout.dialog_spinners, null);
    
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            final Spinner spinner = (Spinner) viewGroup.getChildAt(i);
    
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, list.get(i));
    
            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(dataAdapter);
        }
        alert.setView(viewGroup);
    
        alert.show();
    

    【讨论】:

      【解决方案3】:

      这一行……​​

      final Spinner spinner = (Spinner) layout.findViewById(R.id.spinner1);
      

      在每次循环迭代时总是从您的布局中获得相同的微调器。您可能希望在每次迭代时动态创建它。

      还有这一行……​​

      alert.setView(spinner);
      

      始终将警报的视图设置为您之前加载的单个微调器。

      你应该试试这样的方法

      LinearLayout layout = new LinearLayout(getApplicationContext());
      layout.setOrientation(LinearLayout.HORIZONTAL);
      
      for (int i = 0; i < 2; i++) {
          final Spinner spinner = new Spinner(getApplicationContext());
          ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, list.get(i));
          dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
          spinner.setAdapter(dataAdapter);
          layout.addView(spinner); 
      }
      
      alert.setView(layout);
      

      【讨论】:

        猜你喜欢
        • 2014-04-13
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2013-12-05
        • 2022-10-06
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多