Я столкнулся с очень распространенной проблемой: я разместил действие, и теперь оказалось, что в нем должны отображаться несколько элементов ScrollView
. Обычный способ сделать это - использовать существующий ListAdapter
, подключить его к a ListView
и БУМ, у меня будет мой список элементов.
НО вы не должны помещать вложенный ListView
в a, ScrollView
поскольку он портит прокрутку - даже Android Lint жалуется на это.
Итак, вот мой вопрос:
Как мне подключить ListAdapter
к LinearLayout
или что-то подобное?
Я знаю, что это решение не масштабируется для многих элементов, но мои списки очень короткие (<10 элементов), поэтому повторное использование представлений на самом деле не требуется. Что касается производительности, я могу жить, помещая все представления прямо в файл LinearLayout
.
Одно из решений, которое я придумал, - это разместить существующий макет активности в разделе headerView файла ListView
. Но это похоже на злоупотребление этим механизмом, поэтому я ищу более чистое решение.
Идеи?
ОБНОВЛЕНИЕ: Чтобы вдохновить правильное направление, я добавляю образец макета, чтобы показать мою проблему:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_detail_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/news_detail_layout_side_padding"
android:paddingRight="@dimen/news_detail_layout_side_padding"
android:paddingTop="@dimen/news_detail_layout_vertical_padding"
android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
>
<TextView
android:id="@+id/news_detail_date"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="LALALA"
android:textSize="@dimen/news_detail_date_height"
android:textColor="@color/font_black"
/>
<Gallery
android:id="@+id/news_detail_image"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingTop="5dip"
android:paddingBottom="5dip"
/>
<TextView
android:id="@+id/news_detail_headline"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="Some awesome headline"
android:textSize="@dimen/news_detail_headline_height"
android:textColor="@color/font_black"
android:paddingTop="@dimen/news_detail_headline_paddingTop"
android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
/>
<TextView
android:id="@+id/news_detail_content"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Here comes a lot of text so the scrollview is really needed."
android:textSize="@dimen/news_detail_content_height"
android:textColor="@color/font_black"
/>
<!---
HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER.
They should be positioned at the end of the content, so making the scrollview smaller is not an option.
---->
</LinearLayout>
</ScrollView>
</LinearLayout>
ОБНОВЛЕНИЕ 2 Я изменил заголовок, чтобы его было легче понять (получил отрицательный голос, о!).
источник
Ответы:
Вероятно, вам следует просто вручную добавить свои элементы в
LinearLayout
:РЕДАКТИРОВАТЬ : Я отклонил этот подход, когда мне нужно было отобразить около 200 нетривиальных элементов списка, это очень медленно - Nexus 4 потребовалось около 2 секунд для отображения моего «списка», что было недопустимо. Поэтому я обратился к подходу Фло с заголовками. Это работает намного быстрее, потому что представления списков создаются по запросу, когда пользователь прокручивает, а не во время создания представления.
Резюме: ручное добавление представлений в макет легче кодировать (что потенциально снижает количество движущихся частей и ошибок), но страдает проблемами производительности, поэтому, если у вас около 50 представлений или более, я советую использовать подход заголовка.
Пример. В основном макет активности (или фрагмента) преобразуется примерно в это (ScrollView больше не нужен):
Затем в
onCreateView()
(я буду использовать пример с фрагментом) вам нужно добавить представление заголовка, а затем установить адаптер (я предполагаю, что идентификатор ресурса заголовкаheader_layout
):источник
ListAdapter
и онаListView
творит больше магии за экранами, чего я тогда не делаю вручную.notifyDataSetChanged
метода адаптера ? Это отлично работает с другим адаптером, который я подключил к aListView
, но, похоже, он не работает с тем, что я подключил кLinearLayout
.Я бы придерживался решения для просмотра заголовков. В этом нет ничего плохого. На данный момент я реализую деятельность, используя точно такой же подход.
Очевидно, что «элементная часть» более динамична, чем статическая (различное количество элементов или исправление количества элементов и т. Д.), Иначе вы вообще не будете думать об использовании адаптера. Поэтому, когда вам нужен адаптер, используйте ListView.
Реализация решения, которое заполняет LinearLayout из адаптера, - это не что иное, как создание ListView с настраиваемым макетом.
Только мои 2 цента.
источник
ListView
. Не уверен, что мне нравится этот патч.Установите вид main.xml onCreate, затем надуйте из row.xml
main.xml
row.xml
источник
Я использую следующий код, который воспроизводит функциональность адаптера с помощью
ViewGroup
иTabLayout
. Хорошая вещь в том, что если вы измените свой список и снова выполните привязку, это повлияет только на измененные элементы:Использование:
Для
ViewGroups
:Для
TabLayout
меня это:источник