0

I want to make an expandable listview in my project.

ExpandableListViewAdapter.Java

public class ExpandableListAdapter extends BaseExpandableListAdapter {
    private Context _context;
    private List<itemGroupAddon> _listDataHeader;

    private HashMap<List<itemGroupAddon>, List<ItemAddon>> _listDataChild;

    public ExpandableListAdapter(Context context, List<itemGroupAddon> listDataHeader,
                                 HashMap<List<itemGroupAddon>, List<ItemAddon>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public long getChildId(int groupPosition, int childPosititon) {
        return childPosititon;
    }

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

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

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

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

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

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @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.tvModifier);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

    @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_mod, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }
}

This is the procedure that I put in my Activity to call the data. I get the data from my sqlite database.

public void PrepareListData(int itemID,int OutletID)
{
    listHeaderData = new ArrayList<>();
    listData = new ArrayList<>();
    listDataChild = new HashMap<List<itemGroupAddon>, List<ItemAddon>>();
    listHeaderData = db.getAllItemGroup(itemID);

    for(itemGroupAddon items : listHeaderData){
        listData= db.getAddonItemList(items.getItem_addon_group_id(),outletID);
    }

    listDataChild.put(listHeaderData,listData);
}

In my OnCreate I call it like this:

PrepareListData(itemId,outletID);
adapterExpList = new ExpandableListAdapter(getActivity(), listHeaderData, listDataChild);
 lvModifier.setAdapter(adapterExpList);

When I run the program it shows header only but the child data isn't showing. When I click the header to expand childData I get a fatal error:

E/AndroidRuntime: FATAL EXCEPTION: main
  Process: com.project.pos.posandroid, PID: 28411
  java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
      at com.project.pos.posandroid.Adapter.ExpandableListAdapter.getChildrenCount(ExpandableListAdapter.java:41)
      at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:563)
      at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:688)
      at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:696)
      at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:656)
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3066)
      at android.widget.AbsListView.onTouchUp(AbsListView.java:3915)
      at android.widget.AbsListView.onTouchEvent(AbsListView.java:3680)
      at android.view.View.dispatchTouchEvent(View.java:9333)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2548)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2241)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2554)
      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2255)
      at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
      at android.app.Dialog.dispatchTouchEvent(Dialog.java:787)
      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
      at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
      at android.view.View.dispatchPointerEvent(View.java:9553)
      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4248)
      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4101)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3647)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3700)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3666)
      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3792)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3674)
      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3849)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3647)
    at android.view.ViewRootImpl$InputStage

The error shows to my this part of my adapter:

return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();

How can I fix this?

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
Nicky Apriliani
  • 321
  • 4
  • 25

1 Answers1

0

I think the problem is in this line listDataChild = new HashMap<List<itemGroupAddon>, List<ItemAddon>>(); you are creating a HashMap with List<> as a key which is not a proper way to define a HashMap since your list is mutable. see here ArrayList as key in Hashmap

Also check if your listData is not null after querying the db

listData= db.getAddonItemList(items.getItem_addon_group_id(),outletID);
Community
  • 1
  • 1
Fahadsk
  • 1,099
  • 10
  • 24