I’m trying to customize an expandableListView by adapting some code I found. This invokes a custom adapter, and inflates the required rows for the list view.
My problem: I need to use that thing with other layout components, so in order I need to call setContentView and THEN inflate the listView where I need it. All my attempts end in an app crash, can someone tell me how to adapt the below code to work inside a Layout..?
MainActivity:
public class MainActivity extends ExpandableListActivity implements
OnChildClickListener {
private static final String[] Groups = { "G1", "G2",
"G3", "G4" };
private static final String[] Services = { "Service1",
"Service2", "Service3", "Service4", "Service5",
"Service6" };
private static final String[] Test = { "Test1", "Test2",
"Test3", "Test4" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ExpandableListView expandbleLis = getExpandableListView();
expandbleLis.setDividerHeight(2);
expandbleLis.setGroupIndicator(null);
expandbleLis.setClickable(true);
setGroupData();
setChildGroupData();
NewAdapter mNewAdapter = new NewAdapter(groupItem, childItem);
mNewAdapter
.setInflater(
(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE),
this);
expandbleLis.setAdapter(mNewAdapter);
expandbleLis.setOnChildClickListener(this);
}
public void setGroupData() {
for (int i = 0; i < 4; i++) {
groupItem.add(Groups[i]);
}
}
ArrayList<String> groupItem = new ArrayList<String>();
ArrayList<Object> childItem = new ArrayList<Object>();
public void setChildGroupData() {
/**
* Add Data For Services
*/
ArrayList<String> child = new ArrayList<String>();
for (int i = 0; i < 6; i++) {
child.add(Services[i]);
}
childItem.add(child);
/**
* Add Data For Test
*/
child = new ArrayList<String>();
for (int i = 0; i < 4; i++) {
child.add(Test[i]);
}
childItem.add(child);
/**
*
*/
child = new ArrayList<String>();
child.add("Dummy Text");
child.add("Dummy Text");
child.add("Dummy Text");
child.add("Dummy Text");
childItem.add(child);
/**
*
*/
child = new ArrayList<String>();
child.add("Dummy Text");
child.add("Dummy Text");
child.add("Dummy Text");
child.add("Dummy Text");
childItem.add(child);
}
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
Toast.makeText(MainActivity.this, "Clicked On Child",
Toast.LENGTH_SHORT).show();
return true;
}
}
The Adapter class:
public class NewAdapter extends BaseExpandableListAdapter {
public ArrayList<String> groupItem, tempChild;
public ArrayList<Object> Childtem = new ArrayList<Object>();
public LayoutInflater minflater;
public Activity activity;
public NewAdapter(ArrayList<String> grList, ArrayList<Object> childItem) {
groupItem = grList;
this.Childtem = childItem;
}
public void setInflater(LayoutInflater mInflater, Activity act) {
this.minflater = mInflater;
activity = act;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@SuppressWarnings("unchecked")
@Override
public View getChildView(int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
tempChild = (ArrayList<String>) Childtem.get(groupPosition);
TextView text = null;
if (convertView == null) {
convertView = minflater.inflate(R.layout.childrow, null);
}
text = (TextView) convertView.findViewById(R.id.textView1);
text.setText(tempChild.get(childPosition));
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(activity, tempChild.get(childPosition),
Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return ((ArrayList<String>) Childtem.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public int getGroupCount() {
return groupItem.size();
}
@Override
public void onGroupCollapsed(int groupPosition) {
super.onGroupCollapsed(groupPosition);
}
@Override
public void onGroupExpanded(int groupPosition) {
super.onGroupExpanded(groupPosition);
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = minflater.inflate(R.layout.grouprow, null);
}
((CheckedTextView) convertView).setText(groupItem.get(groupPosition));
((CheckedTextView) convertView).setChecked(isExpanded);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
You have to call
setContentViewpassing a layout which contains anExpandableListViewwhose id is@android:id/list.Then, you can get this
ExpandableListViewcallinggetExpandableListView().Btw, because you can customize your
ExpandableListViewby XML, you won’t have to call this method and will usesetListAdapter()only.Your activity won’t have to implement
OnChildClickListenerand callsetOnChildClickListener, you just have to override the methodonChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)ofExpandableListActivity.See this link to have an example of layout.
And for the next times, don’t forget to post the logs of the exception you get.