Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android Java中从另一个类访问ArrayList?_Java_Android_Arraylist - Fatal编程技术网

如何在Android Java中从另一个类访问ArrayList?

如何在Android Java中从另一个类访问ArrayList?,java,android,arraylist,Java,Android,Arraylist,我不熟悉Android和Java,但在Objective C和iPhone编程方面确实有一些经验。我正在尝试重新创建一个我已经为iPhone设计的应用程序,我被一个简单的概念所困扰 在我的ParserHandler类中,我正在解析来自服务器的XML,并将数据放入三个单独的ArrayList中。解析似乎工作正常。当我在ParserHandler.java类中记录并遍历ArrayList时,一切都正常。 java类有几个字符串变量,我在ParserHandler中也这样声明了它:private Li

我不熟悉Android和Java,但在Objective C和iPhone编程方面确实有一些经验。我正在尝试重新创建一个我已经为iPhone设计的应用程序,我被一个简单的概念所困扰

在我的ParserHandler类中,我正在解析来自服务器的XML,并将数据放入三个单独的ArrayList中。解析似乎工作正常。当我在ParserHandler.java类中记录并遍历ArrayList时,一切都正常。 java类有几个字符串变量,我在ParserHandler中也这样声明了它:private List1 theList=new List1

我尝试了两种不同的方法,它们都始终在日志中返回0。但是,当日志来自ParserHandler.java类时,总是记录正确的大小,并且所有数据都在那里

这是ParserHandler.java中的访问器方法

   public int getNumberofDogs(){
            return dogArray.size();
        }
我更喜欢通过访问器方法访问dogArray,因为这似乎是我收集到的最佳实践,但我愿意接受所有建议

提前谢谢

编辑8/23/12

我最终解决了这个问题,将我的ArrayList声明为静态。我知道这种公开的方法对OOP来说并不理想,但我会同意的。在我的ParserHandler.java中,我声明

public static ArrayList<List1> dogArray = null; 
public static ArrayList<List1> otherArray = null;
public static ArrayList<List1> catArray = null;
然后开始我的SAX解析器:

@Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if (qName.equalsIgnoreCase("ArrayOfDataFeedAnimal")){
            catArray = new ArrayList<List1>();
            dogArray = new ArrayList<List1>();
            otherArray = new ArrayList<List1>();
        }else if(qName.equalsIgnoreCase("DataFeedAnimal")){
            theList = new List1();
        }
然后我剩下的SAX解析工作就开始了。最后,无论我想从哪个类访问数组,我都可以通过ParserHandler.dogArray.size以静态方式访问数组,以获得数组的大小。我现在可以从任何我需要的类中以我认为合适的任何方式操纵数组

我仍然不清楚为什么创建ParserHandler类的实例对我解析的ArrayList不起作用,因为当我使用简单的int[]进行测试时,它工作得很好

希望这能在将来帮助其他人

再次感谢大家的反馈


干杯

你可以用两种方法

创建setter/getter类 创建一个返回ArrayList的公共静态方法 第一种方法:

类名:myDataObject.java

private ArrayList myArrayList;

// setting the ArrayList Value 
public void setArrayList ( ArrayList myArrayList )
{
     this.myArrayList = myArrayList;
}

// getting the ArrayList value 
public ArrayList getArrayList() 
{
     return myArrayList;
}
第二种方法:

在ArrayList文件中,假设类名为class A.java

private static ArrayList myArrayList = null; 

... 
// assign arraylist 

public static ArrayList getArrayList()
{
      return myArrayList;
}
在调用活动/类中,可以使用以下代码调用它

private ArrayList newArrayList = null;

newArrayList = A.getArrayList();

你可以用两种方法

创建setter/getter类 创建一个返回ArrayList的公共静态方法 第一种方法:

类名:myDataObject.java

private ArrayList myArrayList;

// setting the ArrayList Value 
public void setArrayList ( ArrayList myArrayList )
{
     this.myArrayList = myArrayList;
}

// getting the ArrayList value 
public ArrayList getArrayList() 
{
     return myArrayList;
}
第二种方法:

在ArrayList文件中,假设类名为class A.java

private static ArrayList myArrayList = null; 

... 
// assign arraylist 

public static ArrayList getArrayList()
{
      return myArrayList;
}
在调用活动/类中,可以使用以下代码调用它

private ArrayList newArrayList = null;

newArrayList = A.getArrayList();

请注意,在oncreate中,您正在ParserHandler中执行文件操作,该操作将xml文件解析为数据。如果ParserHandler未在单独的线程中处理,则这可能会阻止UI线程。但是,如果在单独的线程中进行处理,则int d=ph.getNumberofDogs;由于UI线程和处理解析的单独线程之间的竞争条件,即使xml中存在数据,也可能返回0

在我看来,最好的解决方案是在解析完成时创建一个侦听器,这样您就可以非常确定在访问列表大小之前处理已经完成

将其添加到ParserHandler类中

class ParserHandler {

       ...... your original codes here

       private OnParsingDoneListener mListener;
       public void setOnParsingDoneListener (OnParsingDoneListener listener){
             mListener = listener;
       }

      public static interface OnParsingDoneListener {
            public void onParsingDone (List dogList);
      }

}
在解析完xml数据后,请确保调用mListener.onParsingDone

在你的onCreate中

ParserHandler ph = new ParserHandler();
ph.setOnParsingDoneListener (new ParserHandler.OnParsingDoneListener(){
     public void onParsingDone(List dogList){
         // do whatever you want to the doglist
         // at this point all parsing is done and dogList contains the data from xml
     }
});

请注意,在oncreate中,您正在ParserHandler中执行文件操作,该操作将xml文件解析为数据。如果ParserHandler未在单独的线程中处理,则这可能会阻止UI线程。但是,如果在单独的线程中进行处理,则int d=ph.getNumberofDogs;由于UI线程和处理解析的单独线程之间的竞争条件,即使xml中存在数据,也可能返回0

在我看来,最好的解决方案是在解析完成时创建一个侦听器,这样您就可以非常确定在访问列表大小之前处理已经完成

将其添加到ParserHandler类中

class ParserHandler {

       ...... your original codes here

       private OnParsingDoneListener mListener;
       public void setOnParsingDoneListener (OnParsingDoneListener listener){
             mListener = listener;
       }

      public static interface OnParsingDoneListener {
            public void onParsingDone (List dogList);
      }

}
在解析完xml数据后,请确保调用mListener.onParsingDone

在你的onCreate中

ParserHandler ph = new ParserHandler();
ph.setOnParsingDoneListener (new ParserHandler.OnParsingDoneListener(){
     public void onParsingDone(List dogList){
         // do whatever you want to the doglist
         // at this point all parsing is done and dogList contains the data from xml
     }
});

你不应该让这些方法是静态的,因为那不是一个面向对象的设计

有两种方法:

一,。要么公开财产。这也不是一个好习惯

二,。为ParserHandler类添加getter和setter

class ParserHandler {

       ...... your original codes here

       private OnParsingDoneListener mListener;
       public void setOnParsingDoneListener (OnParsingDoneListener listener){
             mListener = listener;
       }

      public static interface OnParsingDoneListener {
            public void onParsingDone (List dogList);
      }

}

最初它将是0,因为它是一个空列表。首先使用setter方法设置数组

您不应该将方法设置为静态。因为这不是OOP设计

有两种方法:

一,。要么公开财产。这也不是一个好习惯

二,。为ParserHandler类添加getter和setter

class ParserHandler {

       ...... your original codes here

       private OnParsingDoneListener mListener;
       public void setOnParsingDoneListener (OnParsingDoneListener listener){
             mListener = listener;
       }

      public static interface OnParsingDoneListener {
            public void onParsingDone (List dogList);
      }

}

最初它将是0,因为它是一个空列表。使用setter方法首先设置数组

您的选项2对我来说最有意义。请你把灯照在墙上好吗
说明ph.getDogArray的目的;在初始化int之前,m=ph.getDogArray.size;?我觉得我应该能够int m=ph.getDogArray.size;。我不太在乎我真正想要访问dogArray的大小;在ParserHandler类中,通过声明以下内容返回数组也很重要。在多格雷之前?谢谢你的帮助!我试过了,但还是得到了0分。GRRRR!!!我的应用程序将是只读的,所以我想我可以不用setter方法。同样,当我循环遍历数组并从ParserHandler.java类记录它时,一切正常。我尝试在DogListView.java类中通过getterMethod返回相同的数组,但没有得到任何错误,只是什么都没有?我知道数据在那里b/c有两个方面:1目前我的UI在下载和解析数据时被阻止,因此我无法在数据在那里之前到达活动;2当我在ParserHandler.java类中循环通过它时,无法访问它的日志记录。你的选择2对我来说最有意义。你能不能给我介绍一下博士的情况;在初始化int之前,m=ph.getDogArray.size;?我觉得我应该能够int m=ph.getDogArray.size;。我不太在乎我真正想要访问dogArray的大小;在ParserHandler类中,通过声明以下内容返回数组也很重要。在多格雷之前?谢谢你的帮助!我试过了,但还是得到了0分。GRRRR!!!我的应用程序将是只读的,所以我想我可以不用setter方法。同样,当我循环遍历数组并从ParserHandler.java类记录它时,一切正常。我尝试在DogListView.java类中通过getterMethod返回相同的数组,但没有得到任何错误,只是什么都没有?我知道数据在那里b/c有两个方面:1目前我的UI在下载和解析数据时被阻止,因此我无法在数据在那里之前到达活动;2当我在ParserHandler.java类中循环通过它时,无法访问它的日志记录。我也试过你的第二个月。没用。在我的ParserHandler类中,我有公共ArrayList getArrayList{return myArrayList;},在我的DogListView.java中,我通过newDogArray=ph.getArrayList访问它;然后为了测试,我打印出int d=newDogArray.size;但每次都是0。快把我逼疯了。你需要将你的public方法定义为public static,请参阅我的代码。static不起作用。我的ArrayList位于扩展defaulthandler的ParserHandler中。我想我需要把这些阵列移到我的主要活动中,这样它们就不会被破坏了?我要么得到空指针错误,要么只得到0。我试试看,然后告诉你。谢谢你,我的意思是更新你修改过的有问题的代码,这样我就可以查看它并向你提出建议,如果需要的话。在我再三努力之后,我终于让它工作了。我以前试过你的静态方法,但没有成功。一直在尝试不同的方法,我很确定我掌握了getter和setter,但是这种方法也不起作用。当我清理完viola项目后,我又开始使用你的静态方法了!!我知道有些人不喜欢这种方式,但我认为它可以满足我的需要。我仍然不明白为什么我的能手和二传手不起作用??当我测试通过一个简单的“int[]”时,我没有任何问题。但是我解析的数组列表是有问题的孩子!!我也试过你的第二个月。没用。在我的ParserHandler类中,我有公共ArrayList getArrayList{return myArrayList;},在我的DogListView.java中,我通过newDogArray=ph.getArrayList访问它;然后为了测试,我打印出int d=newDogArray.size;但每次都是0。快把我逼疯了。你需要将你的public方法定义为public static,请参阅我的代码。static不起作用。我的ArrayList位于扩展defaulthandler的ParserHandler中。我想我需要把这些阵列移到我的主要活动中,这样它们就不会被破坏了?我要么得到空指针错误,要么只得到0。我试试看,然后告诉你。谢谢你,我的意思是更新你修改过的有问题的代码,这样我就可以查看它并向你提出建议,如果需要的话。在我再三努力之后,我终于让它工作了。我以前试过你的静态方法,但没有成功。一直在尝试不同的方法,我很确定我掌握了getter和setter,但是这种方法也不起作用。当我清理完viola项目后,我又开始使用你的静态方法了!!我知道有些人不喜欢这种方式,但我认为它可以满足我的需要。我仍然不明白为什么我的能手和二传手不起作用??当我测试通过一个简单的“int[]”时,我没有任何问题。但是我解析的数组列表是有问题的孩子!!