Tuesday, May 5, 2015

Creating Custom ListView in android

Hi all,

   Today I am going to explain the topic Custom ListView. This is the most frequent  used topic in the Android Applications. I am explaining here each and every section to make a complete Custom List in android.





Steps to make custom listview:

* Design UI for List item (you can see above image for list item design).
* Make an Item class which can hold the values of all UI component you are using in list item.

     for example:  public class Item {

public String name;
public String rollno;
public String classname;
public String phone;
public String pic;

public Item(String name, String rno, String cname, String pno, String pic) {
// TODO Auto-generated constructor stub
this.name=name;
this.rollno=rno;
this.classname=cname;
this.phone=pno;
this.pic=pic;
}


* Make an Adapter which can inflate the List item UI into your listview.
     
           inflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView=inflater.inflate(R.layout.list_item, parent,false);


* Add data to the array of object that will to fill adapter.

            list.add(newItem("George","12","12th","345567445","http://thespiritscience.net/wpcontent/uploads/2015/02/Sacred-G-Eye.jpg"));
list.add(new Item("John", "15", "10th", "4566676", "http://p1.pichost.me/i/42/1657715.jpg"));
list.add(new Item("Keron", "152", "10th", "9908875", "http://www.hdwallpapersinn.com/wp-  content/uploads/2015/02/Free-Wallpaper-Nature-Scenes-660x330.jpg"));

* Now set adapter to the listview.

     lview=(ListView)findViewById(R.id.listView1);

adapter = new CustomAdapter(MainActivity.this, list);

lview.setAdapter(adapter);




# Complete sample code:


1. MainActivity.java

package com.example.customlistadapter;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity{

ArrayList<Item> list= new ArrayList<Item>();
ListView lview;
CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

list.add(new Item("George", "12", "12th", "345567445", "http://thespiritscience.net/wp-content/uploads/2015/02/Sacred-G-Eye.jpg"));
list.add(new Item("John", "15", "10th", "4566676", "http://p1.pichost.me/i/42/1657715.jpg"));
list.add(new Item("Keron", "152", "10th", "9908875", "http://www.hdwallpapersinn.com/wp-content/uploads/2015/02/Free-Wallpaper-Nature-Scenes-660x330.jpg"));
list.add(new Item("James", "127", "11th", "22435666", "http://www.bestinspired.com/wp-content/uploads/2015/04/nature-wallpaper-latest-190-825x510.jpg"));
list.add(new Item("Julie", "121", "9th", "96663457", "http://www.hdwallpapersinn.com/wp-content/uploads/2014/11/new_wallpaper_nature_hd_2015-1-660x330.jpg"));
list.add(new Item("Kattie", "18", "7th", "1211343", "http://www.nature-pictures.info/wp-content/uploads/2013/05/the-15-craziest-things-in-nature-you-wont-believe-actually-exist-2.jpg"));

lview=(ListView)findViewById(R.id.listView1);

adapter = new CustomAdapter(MainActivity.this, list);

lview.setAdapter(adapter);

}

}


2. activity_main.xml

<?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="match_parent"
    android:orientation="vertical" >

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

</LinearLayout>


3. CustomAdapter.java


package com.example.customlistadapter;



import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.squareup.picasso.Picasso;

public class CustomAdapter extends BaseAdapter {

Context ctx;
ArrayList<Item> arr = new ArrayList<Item>();
LayoutInflater inflater;
ViewHolder holder;

public CustomAdapter(Context con, ArrayList<Item> list) {
// TODO Auto-generated constructor stub
this.ctx = con;
this.arr = list;
inflater = (LayoutInflater) con
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return arr.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return arr.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub

if (convertView == null) {

convertView=inflater.inflate(R.layout.list_item, parent,false);
holder = new ViewHolder();
holder.name=(TextView)convertView.findViewById(R.id.Name);
holder.cname=(TextView)convertView.findViewById(R.id.cname);
holder.rno=(TextView)convertView.findViewById(R.id.rno);
holder.mno=(TextView)convertView.findViewById(R.id.phone);
holder.pic=(ImageView)convertView.findViewById(R.id.pic);
convertView.setTag(holder);
        } else {
       
        holder = (ViewHolder) convertView.getTag();
           
        }
Picasso.with(ctx).load(arr.get(position).pic).placeholder(R.drawable.ic_launcher).resize(200, 200).into(holder.pic);
holder.name.setText(arr.get(position).name);
holder.cname.setText(arr.get(position).classname);
holder.rno.setText(arr.get(position).rollno);
holder.mno.setText(arr.get(position).phone);

convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(ctx,arr.get(position).name, 2345).show();
}
});
return convertView;
}

private class ViewHolder {

public ImageView pic;

public TextView name, cname, rno, mno;

}
}


4. Item.java

package com.example.customlistadapter;

public class Item {

public String name;
public String rollno;
public String classname;
public String phone;
public String pic;

public Item(String name, String rno, String cname, String pno, String pic) {
// TODO Auto-generated constructor stub
this.name=name;
this.rollno=rno;
this.classname=cname;
this.phone=pno;
this.pic=pic;
}
}


5. list_item.xml

<?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="match_parent"
    android:background="#aad032"
    android:layout_marginBottom="1dip"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight=".7"
        android:paddingLeft="10dip"
        android:gravity="center" >

        <ImageView
            android:id="@+id/pic"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:src="@drawable/ic_launcher" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight=".3"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:paddingLeft="10dip" >

        <TextView
            android:id="@+id/Name"
            android:layout_width="wrap_content"
            android:textColor="#ffffff"
            android:textStyle="bold"
            android:layout_height="wrap_content"
            android:text="Name" />

        <TextView
            android:id="@+id/cname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:text="cname" />

        <TextView
            android:id="@+id/rno"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:text="rno" />

        <TextView
            android:id="@+id/phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:text="phone" />

    </LinearLayout>

</LinearLayout>

6. manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.customlistadapter"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name="com.example.customlistadapter.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Here I am using Picasso library to download images from url.

You can download the code by using lenk below.




Anyone can ask if there is any problem. questions are welcome!

Thanks,