Custom ListView in Android

Introduction

 
ListView is a control for presenting components in the form of a list. We can insert a TextBox (EditText), TextView (label), Button or other types of components into a ListView.
 
Today we will create a ListView like the following,
 
Custom List View
 
Now we will move to the coding part of this project.
 
In this project, we will use two layouts. The first is activity_main.xml and the second is list_single.xml.
 
activity_main.xml
 
In the activity_main.xml layout, we will use a ListView. Initially, this ListView is empty. We will insert the ImageView and TextView dynamically into the ListView through coding.
 
XML code of this activity is the following:
  1. <RelativeLayout    
  2.     xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     xmlns:tools="http://schemas.android.com/tools"    
  4. android:layout_width="match_parent"    
  5. android:layout_height="match_parent"    
  6. android:paddingBottom="@dimen/activity_vertical_margin"    
  7. android:paddingLeft="@dimen/activity_horizontal_margin"    
  8. android:paddingRight="@dimen/activity_horizontal_margin"    
  9. android:paddingTop="@dimen/activity_vertical_margin"    
  10. tools:context=".MainActivity" >    
  11.     <ListView>    
  12. android:id="@+id/list"    
  13. android:layout_width="wrap_content"    
  14. android:layout_height="wrap_content" ></ListView>    
  15. </RelativeLayout>   
    After using the preceding XML code, our activity will be like the following:
     
    Item
     
    Now we move to the list_single activity.
     
    lsit_single.xml
     
    In this activity, we use a TextView and an ImageView. In the TextView, we will show the name of the ListView item and in the ImageView, we will show the image of the ListView item.
     
    The XML code of this activity is,
    1. <?xml version="1.0" encoding="utf-8"?>    
    2. <TableLayout    
    3.     xmlns:android="http://schemas.android.com/apk/res/android"    
    4. android:layout_width="match_parent"    
    5. android:layout_height="match_parent"     
    6. android:background="#ffbbcc">    
    7.     <TableRow>    
    8.         <ImageView    
    9. android:id="@+id/img"    
    10. android:layout_width="50dp"    
    11. android:layout_height="50dp"/>    
    12.         <TextView    
    13. android:id="@+id/txt"    
    14. android:layout_width="wrap_content"    
    15. android:layout_height="50dp" />    
    16.     </TableRow>    
    17. </TableLayout>   
      After using the preceding XML code, the list_single activity will look like the following,
       
      Pink window
       
      This activity is looking empty because we don't provide an image resource to the ImageView and the text to the TextView. We will do all that dynamically.
       
      In the res (resource) folder of this project, we will provide a number of images.
       
      Images
       
      We will use all these Images in the ListView.
       
      Source code (Java code) of this project.
       
      In this project, we will use the main activity (MainActivity.java) and will also use a class (CustomList.java).
       
      Now I will explain each of the source files. First of all we will explain the CustomList.java class.
       
      The source code of the CustomeList.java class is,
      1. package learn2crack.customlistview;    
      2. import android.app.Activity;    
      3. import android.view.LayoutInflater;    
      4. import android.view.View;    
      5. import android.view.ViewGroup;    
      6. import android.widget.ArrayAdapter;    
      7. import android.widget.ImageView;    
      8. import android.widget.TextView;    
      9.     
      10. public class CustomList extends ArrayAdapter < String > {    
      11.     
      12.     private final Activity context;    
      13.     private final String[] web;    
      14.     private final Integer[] imageId;    
      15.     
      16.     public CustomList(Activity context, String[] web, Integer[] imageId)     
      17.     {    
      18.         super(context, R.layout.list_single, web);    
      19.         this.context = context;    
      20.         this.web = web;    
      21.         this.imageId = imageId;    
      22.     
      23.     }@Override    
      24.     public View getView(int position, View view, ViewGroup parent)    
      25.     {    
      26.     
      27.         LayoutInflater inflater = context.getLayoutInflater();    
      28.         View rowView = inflater.inflate(R.layout.list_single, nulltrue);    
      29.     
      30.         TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);    
      31.     
      32.         ImageView imageView = (ImageView) rowView.findViewById(R.id.img);    
      33.         txtTitle.setText(web[position]);    
      34.     
      35.         imageView.setImageResource(imageId[position]);    
      36.         return rowView;    
      37.     
      38.     }    
      39. }   
      Explanation of Code
       
      Code Section 1
       
      In the preceding class, we inherit the ArrayAdapter class using CustomList extends ArrayAdapter<String> statement. Here the extend method is used for inheriting a class. Adapter to use is called an ArrayAdapter because the adapter converts an ArrayList of objects into View items loaded into the ListView container.
       
      Code Section 2
      1. public CustomList(Activity context, String[] web, Integer[] imageId)    
      2. {    
      3.     super(context, R.layout.list_single, web);    
      4.     this.context = context;    
      5.     this.web = web;    
      6.     this.imageId = imageId;    
      7. }   
        In the preceding code, we created a constructor of the CustomList class. This constructor takes 3 parameters. The first one is the name of the activity that invoked this constructor. The second parameter is a string array object. The third parameter is an Integer array object. We used a super method in the constructor. The super keyword in Java is a reference variable that is used to refer to the immediate parent class object. Whenever we create the instance of a subclass, an instance of the parent class is created implicitly, in other words referred to by the super reference variable.
         
        Code Section 3
        1. public View getView(int position, View view, ViewGroup parent)     
        2. {    
        3.     LayoutInflater inflater = context.getLayoutInflater();    
        4.     View rowView = inflater.inflate(R.layout.list_single, nulltrue);    
        5.     TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);    
        6.     ImageView imageView = (ImageView) rowView.findViewById(R.id.img);    
        7.     txtTitle.setText(web[position]);    
        8.     imageView.setImageResource(imageId[position]);    
        9.     return rowView;    
        10. }   
        This is an important part of this project. This method is responsible for inserting a view into the ListView control. This method is invoked implicitly by the system. In this method, we pass three parameters. The first parameter contains the position of a view in the ListView. The second parameter is an instance of the view and the third parameter is a ViewGroup. A ViewGroup is a special view that can contain other views (called children). The view group is the base class for layouts and view containers.
         
        In this method, we use a LayoutInflater object. LayoutInflater is used to dynamically add and remove views using Java code. This class is used to instantiate a layout XML file into its corresponding View objects.
         
        We use an inflate method (View rowView= inflater.inflate(R.layout.list_single, null, true)) in the preceding code. Inflating means to read the XML file that describes a layout (or GUI element) and to create the actual objects that correspond to it and thus make the object visible within an Android app.
         
        Finally we create a TextView and a ImageView . We provide the text to the textview using a web array (txtTitle.setText(web[position])) and provide the source of the image to the Imageview using an imageid array (imageView.setImageResource(imageId[position])).
         
        Now we move to the source code of the MainActivity.java class.
         
        The following is the source code of this MainActivity.java,
        1. import android.os.Bundle;    
        2. import android.view.View;    
        3. import android.widget.AdapterView;    
        4. import android.widget.ListView;    
        5. import android.widget.Toast;    
        6. import android.app.Activity;    
        7.     
        8. public class MainActivity extends Activity     
        9. {    
        10.     ListView list;    
        11.     String[] web =     
        12.     {    
        13.         "Google Plus",    
        14.             "Twitter",    
        15.             "Windows",    
        16.             "Bing",    
        17.             "Itunes",    
        18.             "Wordpress",    
        19.             "Drupal"    
        20.     };    
        21.     Integer[] imageId =     
        22.     {    
        23.         R.drawable.image1,    
        24.         R.drawable.image2,    
        25.         R.drawable.image3,    
        26.         R.drawable.image4,    
        27.         R.drawable.image5,    
        28.         R.drawable.image6,    
        29.         R.drawable.image7    
        30.     
        31.     
        32.     };    
        33.     @Override    
        34.     protected void onCreate(Bundle savedInstanceState)    
        35.     {    
        36.         super.onCreate(savedInstanceState);    
        37.         setContentView(R.layout.activity_main);    
        38.     
        39.     
        40.         CustomList adapter = new CustomList(MainActivity.this, web, imageId);    
        41.     
        42.         list = (ListView) findViewById(R.id.list);    
        43.         list.setAdapter(adapter);    
        44.     
        45.         list.setOnItemClickListener(new AdapterView.OnItemClickListener()     
        46.         {    
        47.             @Override    
        48.     
        49.             public void onItemClick(AdapterView <? > parent, View view,    
        50.             int position, long id)     
        51.             {    
        52.                 Toast.makeText(MainActivity.this"You Clicked at " + web[+position], Toast.LENGTH_SHORT).show();    
        53.     
        54.             }    
        55.         });    
        56.     }    
        57. }   
          Explanation of Code
           
          Code Section 4
          1. String[] web =     
          2. {    
          3.     "Google Plus",    
          4.         "Twitter",    
          5.         "Windows",    
          6.         "Bing",    
          7.         "Itunes",    
          8.         "Wordpress",    
          9.         "Drupal"    
          10. };    
          11. Integer[] imageId =     
          12. {    
          13.     R.drawable.image1,    
          14.     R.drawable.image2,    
          15.     R.drawable.image3,    
          16.     R.drawable.image4,    
          17.     R.drawable.image5,    
          18.     R.drawable.image6,    
          19.     R.drawable.image7    
          20. };   
            In the preceding code section we create two arrays. One is a string type (String[] web) and another is an Integer type (Integer[] imageId). In the String type array, we provide the values for TextView and in the Integer type array, we provide the image id for the ImageView.
             
            Code Section 5
            1. super.onCreate(savedInstanceState);    
            2. setContentView(R.layout.activity_main);    
            3. CustomList adapter = new CustomList(MainActivity.this, web, imageId);    
            4. list = (ListView) findViewById(R.id.list);    
            5. list.setAdapter(adapter);   
              In the preceding code section first, we create an object of the CustomList class. We pass three parameters to the CustomList constructor. The first parameter is the current context name, the second parameter is a String array object and the third is an Integer array object.
               
              In the preceding code, we use the setAdapter method for the ListView. The setAdapter method is used in the databinding for a ListView. In our code, we bind the data returned by the CustomList class.
               
              Code Section 6
              1. list.setOnItemClickListener(new AdapterView.OnItemClickListener()     
              2. {@Override    
              3.     public void onItemClick(AdapterView <? > parent, View view,    
              4.     int position, long id)     
              5.     {    
              6.         Toast.makeText(MainActivity.this"You Clicked at " + web[+position], Toast.LENGTH_SHORT).show();    
              7.     
              8.     }    
              9. });   
                In the preceding code, we set an OnItemClick event for the ListView. This event will be invoked when someone clicks on an item of a ListView. On the response of the Click event, we show the name of the ListView Item using the Toast.makeText() method.
                 
                Let us see an example.
                 
                Assume we click on the Google Plus option then the output will be the following,
                 
                Google Plus
                 
                If we click on the Windows option, then the output will be the following,