Custom ListView with BaseAdapter for displaying Map List

ListView with icons

This tutorial shows how to display a Map List containing text and images in a Custom ListView.

Step 1: Create a new project with name ListViewExample and package name com.myexample.listview. Select File/New/New Project. Fill the forms and click “Finish” button.

Step 2: Open res/layout/xml (or) main.xml and add following code. Here we add a ListView mainListview1.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	xmlns:ads="http://schemas.android.com/apk/res-auto"
	tools:context=".MainActivity"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="vertical">

	<ListView
		android:layout_height="wrap_content"
		android:layout_width="wrap_content"
		android:id="@+id/mainListview1"/>

</LinearLayout>

Step 3: In res/drawable/ directory add images to be used in ListView. E.g. ic_info_white_24dp.png, ic_lock_white_24dp.png, ic_security_white.png, ic_volume_up_white.png, home.png.

Step 4: In res/layout/ directory add a new file list_item.xml and add following code. Here we add a TextView for displaying text and an ImageView for displaying images.

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:orientation="horizontal"
	android:background="#990048">

	<ImageView
		android:layout_height="match_parent"
		android:layout_width="wrap_content"
		android:src="@drawable/ic_launcher"
		android:id="@+id/listitemImageView1"
		android:padding="10dp"
		android:scaleType="fitCenter"/>

	<TextView
		android:layout_height="wrap_content"
		android:layout_width="match_parent"
		android:text="Large Text"
		android:id="@+id/listitemTextView1"
		android:padding="12dp"
		android:textSize="16sp"
		android:textColor="#FCFCFC"/>

</LinearLayout>

Step 5: Open app/src/main/java/package and open MainActivity.java. Add following code in it. Here we create a Map list with a title and image at each position, and set an adapter to display this in ListView.

package com.myexample.listview;

import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import java.util.*;
import android.content.*;

public class MainActivity extends Activity {

	private ListView listview1;
	// Create a new Array of type HashMap
	private ArrayList<HashMap<String, Object>> maplist = new ArrayList<>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		listview1 = (ListView) findViewById(R.id.mainListview1);
		
		// Toast item title when ListView item is clicked
		listview1.setOnItemClickListener(new AdapterView.OnItemClickListener(){
				@Override
				public void onItemClick(AdapterView<?> parent, View child, int pos, long _pos){
					Toast.makeText(getApplicationContext(), maplist.get(pos).get("title"), Toast.LENGTH_LONG).show();
				}
			});
		
		// Add items to the Map list
		{
			HashMap<String, Object> _item = new HashMap<>();
			_item.put("title", "Info");
			_item.put("icon", R.drawable.ic_info_white_24dp);
			maplist.add(_item);
		}
		{
			HashMap<String, Object> _item = new HashMap<>();
			_item.put("title", "Privacy Policy");
			_item.put("icon",  R.drawable.ic_lock_white_24dp);
			maplist.add(_item);
		}
		{
			HashMap<String, Object> _item = new HashMap<>();
			_item.put("title", "Security");
			_item.put("icon",  R.drawable.ic_security_white);
			maplist.add(_item);
		}
		{
			HashMap<String, Object> _item = new HashMap<>();
			_item.put("title", "Volume");
			_item.put("icon",  R.drawable.ic_volume_up_white);
			maplist.add(_item);
		}
		{
			HashMap<String, Object> _item = new HashMap<>();
			_item.put("title", "Home");
			_item.put("icon",  R.drawable.home);
			maplist.add(_item);
		}
		
		// Define Custom Adapter for the Map list and display it in ListView		
		CustomListAdapter adapter = new CustomListAdapter(this, maplist);
		listview1.setAdapter(adapter);
		((BaseAdapter)listview1.getAdapter()).notifyDataSetChanged();
		
	}
	
	public class CustomListAdapter extends BaseAdapter {
		private Context context;
		ArrayList<HashMap<String, Object>> items;
		// Public constructor 
		public CustomListAdapter(Context context, ArrayList<HashMap<String, Object>> items) {
			this.context = context;
			this.items = items;
		}

		@Override
		public int getCount() {
			// Return total of items in the list
			return items.size();
		}

		@Override
		public Object getItem(int position) {
			// Return list item at the specified position
			return items.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View v = convertView;
			// Inflate the layout for each list row
			LayoutInflater _inflater = (LayoutInflater)getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			if (v == null) {
				v = _inflater.inflate(R.layout.list_item, null);
			}
			// Set Width of ListView to MATCH_PARENT
			parent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
			// Get the TextView and ImageView from CustomView for displaying item
			TextView txtview = (TextView) v.findViewById(R.id.listitemTextView1);
            ImageView imgview = (ImageView) v.findViewById(R.id.listitemImageView1);
			
			// Set the text and image for current item using data from map list
            txtview.setText(maplist.get(position).get("title").toString());
            imgview.setImageResource(maplist.get(position).get("icon"));
			
			// Return the view for the current row
			return v;
		}
	}

}

Output:
Now run the app. The app will display a ListView with icons and text.

1 thought on “Custom ListView with BaseAdapter for displaying Map List”

  1. Thanks for one’s marvelous posting! I certainly enjoyed reading
    it, you might be a great author.I will make sure to bookmark your blog and will
    eventually come back in the foreseeable future.
    I want to encourage you to ultimately continue your great
    posts, have a nice holiday weekend!

Leave a Reply