1

我是 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(因为这似乎是我收集到的最佳实践)但是我愿意接受所有建议。

提前致谢!!

编辑 2012 年 8 月 23 日

我最终通过声明我的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()即可获取数组的大小。我现在可以从我需要的任何类中以任何我认为合适的方式操作数组。

我仍然不清楚为什么使用我解析的 ArrayLists 创建 ParserHandler 类的实例对我不起作用,因为当我使用简单的int[].

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

再次感谢大家的反馈!

干杯!

4

3 回答 3

9

你可以通过两种方式做到这一点,

  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;
}

第二种方法:

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

private static ArrayList myArrayList = null; 

... 
// assign arraylist 

public static ArrayList getArrayList()
{
      return myArrayList;
}

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

private ArrayList newArrayList = null;

newArrayList = A.getArrayList();
于 2012-08-21T02:44:59.840 回答
2

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

有2种方式:

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方法设置数组

于 2012-08-21T05:11:48.480 回答
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
     }
});
于 2012-08-21T03:24:23.833 回答