0

Я создаю галерею изображений в Android похожа на следующее: image galleryНевозможно создать представления с помощью GridLayout программно

Я использую Gridlayout как основная раскладку и Linearlayouts для элементов. Это, как я это делаю:

//this is a method that returns a polaroid tile that I add in gridlayout 
public LinearLayout ConstructAlbumGridLinearLayout(final int id) { 

     LinearLayout albumLayout = new LinearLayout(
       context.getApplicationContext()); 
     RelativeLayout albumDetailsLayout = new RelativeLayout(
       context.getApplicationContext()); 
     TextView albumName = new TextView(context.getApplicationContext()); 
     TextView albumPicturesNumber = new TextView(
       context.getApplicationContext()); 
     LinearLayout pictureHolder = new LinearLayout(
       context.getApplicationContext()); 

     LinearLayout pictureRowOneHolder = new LinearLayout(
       context.getApplicationContext()); 
     LinearLayout pictureRowTwoHolder = new LinearLayout(
       context.getApplicationContext()); 

//this is the line, which throws an exception, even if I do wrap_content 
//  albumLayout.setLayoutParams(new LayoutParams(100, 
//    100)); 

     pictureRowOneHolder.setOrientation(LinearLayout.HORIZONTAL); 
     pictureRowOneHolder.setLayoutParams(new LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     pictureRowTwoHolder.setOrientation(LinearLayout.HORIZONTAL); 
     pictureRowTwoHolder.setLayoutParams(new LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     pictureHolder.setLayoutParams(new LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     pictureHolder.setOrientation(LinearLayout.VERTICAL); 

     albumLayout.setOrientation(LinearLayout.VERTICAL); 

     albumDetailsLayout.setLayoutParams(new LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

     RelativeLayout.LayoutParams rlName = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     rlName.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     albumName.setLayoutParams(rlName); 
     albumName.setText("Family"); 

     RelativeLayout.LayoutParams rlSize = new RelativeLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     rlSize.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     albumPicturesNumber.setLayoutParams(rlSize); 
     albumPicturesNumber.setText("3"); 

     for (int j = 0; j < 2; ++j) { 
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        30, 30); 
      ImageView albumPic = new ImageView(context.getApplicationContext()); 
      albumPic.setImageResource(R.drawable.movie1); 
      albumPic.setLayoutParams(layoutParams); 
      pictureRowOneHolder.addView(albumPic); 
     } 

     for (int j = 0; j < 2; ++j) { 
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        30, 30); 
      ImageView albumPic = new ImageView(context.getApplicationContext()); 
      albumPic.setImageResource(R.drawable.movie1); 
      albumPic.setLayoutParams(layoutParams); 
      pictureRowTwoHolder.addView(albumPic); 
     } 

     pictureHolder.addView(pictureRowOneHolder); 
     pictureHolder.addView(pictureRowTwoHolder); 

     albumDetailsLayout.addView(albumName); 
     albumDetailsLayout.addView(albumPicturesNumber); 

     albumLayout.addView(albumDetailsLayout); 
     albumLayout.addView(pictureHolder); 

     return albumLayout; 

    } 

Затем я добавляю это расположение в моем макете сетки:

gl.addView(pictureGallery.ConstructAlbumGridLinearLayout(i)); 

Это мой XML file:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:id="@+id/albumLinearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/pictureType" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="My Albums" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <GridLayout 
     android:id="@+id/albumMainGrid" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

Я не уверен, что неправильно Я здесь ... Является ли это самой сеткой? Или Lingleayout с gridlayout окажется проблемой?

EDIT - Вот исключение:

02-13 20:11:28.250: E/AndroidRuntime(5040): FATAL EXCEPTION: main 
02-13 20:11:28.250: E/AndroidRuntime(5040): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.GridLayout$LayoutParams 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.GridLayout.getLayoutParams1(GridLayout.java:729) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.GridLayout.validateLayoutParams(GridLayout.java:663) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.GridLayout.getLayoutParams(GridLayout.java:734) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:866) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.GridLayout.onMeasure(GridLayout.java:894) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.View.measure(View.java:12775) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:670) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:563) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.View.measure(View.java:12775) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.View.measure(View.java:12775) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:822) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:563) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.View.measure(View.java:12775) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2240) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.View.measure(View.java:12775) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1151) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2539) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.os.Looper.loop(Looper.java:137) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at android.app.ActivityThread.main(ActivityThread.java:4514) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
02-13 20:11:28.250: E/AndroidRuntime(5040):  at dalvik.system.NativeStart.main(Native Method) 
+0

У вас есть пример ошибок, которые вы видите? LogCat? Трассировки стека? Наблюдения? –

+0

@ biddulph.r Я добавил описание ошибки – faizanjehangir

+1

В вашем коде я вижу проблему, и я думаю, что это может быть причиной вашего исключения: Вы применяете к альбому LayoutParams вместо GridLayout.LayoutParams. –

ответ

2

С вашей LogCat это выглядит, как вы литье ViewGroup.LayoutParams класса к GridLayout.LayoutParams. Это общая проблема при вызове метода конструктора LayoutParams, как у вас есть:

albumLayout.setLayoutParams(new LayoutParams(100, 100)); 

Вы хотите быть конкретными с LayoutParams, так что если вы используете GridLayout, используйте GridLayout.LayoutParams и LinearLayout использования LinearLayout.LayoutParams и т.д. Это останавливает неправильную загрузку версии, поскольку вы всегда хотите использовать родительский класс вашей группы просмотра.

В приведенном выше примере albumLayout является GridLayout, поэтому вы хотите использовать GridLayout.LayoutParams. Изменить эту строку следующим образом:

albumLayout.setLayoutParams(new GridLayout.LayoutParams(100, 100)); 

У вас также есть несколько случаев, когда у вас есть LinearLayouts и RelativeLayout, которые могли бы сделать с тем же изменением. (LinearLayout.LayoutParams и RelativeLayout.LayoutParams).

+0

'albumLayout' сам является« LinearLayout », я попробовал:' albumLayout.setLayoutParams (новый LinearLayout.LayoutParams (100 , 100)); '.. такое же исключение .. – faizanjehangir

+0

Получил его на работу. Вы были правы в том, что вы устанавливаете' LayoutParams' в свой родительский класс 'ViewGroup' .. – faizanjehangir

Смежные вопросы