2011-02-11 3 views
0

Я изо всех сил пытаюсь выложить два ListViews в вертикальном LinearLayout. Наконец я увидел ответ об обертывании каждого в своем LinearLayout и добавлении каждого из этих LinearLayouts к исходному LinearLayout с весами 1. Так вот что я пытался ... но я просто не могу заставить это работать.Проблема с двумя списками ListViews

Я делаю все это в коде:

public class MyDualList extends LinearLayout 
{ 
    private LinearLayout _layout1; 
    private LinearLayout _layout2; 
    private ListView  _list1; 
    private ListView  _list2; 

    public MyDualList(Context context, ListView list1, ListView list2) 
    { 
     super(context); 

     _list1 = list1; 
     _list2 = list2; 

     _layout1 = new LinearLayout(context); 
     _layout1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 0, 1)); 
     _layout1.addView(_list1, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

     _layout2 = new LinearLayout(context); 
     _layout2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 0, 1)); 
     _layout2.addView(_list2, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

     addView(_layout1); 
     addView(_layout2); 
    } 
} 

Это моя последняя попытка, но я клянусь, что я пробовал все комбинации/установки для высоты LayoutParams' (FILL_PARENT, WRAP_CONTENT, 0), как а также различные веса.

Результат не очень хороший; если мой второй список очень длинный, он неизбежно занимает подавляющее большинство первоначальной вертикальной компоновки (конечно, гораздо больше, чем 50%).

Я не собираюсь сдаваться! Может быть, кто-то может мне немного помочь.

Спасибо, Кена

+0

Не уверен, что это связано, но я думаю, что была разница с методами addView. Можете ли вы попытаться позвонить: 'addView (_layout1, new LayoutParams (LayoutParams.FILL_PARENT, 0, 1));' вместо того, чтобы заранее устанавливать LayoutParams. То же самое для '_layout2'. –

+0

@ Себастиан - это не будет иметь никакого значения. 'addView (aView)' точно так же, как 'addView (aView, aView.getLayoutParams())'. –

+0

Я не совсем уверен, зачем вам нужны _layout1 и _layout2. Почему бы просто не установить высоту _list1 и _list2 в 0, их вес в 1 и добавить их непосредственно в двойной список? –

ответ

1

Вы заменяете правильный Params макета (те, вы установили с setLayoutParams) с неправильным Params макета (тот, который вы пройти в addView.) Просто позвоните addView (_list1) вместо того, чтобы, не уточнив, параметры макета. Edit: Извините, я неправильно понял код, игнорировать это :)

+0

Действительно?Как вызывать '_layout1.addView (_list1, new LayoutParams (...)) влияет на параметры макета, установленные для _layout1? Если это то, что происходит, _layout1 всегда будет заполнять родительскую высоту и будет выталкивать _layout2 с экрана, но это не то, что отчеты OP происходят. –

2

Я хотел бы попросить вас, чтобы переместить вид логики в XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
     > 
    <ListView 
      android:id="@+id/list1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      /> 
    <ListView 
      android:id="@+id/list2" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      /> 
</LinearLayout> 

Java код может быть:

final String[] data1 = new String[] { "1a", "1b", "1c", "1d", "1e", "1f", "1g", "1h", "1i" }; 
final String[] data2 = new String[] { "2a", "2b", "2c", "2d", "2e", "2f", "2g", "2h", "2i" }; 

final ListView l1 = (ListView) findViewById(R.id.list1); 
final ListView l2 = (ListView) findViewById(R.id.list2); 

l1.setAdapter(new ArrayAdapter<String>(this, R.layout.item, R.id.text, data1)); 
l2.setAdapter(new ArrayAdapter<String>(this, R.layout.item, R.id.text, data2)); 

Кроме того, если вы настаиваете на Java-кодировании для пользовательского интерфейса, я попытаюсь установить LayoutParams в ваших звонках на addView(_layout1) ->addView(_layout1, new LayoutParams(LayoutParams.FILL_PARENT, 0, 1)).

BTW: Где вы задаете ориентацию этого макета? По умолчанию Горизонтальный.

+0

Я отрезал только немного моего кода для этой публикации. Мой класс на самом деле является вертикальным LinearLayout. – Ken

0

Так вот решение 2:

public class Q4965745 extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

//  setContentView(R.layout.main); 
     setContentView(new Q4965745View(this)); 

     final String[] data1 = new String[]{"1a", "1b", "1c", "1d", "1e", "1f", "1g", "1h", "1i"}; 
     final String[] data2 = new String[]{"2a", "2b", "2c", "2d", "2e", "2f", "2g", "2h", "2i"}; 

     final ListView l1 = (ListView) findViewById(11); 
     final ListView l2 = (ListView) findViewById(22); 

     l1.setAdapter(new ArrayAdapter<String>(this, R.layout.item, R.id.text, data1)); 
     l2.setAdapter(new ArrayAdapter<String>(this, R.layout.item, R.id.text, data2)); 
    } 

    class Q4965745View extends LinearLayout { 
     public Q4965745View(Context context) { 
      super(context); 
      Q4965745View.this.setOrientation(LinearLayout.VERTICAL); 

      ListView lv1 = new ListView(context); 
      lv1.setId(11); 

      ListView lv2 = new ListView(context); 
      lv2.setId(22); 

      Q4965745View.this.addView(lv1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f)); 
      Q4965745View.this.addView(lv2, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f)); 
     } 
    } 
} 

Который производит:

Screenshot

EDIT:

При заполнении data2 1000 записей:

final String[] data2 = new String[1000]; 
for(int i = 0; i < 1000; i++) { 
    data2[i] = "test" + i; 
} 

я все еще получаю такое же расположение:

Screenshot 50/50 * 1000 entries

EDIT 2:

Я был в состоянии получить "лучшее поведение" по крайней мере, с помощью TableLayout:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
    <TableRow> 
     <ListView 
       android:id="@+id/list1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       /> 
    </TableRow> 
    <TableRow> 
     <ListView 
       android:id="@+id/list2" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1" 
       /> 
    </TableRow> 
</TableLayout> 

Возможно, у Ромена есть идея о том, как сделать его действительно независимым от 50/50 нт от количества элементов в ListView с ..

РЕДАКТИРОВАТЬ 3:

Хорошо, окончательное решение (используя внутреннюю LinearLayout):

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     > 
    <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      > 
     <ListView 
       android:id="@+id/list1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       /> 
    </LinearLayout> 
    <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1" 
      > 
     <ListView 
       android:id="@+id/list2" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       /> 
    </LinearLayout> 
</LinearLayout> 

достаточно Может быть хорошо? ;-)

+0

Спасибо за предложение. Но я думаю, вы обнаружите, что если вы сделаете свой второй список намного дольше, чем первый (в моих тестовых случаях в первом списке было 3 записи, во втором - более 1000 записей), вы больше не увидите 50/50 Трещина. Может быть неправильно, но я считаю, что это поведение, которое я видел ... – Ken

+0

Жаль, что я не смог согласиться. Проделал некоторый тест, но не смог воспроизвести вашу проблему, см. Мое редактирование. Вы проверяли версию SDK, целевую версию SDK, телефон и т. Д.? Может быть, некоторые подробности? –

+0

А, наконец, я вижу: я установил «data1» в 3 элемента -> макет разбит так, как вы объяснили. Я предполагаю, что в этом случае вам нужно обернуть дочерние макеты. 'LinearLayout', вероятно, переустанавливает минимальную высоту. EDIT: нужно будет проверить это, простое добавление дочернего макета может не решить проблему. –

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