【问题标题】:How to pass arraylist into a method from onClick如何将arraylist传递给onClick的方法
【发布时间】:2016-11-01 23:04:07
【问题描述】:

我的问题是我有一个创建数组列表的方法。我可以根据需要将其传递给其他方法以供使用。但是,当用户单击使用先前创建的数组列表但我不知道该怎么做的“计算”按钮时,我想调用一个方法calculate。

我最接近的是将我的数组列表声明为全局变量,但我知道全局变量通常很糟糕,即使这样我在代码的最后一行 lookUpMethod(al, lookUpString); 上也得到了一个 Cannot resolve symbol 'al'。

我不确定我做错了什么或最好的处理方法是什么。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<String []> al = new ArrayList<>(); //tried global variable
        exampleArrayListofArray (al);

    }

    public void exampleArrayListofArray (List<String []> al) {
        //ArrayList<String []> al = new ArrayList<>();  //original array list declaration
        al.add(new String[] {"AB","YZ","12"});
        al.add(new String[] {"CD","WX", "34"});
        al.add(new String[] {"EF","UV", "56"});
        al.add(new String[] {"GH","ST", "78"});
        al.add(new String[]{"IJ", "QR", "91"});
        al.add(new String[]{"KL", "OP", "10"});
        displayArrayListofArray(al);
    }

    public void displayArrayListofArray(List<String[]> al) {

        for (String [] row : al)
            for (int column = 0; column <= 2 ; column ++){
                System.out.println("Value at Index Row " + al.indexOf(row) +
                        " Column " + column + " is " + (row)[column]);
            }
        EditText userField = (EditText) findViewById(R.id.user_field);
        String lookUpString = userField.getText().toString();
        lookUpMethod(al, lookUpString);

    }

    public void lookUpMethod(List<String[]> al, String lookUpString) {
        boolean isStringFound = false;
        for (String[] row : al) {
            for (int column = 0; column <= 2; column++) {
                if (al.get(al.indexOf(row))[column].equals(lookUpString)) {
                    System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
                    isStringFound = true;
                }
            }
        }
        if (!isStringFound) {
            System.out.println("Search string '" + lookUpString + "' does not exist.");
        }
    }

    public void calculate(View view){
        EditText userField = (EditText) findViewById(R.id.user_field);
        String lookUpString = userField.getText().toString();
        System.out.println("user input : " + lookUpString);

        lookUpMethod(al, lookUpString);

    }
}

【问题讨论】:

  • 你想将数据传递给另一个活动?
  • 我已经阅读了您的代码,但在方法计算中没有看到任何定义。如果你想使用它,你可以在变量 global 中定义

标签: java android arraylist methods onclick


【解决方案1】:

范围:局部变量仅在声明它们的方法或块中可见,而实例变量可以在类中的所有方法中看到。声明位置:局部变量在方法或块内声明,而实例变量在类内但在方法外声明。

你需要声明

ArrayList<String []> al = new ArrayList<>();

在 onCreate 函数之外。

【讨论】:

    【解决方案2】:

    您需要将函数外部的arrayList 声明作为全局变量。

    ArrayList al = new ArrayList();

    【讨论】:

      【解决方案3】:

      在onCreate 函数之外声明ArrayList&lt;String []&gt; al = new ArrayList&lt;&gt;();。

      我真的不明白这样会有什么问题,因为现在所有函数都会看到你的变量。作为清理,您可以在调用函数时删除变量al,因为它不再需要,因为现在每个函数都可以看到它。如果我没记错的话,你的最终代码应该是这样的:

      public class MainActivity extends AppCompatActivity {
      
          ArrayList<String []> al = new ArrayList<>(); //declare it here
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              exampleArrayListofArray ();
      
          }
      
          public void exampleArrayListofArray () {
      
              al.add(new String[] {"AB","YZ","12"});
              al.add(new String[] {"CD","WX", "34"});
              al.add(new String[] {"EF","UV", "56"});
              al.add(new String[] {"GH","ST", "78"});
              al.add(new String[]{"IJ", "QR", "91"});
              al.add(new String[]{"KL", "OP", "10"});
              displayArrayListofArray();
          }
      
          public void displayArrayListofArray() {
      
              for (String [] row : al)
                  for (int column = 0; column <= 2 ; column ++){
                      System.out.println("Value at Index Row " + al.indexOf(row) +
                              " Column " + column + " is " + (row)[column]);
                  }
              EditText userField = (EditText) findViewById(R.id.user_field);
              String lookUpString = userField.getText().toString();
              lookUpMethod(lookUpString);
      
          }
      
          public void lookUpMethod(String lookUpString) {
              boolean isStringFound = false;
              for (String[] row : al) {
                  for (int column = 0; column <= 2; column++) {
                      if (al.get(al.indexOf(row))[column].equals(lookUpString)) {
                          System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
                          isStringFound = true;
                      }
                  }
              }
              if (!isStringFound) {
                  System.out.println("Search string '" + lookUpString + "' does not exist.");
              }
          }
      
          public void calculate(View view){
              EditText userField = (EditText) findViewById(R.id.user_field);
              String lookUpString = userField.getText().toString();
              System.out.println("user input : " + lookUpString);
      
              lookUpMethod(lookUpString);
      
          }
      }
      

      请注意我是如何在您的函数调用和函数参数中删除“al”的。将al 作为通过函数传递的局部变量的问题在于,当您点击calculate 按钮时,calculate 函数看不到al,除非它是一个全局变量。

      去试试修改后的代码。

      【讨论】:

      • 噢!我以为我主要宣布了 al。 facepalm 我没有意识到我在 onCreate 方法中声明了它。
      • 不要忘记在函数调用和声明中删除al,以避免冗余和不必要的代码!这样一来,它就会变得可读和“优雅”! :)
      • 现在完美运行。为什么我读到全局变量是坏消息?是否有另一种方法可以在不使用全局变量的情况下执行此操作,并且也许能够将 al 传递给另一个活动。 (我可能想在我的应用程序的未来版本中这样做)。
      • @Airfix 由于您活动中的每个函数都可以访问全局变量,因此可能很难跟踪哪些函数使用您的变量,并且当您的活动变大时很难确定哪些函数修改了您的变量。
      • 但是,在您的情况下,全局变量不会是什么大问题,因为您还没有太多代码。
      【解决方案4】:

      全局变量应该在 onCreate 之外定义,我认为这通常还不错,你可以试试这个代码:

      public class MainActivity extends AppCompatActivity {
      
          private ArrayList<String []> al; //global variable in class
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              al = new ArrayList<>();
              exampleArrayListofArray (al);
      
          }
      
          public void exampleArrayListofArray (List<String []> al) {
              //ArrayList<String []> al = new ArrayList<>();  //original array list declaration
              al.add(new String[] {"AB","YZ","12"});
              al.add(new String[] {"CD","WX", "34"});
              al.add(new String[] {"EF","UV", "56"});
              al.add(new String[] {"GH","ST", "78"});
              al.add(new String[]{"IJ", "QR", "91"});
              al.add(new String[]{"KL", "OP", "10"});
              displayArrayListofArray(al);
          }
      
          public void displayArrayListofArray(List<String[]> al) {
      
              for (String [] row : al)
                  for (int column = 0; column <= 2 ; column ++){
                      System.out.println("Value at Index Row " + al.indexOf(row) +
                              " Column " + column + " is " + (row)[column]);
                  }
              EditText userField = (EditText) findViewById(R.id.user_field);
              String lookUpString = userField.getText().toString();
              lookUpMethod(al, lookUpString);
      
          }
      
          public void lookUpMethod(List<String[]> al, String lookUpString) {
              boolean isStringFound = false;
              for (String[] row : al) {
                  for (int column = 0; column <= 2; column++) {
                      if (al.get(al.indexOf(row))[column].equals(lookUpString)) {
                          System.out.println("Index of '" + lookUpString + "': " + al.indexOf(row) + column);
                          isStringFound = true;
                      }
                  }
              }
              if (!isStringFound) {
                  System.out.println("Search string '" + lookUpString + "' does not exist.");
              }
          }
      
          public void calculate(View view){
              EditText userField = (EditText) findViewById(R.id.user_field);
              String lookUpString = userField.getText().toString();
              System.out.println("user input : " + lookUpString);
      
              lookUpMethod(al, lookUpString);
      
          }
      }
      

      【讨论】:

      • 这不是一个全局变量。它只是一个实例变量
      • 是的,就像我评论的那样,这只是类中的全局变量。这意味着它可以在这个类中访问,但不能从另一个类访问。也许它被称为实例变量:)
      • 我的错误。我以为我已将其声明为全局变量 facepalm
      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多