2013-03-20 5 views
0

У меня есть вид xml, который содержит ScrollView (с ребенком LinearLayout).Progammatically Добавление LinearLayouts в ScrollView

... 
    <ScrollView 
     android:id="@+id/scrollView_container" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_marginTop="33dp" > 

     <LinearLayout 
      android:id="@+id/image_holder" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
     </LinearLayout> 
    </ScrollView> 
... 

Я пытаюсь динамически добавлять некоторые изображения, я хочу 3 за строку.

private void createDice(LinearLayout ll, Integer required) { 
    ArrayList<Integer> images = new ArrayList<Integer>(); 
    images.add(R.drawable.one); 
    images.add(R.drawable.two); 
    images.add(R.drawable.three); 
    images.add(R.drawable.four); 
    images.add(R.drawable.five); 
    images.add(R.drawable.six); 

    ScreenHelper screen = new ScreenHelper(MainActivity.this); 
    Map<String, Float> s = screen.getScreenSize(); 
    Integer maxPerRow = (int) (s.get("width")/90); // images are 89px wide 
    Log.d(TAG, "max across::"+maxPerRow); 

    Integer rows = (required/maxPerRow); 
    Log.d(TAG, "rows::"+rows); 
    for (int i=0; i < rows; i++) { 
     Log.d(TAG, "i::"+i); 
     // create linear layout for row 
     LinearLayout llAlso = new LinearLayout(this); 
     llAlso.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
     //llAlso.setOrientation(LinearLayout.HORIZONTAL); 

     for (int j=0; j < 3; j++) { 
      Log.d(TAG, "j::"+j); 
      // create/add image for the row 
      ImageView iv = new ImageView(this); 
      iv.setImageResource(images.get(i)); 
      llAlso.addView(iv); 
     } 
     // add to main layout 
     ll.addView(llAlso, i); 
     Log.d(TAG, "adding to main view"); 
    } 
} 

Я тестирую с требуется значение параметра 6.
Проблема состоит в том, что первая строка изображения добавляется, но либо второй не потому, что он становится добавлен прилегающая к первой строки (и, следовательно, с экрана), а не под ней.

Любые идеи о том, как достичь желаемого результата?

+0

Похоже на то, что вы пытаетесь выполнить, очень хорошо подходит для «GridView» и почему вы против этого? –

+0

@BrentHronik Я не против использования GridView (теперь я знаю), но мне все же нравится закончить то, что я начал, даже если это не лучший способ. – Rooneyl

ответ

4

Настройте ориентацию в своем image_holder макете до vertical. По умолчанию ориентация LinearLayout составляет horizontal. Это означает, что все дочерние представления будут добавлены в горизонтальной строке. Так как макеты вашего ребенка используют fill_parent для их ширины, в строке может поместиться только один ребенок. Переключив его на vertical, ваши макеты добавляются в вертикальном столбце, а не в строке. Это позволяет видеть больше макетов.

Также следует рассмотреть возможность использования GridLayout. Это сделано именно для этого случая.

+0

Спасибо, что работает. Можете ли вы объяснить, почему это так. – Rooneyl

+1

@Rooneyl По умолчанию ориентация «LinearLayout» является «горизонтальной». Это означает, что все дочерние представления будут добавлены в горизонтальной строке. Так как ваши макеты для детей используют 'fill_parent' для своей ширины, только один ребенок может поместиться в строку. Переключая его на «вертикальный», ваши макеты добавляются в вертикальном столбце, а не в строке. Это позволяет видеть больше макетов. – MCeley

+0

@MCeley спасибо за объяснение – Rooneyl

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