2012-11-28 40 views
0

這裏是我的類:的ArrayList中的所有元素改變其值意外

public class JsoupParser 
{ 
    ArrayList<CompanyInfo> arr = new ArrayList<CompanyInfo>(); 

    public static final String SITE = "http://www.example.com/"; 

    public JsoupParser() {} 

    public ArrayList<CompanyInfo> parse(final String link) 
          throws InterruptedException, ExecutionException 
    { 

     new RealParser().execute(link).get(); 

     return arr; 
    } 

    class RealParser extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) 
     { 

      Document doc = null; 
      String link = params[0]; 
      try 
      { 
       doc = Jsoup.connect(link).get(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      Elements a = doc.select("a.company_logo"); 
      Elements img = a.select("img"); 
      Iterator aIter = a.iterator(); 
      int i = 0; 
      CompanyInfo info = new CompanyInfo(); 
      while(aIter.hasNext()) 
      { 
       aIter.next(); 
       info.setCompanyName(a.get(i).attr("title")); 
       info.setCompanyListingLink(SITE+ a.get(i).attr("href")); 
       info.setCompanyLogoLink(SITE+ img.get(i).attr("src")); 
       arr.add(info); 
       ++i; 
      } 
      return null; 
     }   
    } 
} 

我敢肯定,這解析代碼工作正常(在Java項目測試)。

問題是,最後arr的所有元素變得相同(全部突然變得等於插入到arr的第一個元素)。我調試並看到,每個元素都不同於另一個元素。

每次info對象不同,也就是說,我在arr中添加不同的元素,這樣做arr.add(info);。在while循環中調試一切正常,但只要退出AsyncTaskarr就會變成一個具有多個相同對象的ArrayList。

我該如何解決這個問題?我究竟做錯了什麼?

回答

2

是的,因爲你不斷重複使用相同的CompanyInfo對象。
您需要在while循環內移動CompanyInfo info = new CompanyInfo();

2

將這個內部循環

CompanyInfo info = new CompanyInfo(); 

信息=新的公司信息();

0

首先,您一遍又一遍地將相同的對象添加到您的arr。如果得到您的觀察結果,請不要感到驚訝。

其次,您以相當不尋常的方式使用迭代器aIter;看起來像你混合使用了一個迭代器並遍歷索引。

相關問題