2014-10-01 13 views
0

我正在使用XMLPullParser來解析XML源,然後將傳入的數據存儲在列表中。 問題是,我有多個飼料拉從數據和一個列表,更新AsyncTask內部的ArrayAdapter的有效方法?

什麼我做的是,

我創建了一個ArrayList來存儲從XML拉數據,

protected ArrayList<String> feed_XMLs = new ArrayList<String>(); 

由於我有多個Feed,我將它們存儲在一個陣列

public static String XML_URL[] = { "http://Feed1", 
      "http://Feed2", 
      "http://Feed3", 
      }; 

,然後我用PullParser內部的AsyncTask拉從每個URL和CREA數據TE其目的,

for (int x = 0; x < XML_URL.length; x++){ 
    GetXMLTitles xmlFirst = new GetXMLTitles(x); 
    xmlFirst.execute(); 
} 

我創建的AsyncTask類內部的構造,在每個迭代中選擇不同的URL - >new GetXMLTitles(x)

在每次迭代中,一個URL被選擇,然後標題是拉,並存儲在該ArrayList feed_XMLs

後來裏面的AsyncTask的onPostExecute方法,這個數據現在傳遞給一個ArrayAdapter,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, feed_XMLs); 

     setListAdapter(adapter); 

這就是所有。

最終的輸出是一個巨大的ArrayList feed_XMLs,有數百個標題。

在每次迭代中,都會選擇新的URL,並更新ArrayList並將其顯示在屏幕上。

例如,

在第一次迭代中,第一URL被選擇,並且所有的標題被存儲在feed_XMLsfeed_XMLs被改變。這些標題顯示在屏幕上。

在第二次迭代中,選擇第二個URL並在feed_XMLs中追加所有標題...並且該過程對於每次迭代都是連續的。

的問題是,

在每個迭代屏幕上方的滾動條動作,

例如,

如果我滾動一路下來,並一個ArrayAdapter被更新,我將自動移動到屏幕上,這不是我想要的。

我希望我的屏幕保持它在ArrayAdapter中更新新數據時的位置。

我該如何做到這一點?它甚至有可能嗎?我試過了,scrollview.fullScroll(View.FOCUS_DOWN);但是那也行不通。

是否有無論如何更新ArrayAdapter的方式,它在滾動沒有任何影響?

回答

2

我覺得現在的問題是,你在每個onPostExecute

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, feed_XMLs); 

    setListAdapter(adapter); 

創建一個新的適配器就一次創建適配器和更新它的數據。

事情是這樣的:

if(adapter!=null) { 
    adapter.notifyDataSetChanged(); 
} 

編輯:

感謝您使用這種解決方案!

我創造了這樣的主類的adapter

ArrayAdapter<String> adapter; 

然後在onPostExecute

if (adapter == null) { 
     adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, feed_XMLs); 
     setListAdapter(adapter); 
     } 

     else { 
      adapter.notifyDataSetChanged(); 
     } 
+0

因爲適配器是內部onPostExecute創建的,不會自動在每個迭代上創造的呢? 我不能在主活動類內創建ArrayAdapter,因爲那麼feed_XMLs數據不會更新,我必須在Async onPostExecute內部創建ArrayAdapter,但是如何僅創建一次? P.S:Y我們的解決方案不起作用 – 2014-10-01 18:57:35

+0

當您保留適配器的一個實例時,該解決方案可以正常工作。只需在主活動中保留對適配器的引用,創建一次適配器(onPostExecute),之後只需更新適配器。 – sotcha 2014-10-01 19:03:19