2011-07-28 33 views
2

我正在處理主要由列表視圖組成的應用程序。它由我自己的自定義陣列適配器備份,其大小每5秒更改一次。如果在陣列適配器從較大尺寸變爲較小尺寸時滾動瀏覽列表視圖,則會出現越界異常。它對我來說很重要,爲什麼會出現這種情況(因爲我在一個超出新數組大小的位置滾動),但我想知道是否有一種很好的調試方法。我似乎無法得出一個明確的結論,我想知道我能否得到一些幫助。Android - 通過ListView滾動導致出界異常

我用下面的AsyncTask更新適配器...

public class myTask extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      while(isRunning){ 
       myData.clear(); 
       getData(); 
       publishProgress(); 
       SystemClock.sleep(5000); 
      } 
      return null; 
     } 

     protected void onProgressUpdate(Void...progress){ 
      listAdapter.notifyDataSetChanged(); 

     }  
} 

myData是支持listAdaptergetData()是與最終會顯示在我的列表視圖中的相關信息填充myData功能ArrayList中。

有沒有解決這個問題的好方法?

問候

+0

你有onScroll監聽? –

+0

你爲什麼滾動到陣列沒有的位置?適配器應該只返回你擁有的元素,對嗎? – dmon

+0

@尼古拉,我沒有onScroll監聽器,我只是在想,爲了防止這種異常,我需要實現這一點。 dmon,這就是我的問題,嘿嘿。如果適配器從較大尺寸變爲較小尺寸,那麼我會在大於較小尺寸的位置滾動,這就是當我遇到越界異常時。 – digitalmouse12

回答

0

你有沒有嘗試過的用戶復位到列表的頂部或儘可能接近當列表改變大小?

+0

是的,我有...並且錯誤仍然存​​在 – digitalmouse12

2

您是否使用自定義適配器?

也許在你的getViewTypeCount()和getItemViewType(int position)它會超出邊界。視圖類型計數應該從(0,n)開始,但是項目視圖類型應該是[0,n)。

E.g.視圖類型數應爲2

但視圖類型應該是0和1,而不是1和2

+0

非常感謝你.. – Bharatesh

0

對不起,也許是沒有答案的問題,但具有無限循環,似乎對我來說是不正確的方式,即使它是一個異步的任務。

我會嘗試使用AlarmManager或Timer。

就這樣說,看起來你所擁有的是一種競爭條件,要考慮到當你要求數據或特定位置並重建觀點時,它並不是立即。

乾杯, Francisco。

+0

謝謝,弗朗西斯科。我接受了你的建議,並試圖實現使用Timer,但我仍然得到同樣的錯誤。有一個競賽狀況正在進行,我認爲計時器會解決它。儘管如此,它仍然很少發生。 – digitalmouse12

2

嘗試重寫適配器類的getCount將()函數:

@Override 
public int getCount() { 
return [list that contains data].size(); 
} 
+0

謝謝。我不知道爲什麼我的listview出界了。它在任何時候都可以正常工作,除非我正在刷新搜索。再次感謝你! – Sufian