I am really confused now as to which one to learn. I am an iPhone app developer and now learning Android development.
I have learnt how to use a ListView
with a static array of strings using an Adapter
. I am used to using custom cells in iPhone, mostly for showing dynamic content like images and text in TableView
s.
So which is the way to go for doing that in Android? TableLayout
or ListView
?
As others have already said in comments, you need to clearly define what you want to do first before making a concrete decision on which type of layout to use. However, I can certainly understand the confusion that arises from trying to decide over which type of layout class to use, because there are often several to choose from to achieve the same objective. For example, to create a vertically-scrolling list of items, you might at first choose a vertical LinearLayout
, which you'd then place inside a ScrollView
. But on the other hand, to achieve a similar end result, you could use a ListView
together with a suitable Adapter
.
Similarly, to show a grid of items that can scroll vertically, you might use a TableLayout
inside a ScrollView
. Or, a similar result could be achieved from using a GridView
, again by supplying data through a suitable Adapter
.
Now, the first key difference is this: Classes like LinearLayout
and TableLayout
require you to supply the child elements either in XML layouts or alternatively programmatically in code. Classes like ListView
and GridView
(and several others) are very different because they are subclasses of android.widget.AdapterView
. The special thing about AdapterView
classes is that an Adapter
is used to bind data to them. So, going back to the example of a vertical list of items, if you were showing a group of child list items inside a LinearLayout
based upon some array data, you would have to programmatically create and add child View
s into that LinearLayout
based upon the array data. With ListView
on the other hand, the individual View
s that represent the child items are supplied from a suitable Adapter
. So, rather than you programmatically filling the layout with all child items (as would be the case with LinearLayout
or TableLayout
for instance), an Adapter
-based layout instead calls the Adapter
to obtain the child View
s as and when it needs them.
That last point is the next key difference I believe you should understand about Adapter
based layouts: They are much more efficient at showing large amounts of data, in situations where much of the data is scrolled out of view. For example, a ListView
is much more efficient to use for displaying a large scrolling list of items than would be if you simply populated a LinearLayout
with all the items and put it inside a ScrollView
. The reason for this efficiency is that AdapterView
-based layouts do not generally contain all child View
s all at once. Instead, as the user scrolls through the list, existing child views are "recycled" or "converted" by the Adapter
to show the next child elements. To illustrate this with an example: You want a scrolling vertical list of 100 items. The screen may only be large enough to display 7 at once, however. Imagine you use a LinearLayout
inside a ScrollView
to show 100 list items. That means the LinearLayout
container has 100 child Views
. Those children are always present in the layout and need to be processed by the system during scroll events, even if only seven can be in view on the screen at one time. This takes extra CPU time, a considerable amount of RAM, and scrolling may be sluggish. Now, with a ListView
, the layout will only probably contain just 7 or 8 child View
s. As the user scrolls, those child View
s are dynamically converted or re-instantiated by the Adapter
through which you bind your data. The user will experience a faster, smoother scrolling operation. From a programming point of view, it is usually far more elegant to bind lists of data through an Adapter
. When you're dealing with scrolling lists or grids of Bitmap
s, the memory constraints of an Android
device also mean the use of an AdapterView
is pretty much essential.
Bear in mind that when answering this, I've made the assumption that you're trying to show a vertical or tabular list of items that is scrollable, perhaps including Bitmap
s, and I'm concentrating on the type of layout that you'd use for achieving the layout and scrolling of that data. Layout classes like LinearLayout
, TableLayout
, etc. however are important classes that you will use all the time to form individual layout building blocks for your applications. If your entire list is guaranteed to fit into the screen and won't be scrollable, then the additional complexity of using an Adapter
(not that it is really that complicated) may be pointless and you might then just want to use a TableLayout
or whatever.