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

时间:2012-08-21 02:38:21

标签: java android arraylist

我是Android和Java的新手,但在Objective C和iPhone编程方面有一些经验。我正在尝试重新创建一个我已经为iPhone设计的应用程序,并且我正陷入应该是一个简单的概念。

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

for(int i = 0; i<dogArray.size(); i++){
        theList = dogArray.get(i);
        Log.i(TAG, "looping " + i + " " + theList.Name);
        Log.i(TAG, "looping " + i + " " + theList.PhotoUrl);
        Log.i(TAG, "looping " + i + " " + theList.Type);


        }//this loops fine and has all the data

dogArray声明如下:public ArrayList<List1> dogArray = new ArrayList<List1>(); 现在我想从类DogListView.java访问dogArray,所以在onCreate方法中我尝试执行以下操作:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dog_list_view);
        ParserHandler ph = new ParserHandler();
        int d = ph.getNumberofDogs();
        int m = ph.dogArray.size();
        Log.i(TAG, "dog size is:" + d + "and:" + m);}

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

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

   public int getNumberofDogs(){
            return dogArray.size();
        }

我更喜欢通过访问器方法访问dogArray(因为这似乎是我收集的最佳实践)但是我对所有建议持开放态度。

提前致谢!!

编辑8/23/12

我最终通过声明ArrayLists Static来解决问题。我知道这个(和public)方法我不是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类的实例对我使用我的解析过的ArrayLists不起作用,因为当我用一个简单的int[]进行测试时它工作得很好。

希望这可以在将来帮助其他人。

再次感谢大家的反馈!

干杯!

3 个答案:

答案 0 :(得分:8)

你可以用两种方式来做,

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

    类名: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文件中,(假设类名是A.java类)

    private static ArrayList myArrayList = null; 
    
    ... 
    // assign arraylist 
    
    public static ArrayList getArrayList()
    {
          return myArrayList;
    }
    

    在调用活动/类中,您可以使用以下代码调用它,

    private ArrayList newArrayList = null;
    
    newArrayList = A.getArrayList();
    

答案 1 :(得分:2)

你不应该使方法静态。因为那不是OOP设计。

有两种方式:

1)。要么公开属性。 (也不是一个好习惯)

2)。为ParserHandler

添加getter和setter
class ParserHandler {

  private  List<List1> dogArray = new ArrayList<List1>();

  public List<List1> getDogArray() {
   return this.dogArray;
  }

  public void setDogArray(List<List1> dogArray) {
    this.dogArray = dogArray;
  }


}

现在访问dogArray像这样

ph.getDogArray();
 int m = ph.getDogArray().size();

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

答案 2 :(得分:0)

请注意,在您的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
     }
});