滚动时,GridView在getView方法中崩溃

Col*_*erg 1 android gridview

当我运行我的Activity以显示下面的GridView时,它似乎卡在位置0上.

您可以在屏幕上显示GridView时看到下面的日志.这在第一次加载时工作正常,但是当它滚动时,它似乎试图重用第一个位置(0),即使它仍然在使用并且因空指针异常而崩溃.

为什么要立即重用视图?为什么会认为else连续多次阻塞?适配器是否被扩展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;
}
Run Code Online (Sandbox Code Playgroud)

这是Log.d读数

D/Initiated New View :: 0

D /重用View :: 0

D /重用View :: 0

D /重用View :: 0

D/Initiated New View :: 1

D/Initiated New View :: 2

D/Initiated New View :: 3

D/Initiated New View :: 4

D/Initiated New View :: 5

D/Initiated New View :: 6

D/Initiated New View :: 7

D/Initiated New View :: 8

D/Initiated New View :: 9

D/Initiated New View :: 0

D /重用View :: 0

D /重用View :: 0

D /重用View :: 0

D /重用View :: 0

D /重用View :: 0

Kev*_*ine 5

getView方法中的位置arg实际上是屏幕上显示的每个可见项的索引.因此,例如,如果适配器中有20个项目,则滚动模式下的位置arg在列表末尾变为20.在您的实现中,checkableButton只有一个子节点,因此当位置变得大于checkableButton子视图计数时它会失败.尝试做这样的事情

imageView = (ImageView) checkableButton.getChildAt(0);
Run Code Online (Sandbox Code Playgroud)

因为你的imageView是checkableButton的唯一childView,它可以用0索引访问.