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

kev*_*kev 1 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
Run Code Online (Sandbox Code Playgroud)

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);}
Run Code Online (Sandbox Code Playgroud)

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

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

   public int getNumberofDogs(){
            return dogArray.size();
        }
Run Code Online (Sandbox Code Playgroud)

我更喜欢通过访问器方法访问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;
Run Code Online (Sandbox Code Playgroud)

然后开始我的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();
        }
Run Code Online (Sandbox Code Playgroud)

然后我的SAX解析的其余部分发生了.最后,从我想要访问数组的任何类中,我只需以静态方式执行此操作ParserHandler.dogArray.size()即可获得数组的大小.我现在可以以任何我认为合适的方式操纵数组.

我还不清楚为什么创建一个ParserHandler类的实例对我使用我的解析过的ArrayLists不起作用,因为当我用一个简单的测试时它工作得很好int[].

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

再次感谢大家的反馈!

干杯!

Luc*_*fer 8

你可以用两种方式做到,

  1. 创建一个setter/getter类
  2. 创建一个返回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;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:

在ArrayList文件中,(假设类名是类A.java)

private static ArrayList myArrayList = null; 

... 
// assign arraylist 

public static ArrayList getArrayList()
{
      return myArrayList;
}
Run Code Online (Sandbox Code Playgroud)

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

private ArrayList newArrayList = null;

newArrayList = A.getArrayList();
Run Code Online (Sandbox Code Playgroud)