Search code examples
androidlistviewactionbarsherlockexpandablelistview

ExpandableListView in SherlockListFragment with custom Adapter that extends BaseExpandableListAdapter


Hi there!

I have got this setting.

MainActivity - extends SherlockFragmentActivity - displays 4 Fragments using TabsAdapter

I am having problems with one of those tabs where I need this:

FragmentSkills - extends SherlockListFragment - displays an ExpandableListView of some hardcoded test strings for now

================================================================================== PROBLEM: I am getting a NullPointerException at this point that I cannot seem to revolve:

// inside my onActivityCreated() in FragmentSkills.java expandList = (ExpandableListView) getActivity().findViewById(R.id.ExpList);

==================================================================================

I am a bit stuck here and I don't know what else to try. I found lots of examples on similar things but they all only showed how to do this in a normal Activity. It's probably something small that I cannot see due to my lack of experience so please have a look and try to help me out on this one.

I am new to Android, so please be patient with me. Any help is appreciated. Many thanks in advance. Here is the relevant code. Let me know if you need to see more. Thanks a lot!

.

fragment_skills.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:orientation="vertical" >

    <ExpandableListView android:id="@+id/ExpList"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
       android:groupIndicator="@null" />

</LinearLayout>

list_item_skill_groups.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:orientation="vertical" >

    <TextView android:id="@+id/tvSkillGroup"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:textColor="@color/black"
        android:textIsSelectable="false"
        android:textSize="17sp" />

</LinearLayout>

list_item_skills.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:paddingTop="10dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingBottom="10dp"
    android:orientation="vertical" >

    <TextView android:id="@+id/tvSkillTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textIsSelectable="false"
        android:textSize="19sp"
        android:textStyle="normal"
        android:paddingBottom="4dp" />

</LinearLayout>

FragmentSkills.java

public class FragmentSkills extends SherlockListFragment {
    private ExpandableListView expandList;
    private ArrayList<ExpandableSkillsGroup> expListItems;
    private SkillsAdapter skillsAdapter;
    ArrayList<ExpandableSkillsChild> list1;
    ArrayList<ExpandableSkillsChild> list2;
    ArrayList<ExpandableSkillsChild> list3;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        expandList = (ExpandableListView) getActivity().findViewById(R.id.ExpList);
        expListItems = getListItems();
        skillsAdapter = new SkillsAdapter(getActivity(), expListItems);
        expandList.setAdapter(skillsAdapter);
    }

    private ArrayList<ExpandableSkillsGroup> getListItems() {
        list1 = new ArrayList<ExpandableSkillsChild>();
        list1.add(new ExpandableSkillsChild("Android", null));
        list1.add(new ExpandableSkillsChild("Java", null));
        list1.add(new ExpandableSkillsChild("Javascript", null));

        ExpandableSkillsGroup group1 = new ExpandableSkillsGroup("Software Development");
        group1.setItems(list1);

        list2 = new ArrayList<ExpandableSkillsChild>();
        list2.add(new ExpandableSkillsChild("MySQL", null));
        list2.add(new ExpandableSkillsChild("PostgreSQL", null));
        list2.add(new ExpandableSkillsChild("SQLite", null));

        ExpandableSkillsGroup group2 = new ExpandableSkillsGroup("Databases");
        group2.setItems(list2);

        list3 = new ArrayList<ExpandableSkillsChild>();
        list3.add(new ExpandableSkillsChild("MySQL", null));
        list3.add(new ExpandableSkillsChild("PostgreSQL", null));
        list3.add(new ExpandableSkillsChild("SQLite", null));

        ExpandableSkillsGroup group3 = new ExpandableSkillsGroup("Operating Systems");
        group3.setItems(list3);

        ArrayList<ExpandableSkillsGroup> groupList  = new ArrayList<ExpandableSkillsGroup>();
        groupList.add(group1);
        groupList.add(group2);
        groupList.add(group3);
        return groupList;
    }
}

Solution

  • First of all replace FragmentSkills extends SherlockListFragment with FragmentSkills extends SherlockFragment, you don't need SherlockListFragment here. Now add this method in your FragmentSkills:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_skills, container, false);
    }
    

    also in your public void onActivityCreated(Bundle savedInstanceState) instead of

        expandList = (ExpandableListView) getActivity().findViewById(R.id.ExpList);
    

    do this

        expandList = (ExpandableListView) getView().findViewById(R.id.ExpList);