Android Listview with multiple row layout

This Android Listview tutorial describes how to use Android ListView with multiple rows. Usually, we are used to a ListView with all rows having the same layout. This tutorial describes how to handle Android ListView with multiple row layout or in other words, rows that have different UI widget inside.
You may already know how to create and handle an Android ListView, if not give a look at this post before reading this post.

Just to remember briefly the main concepts, to create and handle an Android ListView it is necessary:

Declare it in the UI layout
Create a custom adapter or use one of those provided by Android SDK
handle user interactions

At the end of this post, we will create an Android app that looks like the picture shown below:

android listview multiple layout
In this app, we show a Contact list that has two different layouts one that uses an image and another one without an image. Even if the example is quite simple, it is enough to understand how to use several ListView methods to get this result.

How to implement Android Listview with multiple row layout

Usually, when we want to customize the ListView data we use a custom adapter. We know Android provides some basic ready-to-use adapter (i.e ArrayAdapter, SimpleAdapter and so on) . We know, already, that all these adapters have in a common a father class known as BaseAdapter.

When we want to customize how the ListView display the data, we can use one of the adapter class provided by Android or implement our custom adapter, in this case, we will create a custom adapter extending the BaseAdapter.

The BaseAdapter has two methods that are very useful if we want to have multiple row layouts:

  • public int getItemViewType(int position)
  • public int getViewTypeCount()

The method getViewTypeCount “returns the number of types of Views that will be created by getView(int, View, ViewGroup)“.
In other words, this method returns how many different layouts we have in our ListView. The getItemViewType returns the view type of the current row, if you look at the method signature we have the position as a parameter. One thing we should notice is that this method must return an integer value between 0 and the getViewTypeCount() – 1.
So if we want to have multiple row layout, we have to override these methods and returns the right values.

How to implement a multiple row layout in ListView

As first thing to implement an app with Android ListView with multiple rows, we have to create a custom adapter, that we call ContactAdapter:

[java]public class ContactAdapter extends BaseAdapter {

}[/java]

and to have two different layouts, we override:

[java]@Override
public int getViewTypeCount() {
return 2;
}
[/java]

and then we have to implement the logic to select the type of layout to assign to the row according to the position value:

[java]@Override
public int getItemViewType(int position) {
return (contactList.get(position).getContactType() == ContactType.CONTACT_WITH_IMAGE) ? 0 : 1;
}[/java]

In this method, we use getContactType to know which layout to use, as you can see we return 0 or 1.

Now we have to implement two different layouts: they are very similar:

[xml]<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/img"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:layout_toRightOf="@id/img"
android:layout_marginTop="2dp"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/surname"
android:layout_toRightOf="@id/name"
android:layout_marginLeft="4dp"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/email"
android:layout_below="@id/name"
android:layout_alignStart="@id/name"
android:layout_marginTop="4dp"/>
</RelativeLayout>[/xml]

and the other one without the image is:

[xml]>RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/surname"
android:layout_toRightOf="@id/name"
android:layout_marginLeft="4dp"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/email"
android:layout_below="@id/name"
android:layout_alignStart="@id/name"
android:layout_marginTop="4dp"/>
</RelativeLayout>[/xml]

Now we have simply to override, in our custom adapter, the getView method:

[java]@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
int type = getItemViewType(position);
if (v == null) {
// Inflate the layout according to the view type
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (type == 0) {
// Inflate the layout with image
v = inflater.inflate(R.layout.image_contact_layout, parent, false);
}
else {
v = inflater.inflate(R.layout.simple_contact_layout, parent, false);
}
}
//
Contact c = contactList.get(position);

TextView surname = (TextView) v.findViewById(R.id.surname);
TextView name = (TextView) v.findViewById(R.id.name);
TextView email = (TextView) v.findViewById(R.id.email);

if (type == 0) {
ImageView img = (ImageView) v.findViewById(R.id.img);
img.setImageResource(c.imageId);
}

surname.setText(c.surname);
name.setText(c.name);
email.setText(c.email);

return v;
}[/java]

Assembling the app

Now we have our custom adapter is very easy to use it and bind it to the ListView. In the main activity that holds the ListView:

[java]@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
ContactAdapter ca = new ContactAdapter(createContact(20), this);
ListView lv = (ListView) findViewById(R.id.contact_list);
lv.setAdapter(ca);
}
[/java]

In this post, we created an Android app using ListView that holds different row layouts.

 

 

    1. Borja October 16, 2014
    2. Borja October 16, 2014
    3. Zainul Setyo Pamungkas October 24, 2014
    4. Zainul Setyo Pamungkas October 24, 2014
    5. Rifqi Fardi Pradhana November 14, 2014
    6. Rifqi Fardi Pradhana November 14, 2014
    7. pratik December 8, 2014
    8. pratik December 8, 2014
    9. Lucas January 21, 2015
    10. Lucas January 21, 2015
    11. Alex January 23, 2015
    12. Виталий Виталий March 11, 2015
      • JavaCoder September 2, 2015
    13. Виталий Виталий March 11, 2015
    14. pavan July 17, 2015
    15. Jim Lu September 5, 2015
    16. Marco De Roni October 16, 2015
    17. Urvi October 31, 2015
    18. ElvisMarmaduke November 10, 2015
    19. Hari December 10, 2015
    20. Mari Luna December 15, 2015
    21. Jose December 22, 2015
    22. Ivette January 25, 2016
    23. Nguyễn Quang Hải March 4, 2016
    24. anuradha March 31, 2016
    25. Andrew Nyago October 4, 2016
    26. Dhana Lakshmi March 24, 2017
    27. Anii Tailor April 15, 2018
    28. mohan kumar April 23, 2018
    29. Rajkumar October 5, 2018
    30. vijay kumari January 23, 2019
    31. Gnakale April 10, 2019

    Add Your Comment