Navigation drawer with expandable listview cannot remember selected group child

Thursday, March 27, 2014

I am new to navigation drawer. I have created a simple app which has an expandable navigation drawer menu. The expandable menu is working well. Now, what I want is that, when the user chooses an option from the expandable list, the option should be highlighted and the group should remain expanded. This should happen even if the user goes to a different activity and navigates back to this activity. The highlighting should change if the user chooses a different option.


I am putting the source code in here.


The MainActivity:



public class MainActivity extends Activity {
DrawerLayout mDrawerLayout;
ExpandableListView mDrawerList;
ExpandableListAdapter listAdapter;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;
private ActionBar mActionBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//Action bar with collapse icon for drawer menu===================
mActionBar = getActionBar();
mActionBar.setHomeButtonEnabled(true);
mActionBar.setDisplayHomeAsUpEnabled(false);
//Action bar with collapse icon for drawer menu===================

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ExpandableListView) findViewById(R.id.left_drawer);



// preparing list data
prepareListData();

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

// setting list adapter
mDrawerList.setAdapter(listAdapter);

// Listview Group click listener
mDrawerList.setOnGroupClickListener(new OnGroupClickListener() {

@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
// Toast.makeText(getApplicationContext(),
// "Group Clicked " + listDataHeader.get(groupPosition),
// Toast.LENGTH_SHORT).show();
return false;
}
});

// // Listview Group expanded listener
// mDrawerList.setOnGroupExpandListener(new OnGroupExpandListener() {
//
// @Override
// public void onGroupExpand(int groupPosition) {
// Toast.makeText(getApplicationContext(),
// listDataHeader.get(groupPosition) + " Expanded",
// Toast.LENGTH_SHORT).show();
// }
// });
//
// // Listview Group collasped listener
// mDrawerList.setOnGroupCollapseListener(new OnGroupCollapseListener() {
//
// @Override
// public void onGroupCollapse(int groupPosition) {
// Toast.makeText(getApplicationContext(),
// listDataHeader.get(groupPosition) + " Collapsed",
// Toast.LENGTH_SHORT).show();
//
// }
// });

//mDrawerList.expandGroup(2);
//mDrawerList.expandGroup(2, true);

// Listview on child click listener
mDrawerList.setOnChildClickListener(new OnChildClickListener() {

@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {

mDrawerLayout.closeDrawer(mDrawerList);
// TODO Auto-generated method stub
// Toast.makeText(
// getApplicationContext(),
// listDataHeader.get(groupPosition)
// + " : "
// + listDataChild.get(
// listDataHeader.get(groupPosition)).get(
// childPosition), Toast.LENGTH_SHORT)
// .show();
//v.setBackgroundColor(Color.BLUE);
makeAToast("Group: "+groupPosition+" Child: "+childPosition);
return false;
}
});

//To collapse previously opened group===========
mDrawerList.setOnGroupExpandListener(new OnGroupExpandListener() {
int previousItem = -1;

@Override
public void onGroupExpand(int groupPosition) {
if(groupPosition != previousItem )
mDrawerList.collapseGroup(previousItem );
previousItem = groupPosition;
}
});
//To collapse previously opened group===========
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.closeDrawer(mDrawerList);
} else {
mDrawerLayout.openDrawer(mDrawerList);
}
break;

default:
break;
}
return super.onOptionsItemSelected(item);
}

/*
* Preparing the list data
*/
private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();

// Adding header data
listDataHeader.add("Today");

// Adding child data
List<String> today = new ArrayList<String>();
today.add("Tanushree Guha");
today.add("Prasenjit Roy");
today.add("Pan Singh Tomar");
today.add("Milka Singh");
today.add("Rohit Ramanujan");
today.add("Ramesh Bhatt");
today.add("Debjani Brahma");

listDataHeader.add("Tomorrow");
List<String> tomorrow = new ArrayList<String>();
tomorrow.add("Dipanjan Bhowmik");
tomorrow.add("Sarmistha Sinha");
tomorrow.add("Pranay Lalwani");
tomorrow.add("Mohit Shaw");
tomorrow.add("Lovelace Agarwal");
tomorrow.add("Tanmay Banerjee");

listDataHeader.add("Later");
List<String> later = new ArrayList<String>();
later.add("Yusuf Khan");
later.add("Jitendar Sharma");
later.add("Debashree Roy");
later.add("Mainak Ghosh");
later.add("Olivia Gomes");

listDataChild.put(listDataHeader.get(0), today); // Header, Child data
listDataChild.put(listDataHeader.get(1), tomorrow);
listDataChild.put(listDataHeader.get(2), later);
}

// method to show toast message
public void makeAToast(String str) {
Toast toast = Toast.makeText(this, str, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}


The ExpandableListAdapter:



public class ExpandableListAdapter extends BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
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;
}

}


The activity_main.xml:



<RelativeLayout xmlns:android="http://ift.tt/nIICcg"
xmlns:tools="http://ift.tt/LrGmb4"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<android.support.v4.widget.DrawerLayout
xmlns:android="http://ift.tt/nIICcg"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>

<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view. -->
<ExpandableListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="#999999"
android:dividerHeight="1dp"
android:background="#ffffff"/>
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>


The list_group.xml:



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://ift.tt/nIICcg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
android:background="#CC7A00">


<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="#ffffff" />

</LinearLayout>


The list_item.xml:



<LinearLayout xmlns:android="http://ift.tt/nIICcg"
android:layout_width="match_parent"
android:layout_height="55dip"
android:orientation="vertical"
android:background="#FFCC80">

<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:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
android:background="@drawable/listview_text_selector" />

</LinearLayout>


The listview_text_selector.xml:



<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://ift.tt/nIICcg">
<item android:drawable="@drawable/list_pressed_color"
android:state_pressed="true" />
<item android:drawable="@drawable/list_normal_color" />
</selector>


Create color.xml under res --> values and write the below code:



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

<drawable name="list_pressed_color">#FF0000</drawable> <!--custom color for list pressed state -->
<drawable name="list_normal_color">#00FFFFFF</drawable> <!--transperent color for list normal state -->

</resources>


If you copy paste the above code, you will be able to see the output. Please suggest me how to keep the listview expanded highlighting the last choice by the user.







http://ift.tt/1paaLeA