0

私は標準的なスキームでグリッドを作成しています:GridViewカスタムのBaseAdapter派生物で設定されています:

class EventGridAdapter extends BaseAdapter {

    private GregorianCalendar gregorianCalendar;
    Context context;
    GridView gridView;

    public EventGridAdapter(Context context, GridView gridView) {
        this.context = context;
        this.gridView = gridView;
    }


    public int getCount() {
        return 31;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {

        CalendarItem cell = null;
        if (convertView == null) {
            cell = new CalendarItem(context);
            int viewHeight = gridView.getHeight();
            int spacing = 1;
            int height = viewHeight / 5 - spacing; 
            cell.setMinimumHeight(height);
        } else {
            cell = (CalendarItem) convertView;
        }
        return cell;
    }
} 

この行について:

cell = new CalendarItem(context)

CalendarItemでは純粋Viewです。たとえば、すべてがコメントアウトされているため、クラッシュを引き起こすものは何もありません...

そして標準GridView出力:

public class CalendarActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.calendar);

    GridView g = (GridView) findViewById(R.id.gridCalendar);
    g.setAdapter(new EventGridAdapter(this, g));        
}
}

レイアウト:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridCalendar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:horizontalSpacing="1dp"
android:verticalSpacing="1dp" 
android:numColumns="7"
android:padding="10dp"
android:stretchMode="columnWidth"
/>

問題は何ですか:

ICS 4.0.3 のエミュレーターでこのコードを実行すると、グリッドは完全に表示されますが、スクロールしようとすると、奇妙な例外でプログラムがクラッシュします。

D/AndroidRuntime( 1087): Shutting down VM W/dalvikvm( 1087): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) E/AndroidRuntime( 1087): FATAL EXCEPTION: main E/AndroidRuntime( 1087): java.lang.IllegalArgumentException: bitmap size exceeds 32bits E/AndroidRuntime( 1087): at android.graphics.Bitmap.nativeCreate(Native Method) E/AndroidRuntime( 1087): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) E/AndroidRuntime( 1087): at android.graphics.Bitmap.createBitmap(Bitmap.java:585) E/AndroidRuntime( 1087): at android.view.View.buildDrawingCache(View.java:10626) E/AndroidRuntime( 1087): at android.view.View.getDrawingCache(View.java:10476) E/AndroidRuntime( 1087): at android.view.ViewGroup.drawChild(ViewGroup.java:2743) E/AndroidRuntime( 1087): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) E/AndroidRuntime( 1087): at android.widget.AbsListView.dispatchDraw(AbsListView.java:2092) E/AndroidRuntime( 1087): at android.view.View.draw(View.java:11083) E/AndroidRuntime( 1087): at android.widget.AbsListView.draw(AbsListView.java:3398) E/AndroidRuntime( 1087): at android.view.ViewGroup.drawChild(ViewGroup.java:2887) E/AndroidRuntime( 1087): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) E/AndroidRuntime( 1087): at android.view.ViewGroup.drawChild(ViewGroup.java:2885) E/AndroidRuntime( 1087): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) E/AndroidRuntime( 1087): at android.view.ViewGroup.drawChild(ViewGroup.java:2885) E/AndroidRuntime( 1087): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489) E/AndroidRuntime( 1087): at android.view.View.draw(View.java:10981) E/AndroidRuntime( 1087): at android.widget.FrameLayout.draw(FrameLayout.java:450) E/AndroidRuntime( 1087): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126) E/AndroidRuntime( 1087): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026) E/AndroidRuntime( 1087): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) E/AndroidRuntime( 1087): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) E/AndroidRuntime( 1087): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 1087): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime( 1087): at android.app.ActivityThread.main(ActivityThread.java:4424) E/AndroidRuntime( 1087): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 1087): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime( 1087): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) E/AndroidRuntime( 1087): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) E/AndroidRuntime( 1087): at dalvik.system.NativeStart.main(Native Method)

2.3.3 のエミュレーターで同じコードを実行すると、すべて問題ありません。

いくつかの調査の後、私は問題の「原因」を見つけました (-。 のgetViewメソッドをもう一度見てくださいEventGridAdapter:

        int viewHeight = gridView.getHeight();
        int spacing = 1;
        int height = viewHeight / 5 - spacing; 
        cell.setMinimumHeight(height);

問題の行は次のとおりです。

cell.setMinimumHeight(height);

それを次のように変更すると:

cell.setMinimumHeight(10);

...クラッシュが消える

しかし、私は何を間違っているのかわかりませんか?すべてが論理的に正しいように見えます。5 行が必要です。また、height低くしても役に立ちません (すべての行がビュー領域にある場合、たとえばスクロールが不要な場合):

int height = viewHeight / 7 - spacing;

あなたのアドバイスは?

4

1 に答える 1

2

問題は聞くことです...

gridView.getHeight()

なぜ? 作成したばかりの時点でグリッドビューの高さがないため

このメソッドは、onWindowfocuschangedviewTreeobserver で、または使用して使用できます。

以下のように

ViewTreeObserver vto1 = gridView.getViewTreeObserver();
        vto1.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

            public void onGlobalLayout() {
                // write hear for height

                Log.i(TAG, "from VTO" + gridView.getHeight());
                ViewTreeObserver obs = gridView.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
            }
        });
于 2012-07-09T09:25:35.103 に答える