使用BaseAdapter返回GridView



我试图在开源项目的基础上构建我的应用程序。基本功能是使用GridView来显示一些图像。下面是代码片段。注释行是原始代码。在原始代码中,Images.imageThumbUrls是url的字符串数组,大小(Images.imageThumbUrls.length)为99。我想用我自己的版本替换原始的url,我做到了。但是这里有一个错误。请查看日志

根据日志,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;
    }
}

05-06 01:04:39.736: E/AndroidRuntime(16356): FATAL EXCEPTION: main

05-06 01:04:39.736: E/AndroidRuntime(16356):
java.lang.IndexOutOfBoundsException:无效索引100,大小为100

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

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

05-06 01:04:39.736: E/AndroidRuntime(16356): atcom.example.android.bitmapfun.ui.ImageGridFragment ImageAdapter.getView美元(ImageGridFragment.java: 292)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.widget.AbsListView.obtainView (AbsListView.java: 2143)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.widget.GridView.makeAndAddView (GridView.java: 1341)

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

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

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.widget.GridView.fillGap (GridView.java: 243)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.widget.AbsListView.trackMotionScroll (AbsListView.java: 4930)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.widget.AbsListView FlingRunnable.run美元(AbsListView.java: 4087)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.view.Choreographer CallbackRecord.run美元(Choreographer.java: 749)

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

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

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.view.Choreographer FrameDisplayEventReceiver.run美元(Choreographer.java: 735)

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

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.os.Handler.dispatchMessage (Handler.java: 92)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.os.Looper.loop (Looper.java: 137)

05-06 01:04:39.736: E/AndroidRuntime(16356): atandroid.app.ActivityThread.main (ActivityThread.java: 5041)

05-06 01:04:39.736: E/AndroidRuntime(16356): atjava.lang.reflect.Method。invokeNative(本地方法)

05-06 01:04:39.736: E/AndroidRuntime(16356): atjava.lang.reflect.Method.invoke (Method.java: 511)

05-06 01:04:39.736: E/AndroidRuntime(16356): atcom.android.internal.os.ZygoteInit MethodAndArgsCaller.run美元(ZygoteInit.java: 793)

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

05-06 01:04:39.736: E/AndroidRuntime(16356): atdalvik.system.NativeStart。主要(本地方法)

要小心,当getCount()上返回的值大于适配器上的项数(通常只填充单元格)时,您需要检查当前边界是否从未被绕过,如果是,则返回空视图(或带有一些背景的视图)。

代码:

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

应该只返回DataStore.photosInfoOfTag.total

同样,不要使用这样的静态内容,您应该使用List作为适配器的数据。