2015-03-25 3 views
1

Моя цель - добавить несколько кнопок (в сетке из четырех столбцов) в RelativeLayout в зависимости от количества «элементов» в базе данных. Когда я был первым узнать, как добавить кнопки к RelativeLayout я только что создал 6 статические кнопки и добавили их следующим образом (ItemButton просто класс, который расширяет Button):Динамическое добавление кнопки в RelativeLayout не работает правильно

private void loadItemButtons2(){ 
    itemButtonLayout = (RelativeLayout)findViewById(R.id.itemButtonLayout); 
    itemButtonLayout.removeAllViews(); 
    ArrayList<Item> items = db.getAllActiveItems(); 
    ItemButton b1, b2, b3, b4, b5, b6; 
    b1 = new ItemButton(this, items.get(0)); 
    b2 = new ItemButton(this, items.get(1)); 
    b3 = new ItemButton(this, items.get(2)); 
    b4 = new ItemButton(this, items.get(3)); 
    b5 = new ItemButton(this, items.get(4)); 
    b6 = new ItemButton(this, items.get(5)); 

    RelativeLayout.LayoutParams params1 = (RelativeLayout.LayoutParams)b1.getLayoutParams(); 
    params1.addRule(RelativeLayout.ALIGN_PARENT_START); 
    b1.setId(111); 
    b1.setLayoutParams(params1); 

    RelativeLayout.LayoutParams params2 = (RelativeLayout.LayoutParams)b2.getLayoutParams(); 
    params2.addRule(RelativeLayout.RIGHT_OF, 111); 
    b2.setId(222); 
    b2.setLayoutParams(params2); 

    RelativeLayout.LayoutParams params3 = (RelativeLayout.LayoutParams)b3.getLayoutParams(); 
    params3.addRule(RelativeLayout.RIGHT_OF, 222); 
    b3.setId(333); 
    b3.setLayoutParams(params3); 

    RelativeLayout.LayoutParams params4 = (RelativeLayout.LayoutParams)b4.getLayoutParams(); 
    params4.addRule(RelativeLayout.RIGHT_OF, 333); 
    b4.setId(444); 
    b4.setLayoutParams(params4); 

    RelativeLayout.LayoutParams params5 = (RelativeLayout.LayoutParams)b5.getLayoutParams(); 
    params5.addRule(RelativeLayout.ALIGN_PARENT_START); 
    params5.addRule(RelativeLayout.BELOW, 111); 
    b5.setId(555); 
    b5.setLayoutParams(params5); 

    RelativeLayout.LayoutParams params6 = (RelativeLayout.LayoutParams)b6.getLayoutParams(); 
    params6.addRule(RelativeLayout.RIGHT_OF, 555); 
    params6.addRule(RelativeLayout.BELOW, 222); 
    b6.setId(666); 
    b6.setLayoutParams(params6); 

    itemButtonLayout.addView(b1); 
    itemButtonLayout.addView(b2); 
    itemButtonLayout.addView(b3); 
    itemButtonLayout.addView(b4); 
    itemButtonLayout.addView(b5); 
    itemButtonLayout.addView(b6); 
} 

И это дает мне идеальный результат:

enter image description here

но это динамическое решение, которое я придумал, и мне кажется, что это делает одно и то же, но результаты вышли супер шаткий:

private void loadItemButtons(){ 
    itemButtonLayout = (RelativeLayout)findViewById(R.id.itemButtonLayout); 
    itemButtonLayout.removeAllViews(); 
    ArrayList<Item> items = db.getAllActiveItems(); 
    int colCount = 0; 
    int rowCount = 0; 
    int i = 0; 

    while(i < items.size()-1){ 
     ItemButton newItemButton = new ItemButton(this, items.get(i)); 
     RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)newItemButton.getLayoutParams(); 
     newItemButton.setId(i); 

     if(colCount == 0){ 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); 
     }else if(colCount == 1){ 
      layoutParams.addRule(RelativeLayout.RIGHT_OF, i-1); 
     }else if(colCount == 2){ 
      layoutParams.addRule(RelativeLayout.RIGHT_OF, i-1); 
     }else if(colCount == 3){ 
      layoutParams.addRule(RelativeLayout.RIGHT_OF, i-1); 
     } 

     //If we are in any row except the top row, place in reference to the button above it 
     if(rowCount != 0){ 
      layoutParams.addRule(RelativeLayout.BELOW, i-4); 
     } 

     newItemButton.setLayoutParams(layoutParams); 
     itemButtonLayout.addView(newItemButton); 

     if(colCount == 3){ 
      colCount = 0; 
      rowCount += 1; 
     }else{ 
      colCount += 1; 
     } 

     i++; 
    } 
} 

enter image description here

Может ли кто-нибудь увидеть, что я делаю неправильно или отличается от первого примера ??? Любые советы очень ценятся!

+0

Может быть, вы могли бы просто изменить ** ** видимость существующих кнопок. **Намного легче**. –

+2

Есть ли причина не использовать 'GridView' и иметь ваш макет в xml? – Lamorak

+0

@DerGolem - я считаю, что для этого потребуется определенное количество кнопок, и количество элементов всегда может меняться, поэтому мне нужно динамическое решение. –

ответ

2

Причина этого не удается для вас из идентификаторов вы используете. Android использует «зарезервированные» идентификаторы для таких вещей, как общая область содержимого приложения.

Используя ваш код, я смог добавить 1000 к каждому идентификатору и сгенерировать ожидаемый результат.

Обратите внимание, мой ыборку ниже:

private void loadItemButtons(){ 
    itemButtonLayout = (RelativeLayout)findViewById(R.id.itemButtonLayout); 
    itemButtonLayout.removeAllViews(); 
    List<String> items = itemList; 
    int colCount = 0; 
    int rowCount = 0; 

    // # of items per column 
    int colSpan = 4; 

    final int itemListSize = itemList.size(); 
    for (int i = 0; i < itemListSize; i++) { 
     int id = 1000 + i; 
     ItemButton newItemButton = new ItemButton(this, items.get(i)); 
     RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     newItemButton.setId(id); 

     if(colCount == 0) 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); 
     else 
      layoutParams.addRule(RelativeLayout.RIGHT_OF, id-1); 


     //If we are in any row except the top row, place in reference to the button above it 
     if(rowCount != 0) 
      layoutParams.addRule(RelativeLayout.BELOW, id-colSpan); 

     newItemButton.setLayoutParams(layoutParams); 
     itemButtonLayout.addView(newItemButton); 

     if(colCount == colSpan - 1) 
      rowCount += 1; 

     colCount = (colCount + 1) % colSpan; 
    } 
} 

Кроме того, как уже упоминалось в моем комментарии на исходное сообщение, вы действительно должны использовать GridView для этого, это то, что он был построен для.

Я могу выкопать яму вилами, но я уверен, что лопата будет работать лучше.

My Result

+0

Спасибо, Алекс сейчас работает. Я использовал RelativeLayout, потому что я лучше знаком с ним, чем GridView, но вы правы. Я должен научиться использовать его для подобных ситуаций. Еще раз спасибо! –

0

Я не проверял код:

private void loadItemButtons(){ 
    itemButtonLayout = (RelativeLayout)findViewById(R.id.itemButtonLayout); 
    itemButtonLayout.removeAllViews(); 
    ArrayList<Item> items = db.getAllActiveItems(); 
    int colCount = 0; 
    int rowCount = 0; 
    int i = 0; 

    while(i < items.size()) 
    { 
     ItemButton newItemButton = new ItemButton(this, items.get(i)); 
     RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)newItemButton.getLayoutParams(); 
     newItemButton.setId(i); 

     if(colCount == 0) 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); 
     else 
      layoutParams.addRule(RelativeLayout.RIGHT_OF, i-1); 


     //If we are in any row except the top row, place in reference to the button above it 
     if(rowCount != 0){ 
      layoutParams.addRule(RelativeLayout.BELOW, i-4); 
     } 

     itemButtonLayout.addView(newItemButton, i, layoutParams); 

     if(colCount == 3){ 
      colCount = 0; 
      rowCount += 1; 
     }else{ 
      colCount += 1; 
     } 

     i++; 
    } 
} 
Смежные вопросы