Custom ArrayAdapter
Using a Custom ArrayAdapter
When we want to display a series of items from a list using a custom representation of the items, we need to use our own custom XML layout for each item. To do this, we need to create our own custom ArrayAdapter class.
Defining the Model
First, you have to define your custom class, in this example, I will use a class called User.java
public class User {
private String name;
private String phone;
public User(String name, String phone) {
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
}
Creating the View Template
Next, we need to create an XML layout that represents the view template for each item in res/layout/item_user.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="16sp" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="16sp" />
</LinearLayout>
This is not your MainActivity layout
Your MainActivity Layout should only contain ListView as following:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/my_list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
Defining the Adapter
public class UserAdapter extends BaseAdapter {
private Context context;
private ArrayList<User> arrayList;
private TextView name, phone;
public UserAdapter(Context context, ArrayList<User> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_user,
parent, false );
name = convertView.findViewById(R.id.name);
phone = convertView.findViewById(R.id.phone);
name.setText(arrayList.get(position).name);
phone.setText(arrayList.get(position).phone);
return convertView;
}
}
LayoutInflater
will take an XML file and convert it to view object
inflate
public View inflate (XmlPullParser parser,
ViewGroup root,
boolean attachToRoot)
Inflate a new view hierarchy from the specified XML node. Throws InflateException if there is an error.
Important For performance reasons view inflation relies heavily on pre-processing of XML files that is done at build time. Therefore, it is not currently possible to use LayoutInflater with an XmlPullParser over a plain XML file at runtime.

MainActivity
package com.example.customelist;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<User> arrayOfUsers = new ArrayList<>();
arrayOfUsers.add(new User("Eve", "777-777-7777"));
arrayOfUsers.add(new User("John", "777-777-7777"));
arrayOfUsers.add(new User("Mark", "777-777-7777"));
arrayOfUsers.add(new User("Michael", "777-777-7777"));
arrayOfUsers.add(new User("Adam", "777-777-7777"));
arrayOfUsers.add(new User("Mary", "777-777-7777"));
arrayOfUsers.add(new User("Olivia", "777-777-7777"));
// Create the adapter to convert the array to views
UserAdapter adapter = new UserAdapter(this, arrayOfUsers);
// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.my_list_view);
listView.setAdapter(adapter);
}
}
Last updated
Was this helpful?