Ответ 1
Как уже отмечалось в комментариях, вам нужно четко определить, что вы хотите сделать, прежде чем принять конкретное решение о том, какой тип макета использовать. Тем не менее, я могу, конечно, понять путаницу, возникающую из-за того, что вы пытаетесь решить, какой тип класса макета использовать, потому что для достижения той же цели часто бывает несколько вариантов. Например, чтобы создать список элементов с вертикальной прокруткой, вы можете сначала выбрать вертикальный LinearLayout
, который вы разместили бы внутри ScrollView
. Но, с другой стороны, для достижения аналогичного конечного результата вы можете использовать ListView
вместе с подходящим Adapter
.
Аналогично, чтобы показать сетку элементов, которые можно прокручивать по вертикали, вы можете использовать TableLayout
внутри a ScrollView
. Или аналогичный результат может быть достигнут при использовании a GridView
, опять же путем подачи данных через подходящий Adapter
.
Теперь первое ключевое различие заключается в следующем: Классы типа LinearLayout
и TableLayout
требуют, чтобы вы поставляли дочерние элементы либо в макетах XML, либо программно в коде. Классы типа ListView
и GridView
(и несколько других) очень разные, потому что они являются подклассами android.widget.AdapterView
. Особенность классов AdapterView
заключается в том, что для привязки данных к ним используется Adapter
. Итак, вернемся к примеру вертикального списка элементов, если вы показывали группу элементов списка дочерних элементов внутри LinearLayout
на основе некоторых данных массива, вам нужно было бы программно создать и добавить child View
в это LinearLayout
на основе данных массива. С ListView
с другой стороны, индивидуальный View
, представляющий дочерние элементы, предоставляется из подходящего Adapter
. Таким образом, вместо того, чтобы вы программно заполняли макет всеми дочерними элементами (например, в случае с LinearLayout
или TableLayout
), макет Adapter
вместо этого вызывает Adapter
, чтобы получить дочерний элемент View
как и когда он им нужен.
Эта последняя точка - это следующее ключевое различие, которое, как я полагаю, вы должны понимать в отношении макетов на основе Adapter
: они намного эффективнее демонстрируют большие объемы данных в ситуациях, когда большая часть данных прокручивается из поля зрения. Например, ListView
гораздо эффективнее использовать для отображения большого списка прокрутки элементов, чем если бы вы просто заполнили LinearLayout
всеми элементами и поместили его внутри ScrollView
. Причиной этой эффективности является то, что макеты AdapterView
основаны не на всех дочерних View
всех одновременно. Вместо этого, когда пользователь прокручивает список, существующие дочерние представления "перерабатываются" или "преобразуются" с помощью Adapter
, чтобы показать следующие дочерние элементы. Чтобы проиллюстрировать это на примере: вам нужен прокручиваемый вертикальный список из 100 элементов. Однако экран может быть достаточно большим, чтобы отображать 7 одновременно. Представьте, что вы используете LinearLayout
внутри ScrollView
для отображения 100 элементов списка. Это означает, что контейнер LinearLayout
имеет 100 дочерних Views
. Эти дети всегда присутствуют в макете и должны обрабатываться системой во время событий прокрутки, даже если на экране одновременно может отображаться только семь. Это требует дополнительного времени процессора, значительного объема оперативной памяти, а прокрутка может быть вялой. Теперь, с ListView
, макет, вероятно, будет содержать только 7 или 8 дочерних View
s. Когда пользователь прокручивает, те дочерние View
динамически конвертируются или повторно создаются с помощью Adapter
, через которые вы связываете свои данные. Пользователь будет выполнять более быструю и плавную прокрутку. С точки зрения программирования обычно гораздо более элегантно связывать списки данных с помощью Adapter
. Когда вы имеете дело со списками прокрутки или сетками Bitmap
s, ограничения памяти устройства Android
также означают, что использование AdapterView
очень важно.
Имейте в виду, что, отвечая на это, я сделал предположение, что вы пытаетесь показать вертикальный или табличный список элементов, которые можно прокручивать, возможно, включая Bitmap
s, и я концентрируюсь на типе макета, который вы использовали для достижения макета и прокрутки этих данных. Классы макетов, такие как LinearLayout
, TableLayout
и т.д., Однако, являются важными классами, которые вы будете использовать все время для формирования отдельных компоновочных блоков для ваших приложений. Если весь ваш список будет помещен в экран и не будет прокручиваться, то дополнительная сложность использования Adapter
(а не того, что это действительно так сложно) может быть бессмысленной, и вы можете просто захотеть использовать TableLayout
или что-то еще.