2015-08-28 50 views
1

當我跑我的活動,以顯示下面的GridView似乎停留在獲取位置時0的GridView在getView方法崩潰滾動

你可以看到下面的時候GridView控件顯示在屏幕上正在發生的事情日誌。這在第一次加載時工作正常,但是當它滾動時,它似乎試圖重用第一個位置(0),即使它仍在使用中並且與空指針異常一起崩潰。

爲什麼它會試圖重新使用視圖馬上?爲什麼會認爲連續多次嵌套呢?是否適配器會被擴展FrameLayout的CheckableButton所困惑?

謝謝!

public View getView(int position, View convertView, ViewGroup parent) { 
    CheckableButton checkableButton; 
    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(mContext); 
     imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     imageView.setLayoutParams(new ViewGroup.LayoutParams(175, 175)); 
     checkableButton = new CheckableButton(mContext); 
     checkableButton.setLayoutParams(new GridView.LayoutParams(
       GridView.LayoutParams.WRAP_CONTENT, 
       GridView.LayoutParams.WRAP_CONTENT)); 
     checkableButton.addView(imageView); 

     Log.d("Initiated New View:", "" + position); 
    } 
    else { 
     checkableButton = (CheckableButton) convertView; 
     imageView = (ImageView) checkableButton.getChildAt(position); 
     Log.d("Reused View:", "" + position); 
    } 

    imageView.setImageBitmap(photos[position]); 

    return checkableButton; 
} 

這裏是Log.d讀數

d /啓動新觀點:: 0

d /重複使用瀏覽:: 0

d /重複使用瀏覽:: 0

D /重新使用視圖:: 0

D /初始化新視圖:: 1

d /啓動的新觀點:: 2

d /啓動的新觀點:: 3

d /啓動的新視角:4

d /啓動的新觀點:: 5

d /啓動的新觀點:: 6

d /啓動的新觀點:: 7

d /啓動新的視圖:: 8

d /啓動的新觀點:: 9

d /啓動的新觀點:: 0

d /重複使用的查看:: 0

d /重複使用的查看:: 0

d /重複使用的查看:: 0

d /重複使用的查看:: 0

d /重複使用瀏覽:: 0

回答

2

問題是此行

imageView = (ImageView) checkableButton.getChildAt(position); 

CheckableButton只有一個孩子,你添加時convertView是空的ImageView。所以你應該在位置0檢索child。您的CheckableButton的孩子與您在getView中獲得的position無關。您應該使用該值訪問數據集。

+0

輝煌,它做到了,謝謝! –

+0

不客氣 – Blackbelt

1

d /重複使用瀏覽:: 0

首先,這意味着它是重用一些其他convertView再次創建0,不是從自身創建位置0。

你的崩潰可能是由這個

imageView = (ImageView) checkableButton.getChildAt(position); 

的checkableButton始終有1個小孩,所以它如果位置崩潰造成的!= 0

+0

是的,這是問題!謝謝! –

4

在getView方法中的地位ARG實際上是每一個可見的指標顯示在屏幕上的項目。因此,例如,如果您的適配器中有20個項目,則滾動模式下的位置arg將在列表末尾達到20。在你的實現checkableButton只有一個孩子,所以它失敗時,位置比checkableButton子視圖計數更大。嘗試做這樣的事情,而不是

imageView = (ImageView) checkableButton.getChildAt(0); 

因爲你的imageView是checkableButton的唯一的childView訪問0索引。

+0

修好了,謝謝!我花了將近6個小時嘗試了其他我能做的事! –