我試圖在開源項目上構建我的應用程序。 基本功能是使用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,尺寸爲10005-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(本機方法)
這是'getView()'方法中的完整代碼嗎?如果不是,請將其發佈,否則我不會看到您的代碼如何管理負索引列表檢索(因爲位置從0開始並假設mNumColumns不爲0)。 – Luksprog 2013-05-06 16:35:12
@Luksprog,我編輯了代碼。 – Fihop 2013-05-06 17:39:29
你發佈的內容不清楚。 'Images.imageThumbUrls.length'代表你的代碼中的'DataStore.photosInfoOfTag.total'?在這種情況下,如果'Images.imageThumbUrls.length'爲99,那麼異常狀態如何表明您有100個元素的列表? – Luksprog 2013-05-06 17:56:42