如何将arraylist传递给onClick的方法

Posted

技术标签:

【中文标题】如何将arraylist传递给onClick的方法【英文标题】:How to pass arraylist into a method from 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 中定义 【参考方案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

以上是关于如何将arraylist传递给onClick的方法的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 if else 然后将值传递给设置 onClick 时,如何获取微调器值?

在Android Kotlin中,将onclick事件传递给viewholder的正确方法是啥?

React js onClick无法将值传递给方法

React js onClick无法将值传递给方法

JS onclick 中如何传两个参数给 JS方法

将 Firebase Props onclick 传递给 Vue 中的方法