2012-03-18 11 views
2

プログラムでLinearLayoutを作成した後、カスタム書込みアダプタを使用してGridViewにアタッチしたいと考えています。私は、新しく作成されたLinearLayoutに幅と高さを設定したいと思います。私はそうしようとすると、私は例外を以下の取得:ここ親のないLinearLayoutのLayoutParamsを設定する

03-18 15:50:54.648: E/AndroidRuntime(2708): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.GridView.onMeasure(GridView.java:937) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.View.measure(View.java:8313) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.View.measure(View.java:8313) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.View.measure(View.java:8313) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.View.measure(View.java:8313) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.View.measure(View.java:8313) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.os.Looper.loop(Looper.java:130) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-18 15:50:54.648: E/AndroidRuntime(2708):  at dalvik.system.NativeStart.main(Native Method) 

が私のコードです:

public View getView(int position, View convertView, ViewGroup parent){ 
    LinearLayout layout = new LinearLayout(activity); 

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100); 
    layout.setLayoutParams(params); 

    return layout 
} 

すべてのヘルプは理解されるであろう。

答えて

2

GridView.LayoutParamsとお試しください。 LayoutParamsは、親のパラメータでなければなりません。それは!= nullある場合

public View getView(int position, View convertView, ViewGroup parent){ 
    LinearLayout layout = new LinearLayout(activity); 
    layout.setLayoutParams(new GridView.LayoutParams(100, 100)); 
    return layout 
} 

ところでconvertViewを使用する必要があります。それはより速いです。

public View getView(int position, View convertView, ViewGroup parent){ 
    View result = convertView; 
    if (result == null) { 
     result = new LinearLayout(activity); 
     result.setLayoutParams(new GridView.LayoutParams(100, 100)); 
    } 
    // set attributes based on position here 
    return result; 
} 

編集:

// using ViewGroup 
public View getView(int position, View convertView, ViewGroup parent){ 
    ViewGroup result = null; 
    if (convertView instanceof ViewGroup) { 
     result = (ViewGroup) convertView; 
    } else { 
    // that will never happen if you never return anything but ViewGroups 
    } 

    if (result == null) { 
     // since LinearLayout is a (extends) ViewGroup 
     result = new LinearLayout(activity); 
     result.setLayoutParams(new GridView.LayoutParams(100, 100)); 
    } 
    // set attributes based on position here 
    return result; 
} 
+0

ありがとうございます!私のコードで後でViewGroupオブジェクトにする必要があるので、2番目の方法は私には良いことではありません。 –

+0

ViewGroupでも同様に動作します。編集 – zapl

+0

をご覧ください。編集のおかげでよかったです! –

1

LayoutParams親に対して相対的です。

AbsListView.LayoutParams params = new AbsListView.LayoutParams(100,100); 
layout.setLayoutParams(params); 
関連する問題