2015-01-02 4 views
1

Я не могу отобразить два последовательных полноразмерных (по высоте) ListViews, которые не будут прокручиваться индивидуально, но только путем прокрутки корневого элемента.Android отображает два полноразмерных ListViews

Эта вещь преследует меня целый день с тех пор, как у меня были различные выходы (два прокручиваемых списка, полу разрезание прокрутки и т. Д.), Но никому не удалось. Прочтите предыдущие записи here, here и here.

Предоставляя вам текущий макет xml, каково может быть решение? Снятие ScrollView, замена LinearLayout на RelativeLayout, установка layout_weight?

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true" 
    > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     > 

     <LinearLayout 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      > 

      <xxx.xxx.xxx.xxx.MultiSpinner 
       android:id="@+id/ad_list_filter" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="0.5" 
       /> 

      <xxx.xxx.xxx.xxx.MultiSpinner 
       android:id="@+id/ad_list_sort" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_weight="0.5" 
       /> 

     </LinearLayout> 

     <ListView 
      android:id="@+id/adListInterests" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_marginLeft="3dp" 
      android:layout_marginRight="3dp" 
      android:divider="@null" 
      android:dividerHeight="5dp" 
      > 
     </ListView> 

     <ImageView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:background="@drawable/ad_list_seperator" 
      /> 

     <ListView 
      android:id="@+id/adListNoninterests" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:layout_marginLeft="3dp" 
      android:layout_marginRight="3dp" 
      android:divider="@null" 
      android:dividerHeight="5dp" 
      > 
     </ListView> 
    </LinearLayout> 
</ScrollView> 

Заранее благодарен!

Edit:

После удаления предложенных ScrollView результатов в двух прокручивать списки. Согласно комментариям, я постараюсь достичь этого, используя предоставленные плагины, однако я все же надеюсь найти решение, основанное только на модификации кода макета. Спасибо за ваше время!

Изображение:

Preview

Планировка:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     > 

     <xxx.xxx.xxx.xxx.MultiSpinner 
      android:id="@+id/ad_list_filter" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      /> 

     <xxx.xxx.xxx.xxx.MultiSpinner 
      android:id="@+id/ad_list_sort" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.5" 
      /> 

    </LinearLayout> 
    <ListView 
     android:id="@+id/adListInterests" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="3dp" 
     android:divider="@null" 
     android:dividerHeight="5dp" 
     > 
    </ListView> 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:background="@drawable/ad_list_seperator" 
     /> 

    <ListView 
     android:id="@+id/adListNoninterests" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="3dp" 
     android:divider="@null" 
     android:dividerHeight="5dp" 
     > 
    </ListView> 
</LinearLayout> 
+0

«Исключение прокрутки» ** рекомендуется ** (это действительно худшая практика **). Что означает «ListViews», который не будет прокручиваться индивидуально, а только путем прокрутки корневого элемента? Возможно, вы можете пересмотреть свой пользовательский интерфейс, чтобы использовать 'ExpandableListView' (отношение родитель/ребенок)? –

+0

@DerGolem просто хотел сказать, что списки должны быть полностью показаны, а прокрутка должна произойти в ScrollView. – sitilge

+0

Знаете ли вы, что размещение ListViews (или любого другого ** прокручиваемого **) внутри ScrollView (или любого другого ** прокручиваемого **) является идеей ** BAD **? –

ответ

0

Всей идея о том, два отдельных ListView были неправильно - вместо того, что я построил один ListView и добавил пользовательскую строку как заголовок для следующего списка после окончания первого.

Описанная мной концепция описана here.

1

Иерархия прав, просто изменить ваш ListView сек код так:

android:layout_height="wrap_content" <!-- cahnge this line --> 
android:layout_weight="xxx" <!-- remove this line --> 

Однако это плохой , неэффективное решение для защиты от взлома памяти. Делая это, вы вынуждаете все взгляды с экрана оставаться в памяти. Лучшим решением будет использование только одного списка с пользовательским адаптером, который обрабатывает несколько наборов данных/типов и заголовок, содержащий прядильщики.

Самое простое и быстрое и правильное решение для вас прямо сейчас будет использовать библиотеку cwac-merge, которая позволит вам загрузить один ListView с данными из mulitple ListAdapter s. После того, как вы понимаете, как это работает, и использовать его, вы можете изменить расположение, как так:

list_header.xml

Вы должны установить вид заголовка программно, прежде чем назначить адаптер слияния к просмотру списка , Вы можете раздуть этот формат XML.

<?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="wrap_content"> 
    <xxx.xxx.xxx.xxx.MultiSpinner.../> 
    <xxx.xxx.xxx.xxx.MultiSpinner.../> 
</LinearLayout> 

list_main.xml

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

<?xml version="1.0" encoding="utf-8"?> 
<ListView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/adListInterests" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:divider="@null" 
    android:dividerHeight="5dp"/> 

Как использовать cwac-слияние

Вам нужно импортировать его в Gradle (для Android Studio)

repositories { 
    maven { 
     url "https://repo.commonsware.com.s3.amazonaws.com" 
    } 
} 

dependencies { 
    compile 'com.commonsware.cwac:merge:1.1.+' 
} 

или загрузить пару .jar с (Затмения)

Это как код будет выглядеть:

View header = LayoutInflater.from(context).inflate(R.layout.list_header, null, false); 

// get references for your Spinners here... 

myListView.addHeader(header, null, false); 

// setup your two adapters as you are doing now 

MergeAdapter adapter = new MergeAdapter(); 
adapter.addAdapter(firstAdapter); // the adapter that you previously used for the first list 
adapter.addAdapter(secondAdapter); // the adapter that you previously used for the second list 
myListView.setAdapter(adapter); 
+0

Спасибо, но могу ли я добиться, не используя какую-либо библиотеку? Просто рефакторинг кода? – sitilge

+0

Почему бы не использовать библиотеку? Он распространяется как «.jar», и вы можете легко импортировать его в Android Studio и Eclipse. Я обновил ответ о том, как использовать его, это действительно chort часть кода. В любом случае вы должны скопировать макет из моего ответа, и если вы не используете библиотеку, вам придется реализовать пользовательский «BaseAdapter». –

+0

Большое спасибо, даст ему шанс. – sitilge

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