2013-05-06 77 views
0

我試圖在開源項目上構建我的應用程序。 基本功能是使用GridView顯示幾個圖像。 以下是代碼片段。註釋行是原始代碼。在原始代碼中,Images.imageThumbUrls是一個網址字符串數組,其大小(Images.imageThumbUrls.length)爲99. 我想用我自己的版本替換原始網址,但是我做到了。但是有一個錯誤。請看日誌。使用BaseAdapter o回到GridView

根據日誌,似乎getView的限制是99(原始代碼)。除了改變getCount,還有什麼我需要做的?

createView方法:

 mGridView.getViewTreeObserver().addOnGlobalLayoutListener(
      new ViewTreeObserver.OnGlobalLayoutListener() { 
       @Override 
       public void onGlobalLayout() { 
        if (mAdapter.getNumColumns() == 0) { 
         final int numColumns = (int) Math.floor(
           mGridView.getWidth()/(mImageThumbSize + mImageThumbSpacing)); 
         if (numColumns > 0) { 
          final int columnWidth = 
            (mGridView.getWidth()/numColumns) - mImageThumbSpacing; 
          mAdapter.setNumColumns(numColumns); 
          mAdapter.setItemHeight(columnWidth); 
          if (BuildConfig.DEBUG) { 
           Log.d(TAG, "onCreateView - numColumns set to " + numColumns); 
          } 
         } 
        } 
       } 
      }); 

ImageAdapter類:

private class ImageAdapter extends BaseAdapter {   
public int getCount() { 
     //return Images.imageThumbUrls.length + mNumColumns; 
     return DataStore.photosInfoOfTag.total + mNumColumns; 
} 
    @Override 
    public View getView(int position, View convertView, ViewGroup container) { 
     // First check if this is the top row 
     if (position < mNumColumns) { 
      if (convertView == null) { 
       convertView = new View(mContext); 
      } 
      // Set empty view with height of ActionBar 
      convertView.setLayoutParams(new AbsListView.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, mActionBarHeight)); 
      return convertView; 
     } 

     // Now handle the main ImageView thumbnails 
     ImageView imageView; 
     if (convertView == null) { // if it's not recycled, instantiate and initialize 
      imageView = new RecyclingImageView(mContext); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setLayoutParams(mImageViewLayoutParams); 
     } else { // Otherwise re-use the converted view 
      imageView = (ImageView) convertView; 
     } 

     // Check the height matches our calculated column width 
     if (imageView.getLayoutParams().height != mItemHeight) { 
      imageView.setLayoutParams(mImageViewLayoutParams); 
     } 

     // Finally load the image asynchronously into the ImageView, this also takes care of 
     // setting a placeholder image while the background thread runs 
     Photo photo = DataStore.photosInfoOfTag.photo.get(position - mNumColumns); 
     String photoUrl = DataStore.imageUrlPart1 + Integer.toString(photo.getFarm()) + 
          DataStore.imageUrlPart2 + photo.getServer() + "/" + 
          photo.getId() + "_" + photo.getSecret() + 
          DataStore.imageUrlPart3; 
     mImageFetcher.loadImage(photoUrl, imageView); 
     //mImageFetcher.loadImage(Images.imageThumbUrls[position - mNumColumns], imageView); 
     return imageView; 
    } 

    public void setItemHeight(int height) { 
     if (height == mItemHeight) { 
      return; 
     } 
     mItemHeight = height; 
     mImageViewLayoutParams = 
       new GridView.LayoutParams(LayoutParams.MATCH_PARENT, mItemHeight); 
     mImageFetcher.setImageSize(height); 
     notifyDataSetChanged(); 
    } 

    public void setNumColumns(int numColumns) { 
     mNumColumns = numColumns; 
    } 
} 

1月5日至6日:04:39.736:E/AndroidRuntime(16356):致命異常:主

05-06 01:04:39.736:E/AndroidRuntime(16356):
java.lang.IndexOutOfBoundsException:無效的索引100,尺寸爲100

05-06 01:04:39.736:E/AndroidRuntime(16356):在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)

05-06 01:04:39.736:E/AndroidRuntime(16356):在 java.util.ArrayList.get(ArrayList.java:304)

05-06 01:04:39.736:E/AndroidRuntime(16356):at com.example.android.bitmapfun.ui.ImageGridFragment $ ImageAdapter.getView(ImageGridFragment.java:292)

05-06 01:04:39.736:E/Andr oidRuntime(16356):在 android.widget.AbsListView.obtainView(AbsListView.java:2143)

一月五日至6日:04:39.736:E/AndroidRuntime(16356):在 android.widget.GridView.makeAndAddView (GridView.java:1341)

05-06 01:04:39.736:E/AndroidRuntime(16356):在 android.widget.GridView.makeRow(GridView.java:341)

05-06 01:04:39.736:E/AndroidRuntime(16356):at android.widget.GridView.fillDown(GridView.java:283)

1月5日至6日:04:39.736:E/AndroidRuntime(16356):在 android.widget.GridView.fillGap(GridView.java:243)

1月5日至6日:04:39.736:E/AndroidRuntime( 16356):在 android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930)

一月5日至6日:04:39.736:E/AndroidRuntime(16356):在 android.widget.AbsListView $ FlingRunnable.run (AbsListView.java:4087)

05-06 01:04:39.736:E/AndroidRuntime(16356):at android.view.Choreographer $ CallbackRecord.run(Choreographer。的java:749)

05-06 01:04:39.736:E/AndroidRuntime(16356):在 android.view.Choreographer.doCallbacks(Choreographer.java:562)

05-06 01:04 :39.736:E/AndroidRuntime(16356):在 android.view.Choreographer.doFrame(Choreographer.java:531)

1月5日至六日:04:39.736:E/AndroidRuntime(16356):在 機器人。 view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:735)

05-06 01:04:39.736:E/AndroidRuntime(16356):在 android.os.Handler.handleCallback(Handler.java:725)

1月5日至6日:04:39.736:E/AndroidRuntime(16356):在 android.os.Handler.dispatchMessage(Handler.java:92 )

1月5日至6日:04:39.736:E/AndroidRuntime(16356):在 android.os.Looper.loop(Looper.java:137)

1月5日至6日:04:39.736: E/AndroidRuntime(16356):at android.app.ActivityThread.main(ActivityThread.java:5041)

05-06 01:04:39.736:E/AndroidRuntime(16356):at java.lang.reflect.Method.invokeNative(本機方法)

1月5日至六日:04:39.736:E/AndroidRuntime(16356):在 java.lang.reflect.Method.invoke(Method.java: 511)

1月5日至6日:04:39.736:E/AndroidRuntime(16356):在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)

05- 06 01:04:39.736:E/AndroidRuntime(16356):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

1月5日至6日:04:39.736:E/AndroidRuntime(16356):在 dalvik.system.NativeStart.main(本機方法)

+0

這是'getView()'方法中的完整代碼嗎?如果不是,請將其發佈,否則我不會看到您的代碼如何管理負索引列表檢索(因爲位置從0開始並假設mNumColumns不爲0)。 – Luksprog 2013-05-06 16:35:12

+0

@Luksprog,我編輯了代碼。 – Fihop 2013-05-06 17:39:29

+0

你發佈的內容不清楚。 'Images.imageThumbUrls.length'代表你的代碼中的'DataStore.photosInfoOfTag.total'?在這種情況下,如果'Images.imageThumbUrls.length'爲99,那麼異常狀態如何表明您有100個元素的列表? – Luksprog 2013-05-06 17:56:42

回答

1

要當心,返回上getCount將一個值()時比大於在適配器上的項目數量(通常只填充單元格),您需要檢查是否從未繞過當前邊界,如果是,則返回空白視圖(或具有某種背景的視圖)。

您的代碼:

public int getCount() { 
     //return Images.imageThumbUrls.length + mNumColumns; 
     return DataStore.photosInfoOfTag.total + mNumColumns; 
} 

應該只返回DataStore.photosInfoOfTag.total

另外,不要使用靜態這樣的事情,你應該使用一個列表,而不是作爲適配器的數據。

+0

我很困惑這個問題。返回'DataStore.photosInfoOfTag.total + mNumColumns;'的原因是因爲「這是相當標準的,除了在我們使用透明的ActionBar時,GridView中的列的數量被用來創建虛假的頂部行的空視圖,希望真正的最上面的一排圖像開始覆蓋它。「 – Fihop 2013-05-06 18:09:39

+0

@Macros,非常感謝您的耐心。我犯了一個錯誤。 'DataStore.photosInfoOfTag.total'的長度是100.對不起,浪費你的時間。 – Fihop 2013-05-06 18:21:02

+0

不,我通常使用大於數據的計數來填充GridView中一行的剩餘空間,但是您需要爲該情況返回空視圖。 – 2013-05-06 18:50:51