Displaying Stored Categories And Corresponding Items In ExpandableListView In Android



Displaying Stored Categories And Corresponding Items In ExpandableListView In Android



Step 1 : Select File -> New -> Project -> Android Application Project (or) Android Project. Fill the forms and click "Finish" button. If you have any doubt regarding create a new project Click Here.



Step 2 : Open res -> layout -> activity_main.xml (or) main.xml and add following code :

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

    <ExpandableListView

        android:id="@+id/lvExp"
        android:layout_width="match_parent"
        android:layout_height="369dp"
        android:cacheColorHint="#00000000" >
    </ExpandableListView>

    <Button

        android:id="@+id/display"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/h_back" />

</LinearLayout>


Step 3 : Open res -> layout -> launch_layout.xml and add following code :

<?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" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Enter Categerory"
       
        />"
    <EditText
        android:id="@+id/etText1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
       
        />
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Enter Items"
        />
    <EditText
        android:id="@+id/etText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
   
    <Button
        android:id="@+id/enterButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Enter" />"

    <Button

        android:id="@+id/display"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Display" />

</LinearLayout>



Step 4 : Open res -> layout -> list_group.xml and add following code :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp"
    android:background="#000000">


    <TextView

        android:id="@+id/lblListHeader"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textSize="17dp"
        android:textColor="#891" />

</LinearLayout>



Step 5 : Open res -> layout -> list_item.xml and add following code :

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

    <TextView

        android:id="@+id/lblListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="17dip"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:textColor="#000000"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>


Step 6 : Open src -> package -> MainActivity.java and add following code :

package com.gudivada.hemanthsomaraju;

import com.gudivada.hemanthsomaraju.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;

public class MainActivity extends Activity implements DBConstant{

    ExpandableListAdapter listAdapter;

    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    DatabaseHelper dbHelper;
    Button id1;
    Intent id2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        id1 = (Button) findViewById(R.id.display);
        id1.setOnClickListener(new OnClickListener() {
           
            public void onClick(View v) {
                // TODO Auto-generated method stub
                id2 = new Intent(MainActivity.this, LaunchActivity.class);
                startActivity(id2);
            }
        });
       
        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.lvExp);

        // preparing list data

        prepareListData();

        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);


        // setting list adapter

        expListView.setAdapter(listAdapter);

        // Listview Group click listener

        expListView.setOnGroupClickListener(new OnGroupClickListener() {

            @Override

            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {
                return false;
            }
        });

        // Listview Group expanded listener

        expListView.setOnGroupExpandListener(new OnGroupExpandListener() {

            @Override

            public void onGroupExpand(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Expanded",
                        Toast.LENGTH_SHORT).show();
            }
        });

        // Listview Group collasped listener

        expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {

            @Override

            public void onGroupCollapse(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Collapsed",
                        Toast.LENGTH_SHORT).show();

            }

        });

        // Listview on child click listener

        expListView.setOnChildClickListener(new OnChildClickListener() {

            @Override

            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(
                        getApplicationContext(),
                        listDataHeader.get(groupPosition)
                                + " : "
                                + listDataChild.get(
                                        listDataHeader.get(groupPosition)).get(
                                        childPosition), Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
        });
    }
   
    private void prepareListData() {
        dbHelper = new DatabaseHelper(this);
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String,List<String>>();
        String hstr;
        String cstr;
       
        SQLiteDatabase sdb = dbHelper.getReadableDatabase();
        String query1 = "SELECT "+TITLE+" FROM "+ TABLE_NAME;
        Cursor hCur = sdb.rawQuery(query1, null);
        if(hCur.moveToFirst()){
            do {
                List<String> list = new ArrayList<String>();
                hstr = hCur.getString(0);
                listDataHeader.add(hstr);
                String query2="SELECT Child FROM "+ hstr;
                Cursor cCur = sdb.rawQuery(query2, null);
                if(cCur.moveToFirst()){
                    do{
                        cstr = cCur.getString(0);
                        list.add(cstr);
                    }while(cCur.moveToNext());
                }
            listDataChild.put(hstr, list);
            }while(hCur.moveToNext());
        }
    }
   
    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
        this.finish();
    }
}



Step 7 : Open src -> package -> LaunchActivity.java and add following code :


package com.gudivada.hemanthsomaraju;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LaunchActivity extends Activity implements DBConstant{
 DatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.launch_layout);
    Button display =(Button)findViewById(R.id.display);
    Button eB= (Button)findViewById(R.id.enterButton);
    final EditText et = (EditText)findViewById(R.id.etText1);
    final EditText et2 = (EditText)findViewById(R.id.etText2);
    dbHelper = new DatabaseHelper(this);
    eB.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {   
            SQLiteDatabase sdb = dbHelper.getWritableDatabase();
            ContentValues cv = new  ContentValues();
            ContentValues cv1 = new ContentValues();
            String title = et.getText().toString();
            String child1 = et2.getText().toString();
            cv.put(TITLE, title);
            sdb.insert(TABLE_NAME,null,cv);
            Log.d("category","table created"+ title);
            String str="CREATE TABLE "+title+" ( Child  TEXT NOT NULL)";
            sdb.execSQL(str);
            if(child1.length()!=0) {
                cv1.put("Child", child1);
                sdb.insert(title, null, cv1);
                Log.d("child","row created"+ child1);
                cv1.clear();
            }
            Toast.makeText(getApplicationContext(), "DATA INSERTED", Toast.LENGTH_LONG).show();
        }
    });
    display.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Intent i = new Intent("android.intent.action.MAINACTIVITY");
            startActivity(i);
            finish();
        }       
    });
    }
}



Step 8 : Open src -> package -> ExpandableListAdapter.java and add following code :

package com.gudivada.hemanthsomaraju;

import java.util.HashMap;
import java.util.List;

import com.gudivada.hemanthsomaraju.R;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;

    private List<String> _listDataHeader;
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,

            HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override

    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override

    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override

    public View getChildView(int groupPosition, final int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);


        if (convertView == null) {

            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView

                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);

        return convertView;
    }

    @Override

    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override

    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override

    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override

    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override

    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView

                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;

    }

    @Override

    public boolean hasStableIds() {
        return false;
    }

    @Override

    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

}


Step 9 : Open src -> package -> DBConstant.java and add:

package com.gudivada.hemanthsomaraju;

import android.provider.BaseColumns;

public interface DBConstant extends BaseColumns {
 public static final String  TABLE_NAME = "Catagerioes";
 public static final String TITLE ="name";
}



Step 10 : Open src -> package -> DatabaseHelper.java and add:

package com.gudivada.hemanthsomaraju;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper implements DBConstant {

    private static final String DATABASE_NAME = "ExpandTestDB.db";

    private static final int DATABASE_VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override

    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ TITLE + " TEXT NOT NULL);" );
       
    }

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS"+TABLE_NAME);
       
        onCreate(db);
    }

}



Step 11 : Open AndroidManifest.xml and add following code :

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gudivada.hemanthsomaraju"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk

        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.gudivada.hemanthsomaraju.LaunchActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       
        <activity
            android:name="com.gudivada.hemanthsomaraju.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAINACTIVITY" />

                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>
        </activity>
    </application>

</manifest>



Step 12 : Open res ->values ->strings.xml and add following code :
 
<resources>
    <string name="app_name">ExpandList</string>
    <string name="h_back">Back</string>
</resources>



Step 13 : Our output will be like this :