Friday, September 5, 2014

3 Level Expandable ListView in android


Download Source Code


Source Code


MainActivity.java


import java.util.ArrayList;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.dow.lvlexplist.Product.SubCategory;
import com.dow.lvlexplist.Product.SubCategory.ItemList;
public class MainActivity extends ActionBarActivity {
private ArrayList<Product>pProductArrayList;
private ArrayList<SubCategory>pSubItemArrayList1,pSubItemArrayList2;
//private ArrayList<SubCategory>pSubItemArrayList2;
private LinearLayout mLinearListView;
boolean isFirstViewClick=false;
boolean isSecondViewClick=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLinearListView = (LinearLayout) findViewById(R.id.linear_listview);
ArrayList<ItemList> mItemListArray=new ArrayList<ItemList>();
mItemListArray.add(new ItemList("State 1", "20"));
mItemListArray.add(new ItemList("State 2", "50"));
mItemListArray.add(new ItemList("State 3", "20"));
mItemListArray.add(new ItemList("State 4", "50"));
ArrayList<ItemList> mItemListArray2=new ArrayList<ItemList>();
mItemListArray2.add(new ItemList("Price 1", "$500"));
mItemListArray2.add(new ItemList("Price 2", "$400"));
mItemListArray2.add(new ItemList("Price 3", "$200"));
mItemListArray2.add(new ItemList("Price 4", "$100"));
pSubItemArrayList1=new ArrayList<SubCategory>();
pSubItemArrayList1.add(new SubCategory("India", mItemListArray));
pSubItemArrayList1.add(new SubCategory("US", mItemListArray));
pSubItemArrayList1.add(new SubCategory("London", mItemListArray));
pSubItemArrayList2=new ArrayList<SubCategory>();
pSubItemArrayList2.add(new SubCategory("Android", mItemListArray2));
pSubItemArrayList2.add(new SubCategory("Apple", mItemListArray2));
pSubItemArrayList2.add(new SubCategory("Windows", mItemListArray2));
pProductArrayList=new ArrayList<Product>();
pProductArrayList.add(new Product("Country", pSubItemArrayList1));
pProductArrayList.add(new Product("Mobile", pSubItemArrayList2));
//pProductArrayList.add(new Product("Garments", pSubItemArrayList2));
/***
* adding item into listview
*/
for (int i = 0; i < pProductArrayList.size(); i++) {
LayoutInflater inflater = null;
inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mLinearView = inflater.inflate(R.layout.row_first, null);
final TextView mProductName = (TextView) mLinearView.findViewById(R.id.textViewName);
final RelativeLayout mLinearFirstArrow=(RelativeLayout)mLinearView.findViewById(R.id.linearFirst);
final ImageView mImageArrowFirst=(ImageView)mLinearView.findViewById(R.id.imageFirstArrow);
final LinearLayout mLinearScrollSecond=(LinearLayout)mLinearView.findViewById(R.id.linear_scroll);
if(isFirstViewClick==false){
mLinearScrollSecond.setVisibility(View.GONE);
mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt);
}
else{
mLinearScrollSecond.setVisibility(View.VISIBLE);
mImageArrowFirst.setBackgroundResource(R.drawable.arw_down);
}
mLinearFirstArrow.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(isFirstViewClick==false){
isFirstViewClick=true;
mImageArrowFirst.setBackgroundResource(R.drawable.arw_down);
mLinearScrollSecond.setVisibility(View.VISIBLE);
}else{
isFirstViewClick=false;
mImageArrowFirst.setBackgroundResource(R.drawable.arw_lt);
mLinearScrollSecond.setVisibility(View.GONE); }
return false;
}
});
final String name = pProductArrayList.get(i).getpName();
mProductName.setText(name);
 
/**
*
*/
   for (int j = 0; j < pProductArrayList.get(i).getmSubCategoryList().size(); j++) {
LayoutInflater inflater2 = null;
inflater2 = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mLinearView2 = inflater2.inflate(R.layout.row_second, null);
 
TextView mSubItemName = (TextView) mLinearView2.findViewById(R.id.textViewTitle);
final RelativeLayout mLinearSecondArrow=(RelativeLayout)mLinearView2.findViewById(R.id.linearSecond);
final ImageView mImageArrowSecond=(ImageView)mLinearView2.findViewById(R.id.imageSecondArrow);
final LinearLayout mLinearScrollThird=(LinearLayout)mLinearView2.findViewById(R.id.linear_scroll_third);
if(isSecondViewClick==false){
mLinearScrollThird.setVisibility(View.GONE);
mImageArrowSecond.setBackgroundResource(R.drawable.arw_lt);
}
else{
mLinearScrollThird.setVisibility(View.VISIBLE);
mImageArrowSecond.setBackgroundResource(R.drawable.arw_down);
}
mLinearSecondArrow.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(isSecondViewClick==false){
isSecondViewClick=true;
mImageArrowSecond.setBackgroundResource(R.drawable.arw_down);
mLinearScrollThird.setVisibility(View.VISIBLE);
}else{
isSecondViewClick=false;
mImageArrowSecond.setBackgroundResource(R.drawable.arw_lt);
mLinearScrollThird.setVisibility(View.GONE); }
return false;
}
});
final String catName = pProductArrayList.get(i).getmSubCategoryList().get(j).getpSubCatName();
mSubItemName.setText(catName);
/**
*
*/
 for (int k = 0; k < pProductArrayList.get(i).getmSubCategoryList().get(j).getmItemListArray().size(); k++) {
LayoutInflater inflater3 = null;
inflater3 = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mLinearView3 = inflater3.inflate(R.layout.row_third, null);
 
TextView mItemName = (TextView) mLinearView3.findViewById(R.id.textViewItemName);
TextView mItemPrice = (TextView) mLinearView3.findViewById(R.id.textViewItemPrice);
final String itemName = pProductArrayList.get(i).getmSubCategoryList().get(j).getmItemListArray().get(k).getItemName();
final String itemPrice = pProductArrayList.get(i).getmSubCategoryList().get(j).getmItemListArray().get(k).getItemPrice();
mItemName.setText(itemName);
mItemPrice.setText(itemPrice);
mLinearView3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Name:"+itemName+"\nID:"+itemPrice,Toast.LENGTH_LONG).show();
}
});
mLinearScrollThird.addView(mLinearView3);
 }
mLinearScrollSecond.addView(mLinearView2);
 
   }
 
   mLinearListView.addView(mLinearView);
} }
}

Product.java


import java.util.ArrayList;

public class Product {

private String pName;

private ArrayList<SubCategory> mSubCategoryList;

public Product(String pName, ArrayList<SubCategory> mSubCategoryList) {
super();
this.pName = pName;
this.mSubCategoryList = mSubCategoryList;
}

public String getpName() {
return pName;
}

public void setpName(String pName) {
this.pName = pName;
}

public ArrayList<SubCategory> getmSubCategoryList() {
return mSubCategoryList;
}

public void setmSubCategoryList(ArrayList<SubCategory> mSubCategoryList) {
this.mSubCategoryList = mSubCategoryList;
}

public static class SubCategory {

private String pSubCatName;
private ArrayList<ItemList> mItemListArray;

public SubCategory(String pSubCatName,
ArrayList<ItemList> mItemListArray) {
super();
this.pSubCatName = pSubCatName;
this.mItemListArray = mItemListArray;
}

public String getpSubCatName() {
return pSubCatName;
}

public void setpSubCatName(String pSubCatName) {
this.pSubCatName = pSubCatName;
}

public ArrayList<ItemList> getmItemListArray() {
return mItemListArray;
}

public void setmItemListArray(ArrayList<ItemList> mItemListArray) {
this.mItemListArray = mItemListArray;
}

public static class ItemList {

private String itemName;
private String itemPrice;

public ItemList(String itemName, String itemPrice) {
super();
this.itemName = itemName;
this.itemPrice = itemPrice;
}

public String getItemName() {
return itemName;
}

public void setItemName(String itemName) {
this.itemName = itemName;
}

public String getItemPrice() {
return itemPrice;
}

public void setItemPrice(String itemPrice) {
this.itemPrice = itemPrice;
}

}

}
}

activity_main.xml


<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/linear_listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" />

</ScrollView>


row_first.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="@android:color/white"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/linearFirst"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:padding="15dp" >

        <TextView
            android:id="@+id/textViewName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="10dp"
            android:text="TextView"
            android:textStyle="bold"
            android:textColor="@color/theme_color"
            android:textSize="17dp" />

        <ImageView
            android:id="@+id/imageFirstArrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dp" />
    </RelativeLayout>

     <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/theme_color" />
     
    <LinearLayout
        android:id="@+id/linear_scroll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:background="@android:color/white"
        android:orientation="vertical" />

</LinearLayout>


row_second.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="@android:color/white"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/linearSecond"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:padding="15dp" >

        <TextView
            android:id="@+id/textViewTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="10dp"
            android:text="TextView"
            android:textColor="#EC5B00"
            android:textStyle="bold"
            android:textSize="17dp" />

        <ImageView
            android:id="@+id/imageSecondArrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dp" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/theme_color" />
    
    <LinearLayout
        android:id="@+id/linear_scroll_third"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:background="@android:color/white"
        android:orientation="vertical" />
</LinearLayout>


row_third.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="wrap_content"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:orientation="horizontal"
        android:padding="15dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/background_light"
            android:text="@string/right_arrow"
            android:textColor="@color/theme_color"
            android:layout_marginRight="5dp"
            android:textSize="17dp" />

        <TextView
            android:id="@+id/textViewItemName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/background_light"
            android:text="TextView"
            android:layout_weight="1"
            android:textColor="@color/theme_color"
            android:textSize="17dp" />

        <TextView
            android:id="@+id/textViewItemPrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/background_light"
            android:text="TextView"
            android:textColor="@android:color/black"
            android:textSize="17dp" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/theme_color" />

</LinearLayout>


strings.xml


<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">3LVLExpList</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>

    <string name="right_arrow">&#9654;</string>
    <color name="theme_color">#016299</color>
</resources>


NOTE: You may get error if you don't add image for arw_down.png and arw_lt.png file in drawable folder.


Download Source Code