1

Android と Java は初めてですが、Objective C と iPhone プログラミングの経験はある程度あります。すでに iPhone 用に設計したアプリを再作成しようとしていますが、単純なコンセプトであるべきものに行き詰まっています。

私の ParserHandler クラスでは、サーバーからの XML を解析し、データを 3 つの個別の 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);}

2 つの異なる方法を試しましたが、どちらも常にログに「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()のサイズを取得するために静的な方法でそれを行うだけです。配列を取得する必要があるクラスから適切と思われる方法で配列を操作できるようになりました。

単純なint[].

うまくいけば、これは将来誰かを助けることができます。

フィードバックをお寄せいただきありがとうございます。

乾杯!

4

3 に答える 3

9

あなたは2つの方法でそれを行うことができます、

  1. セッター/ゲッター クラスを作成する
  2. ArrayList を返す public static メソッドを作成する

最初の方法:

クラス名: 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;
}

2 番目の方法:

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

メソッドを static にしないでください。それは OOP デザインではないためです。

2 つの方法があります。

1)。プロパティを公開します。(どちらも良い習慣ではありません)

2)。ParserHandlerクラスのゲッターとセッターを追加する

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 では、xml ファイルをデータとして解析する ParserHandler でファイル操作を行っていることに注意してください。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 に答える