getChildView no está siendo llamado

Estoy creando un menú que incluye un adaptador personalizado ExpandableListView. A pesar de que intento hacer coincidir mi código lo más cerca posible de los ejemplos de API y cualquier otro ejemplo que haya visto en línea (incluidas varias preguntas de SO estrechamente relacionadas), todavía no puedo hacerlo funcionar.

Sé que el adaptador se está utilizando porque se muestra la vista de grupo (que se realiza a partir de un xml). Al hacer clic en el elemento del grupo también se llama "getGroupView", pero el código nunca ejecuta "getChildView", "getChild" o "getChildId".

Incluso revisé el código fuente de Android-15 para averiguar qué podría haber hecho mal, pero no ha surgido nada extraño.

= Actividad base

public class SettingsM extends FragmentActivity
{
    static Context context;
    ViewPager mViewPager;
    CollectionPagerAdapter mDemoCollectionPagerAdapter;
    //ColorPicker picker;

    SharedPreferences preferences;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

        context = this;
        // Set up action bar.
        final ActionBar actionBar = getActionBar();

        actionBar.setDisplayHomeAsUpEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setTitle("Particle emitter settings");

        // get the preferences for this screen
        preferences = this.getSharedPreferences("base_world", 0);

        // tab holder
        setContentView(R.layout.tabmenu_holder);
        mViewPager = (ViewPager) findViewById(R.id.pager);

        mDemoCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);
    }

    public class CollectionPagerAdapter extends FragmentStatePagerAdapter
    {
        public CollectionPagerAdapter(FragmentManager fm) 
        {
            super(fm);
        }

        @Override
        public Fragment getItem(int i)
        {
            Fragment fragment = new TabFragment();
            Bundle args = new Bundle();
            if(preferences != null)
                {
                if(i == 0)
                {// world
                    args.putBoolean("world", true);
                } else
                {// emitter
                    args.putBoolean("world", false);
                    args.putInt("emitter", i-1);
                }
            }
            fragment.setArguments(args);
            return fragment;
        }

        @Override
        public int getCount()
        {
            return 100;
        }

        @Override
        public CharSequence getPageTitle(int position) 
        {
            if(position == 0)
            {
                return "World";
            } else
            {
                return "Emitter #" + position;
            }
        }
    }

    public static class TabFragment extends Fragment
    {        
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            Bundle args = getArguments();
            View rootView = new TextView(context);// use a textview as the default

            if(args.getBoolean("world"))
            {
                rootView = inflater.inflate(R.layout.m_backdrop, container, false);

                // add face drop-down
                ExpandableListView face_list = (ExpandableListView) rootView.findViewById(R.id.FaceList);
                if(face_list != null)
                {
                    face_list.setAdapter(new ExpandableFaceList(context));
                    face_list.setOnGroupClickListener(new OnGroupClickListener()
                    {

                        @Override
                        public boolean onGroupClick(ExpandableListView parent,
                            View v, int groupPosition, long id)
                        {
                            Log.i("FaceList", "Clicked:" + groupPosition);
                            return false;
                        }
                    });
                }

            } else
            {
                return rootView;
            }
            return rootView;
        }
    }
}

= Adaptador de vista de lista expandible

public class ExpandableFaceList extends BaseExpandableListAdapter implements ExpandableListAdapter
{
    public Context context;
    private LayoutInflater inflator;
    private float mDensity = 1f;

    private boolean bShowSw = true;
    private ColorPickerMenuView cp;
    private Switch sw;


    public ExpandableFaceList(Context context)
    {
        this.context = context;
        this.inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        mDensity = context.getResources().getDisplayMetrics().density;
    }

    @Override
    public int getGroupCount()
    {
        return 1;
    }

    @Override
    public int getChildrenCount(int groupPosition)
    {
        return 6;// because there are 6 faces to a cube
    }

    // list views
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent)
    {
        View v = convertView;
        TextView tv;

        if(v == null)
        {
            v = inflator.inflate(R.layout.exlist_head, parent, false);

            tv = (TextView) v.findViewById(R.id.exList_Title);
            if(tv != null)
                tv.setText("Face Colors");

            tv = (TextView) v.findViewById(R.id.exList_Summary);
            String s_text = "The color for each face, click to ";
            s_text += ((isExpanded)? "collaspe": "expand");
            if(tv != null)
                tv.setText(s_text);
        } else
        {
            tv = (TextView) v.findViewById(R.id.exList_Summary);
            String s_text = "The color for each face, click to ";
            s_text += ((isExpanded)? "collaspe": "expand");
            if(tv != null)
                tv.setText(s_text);
            parent.invalidate();
        }        

        return v;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent)
    {
        View v = convertView;

        if(v == null)
        {
            if(bShowSw)
            {
                v = (LinearLayout) inflator.inflate(R.layout.face_info_sw, parent, false);
            } else
            {
                v = (LinearLayout) inflator.inflate(R.layout.face_info, parent, false);
            }
        }

        switch(childPosition)
        {
        case 0:
            v.setTag("Front");
            break;
        case 1:
            v.setTag("Back");
            break;
        case 2:
            v.setTag("Left");
            break;
        case 3:
            v.setTag("Right");
            break;
        case 4:
            v.setTag("Top");
            break;
        case 5:
            v.setTag("Bottom");
            break;
            }

        Log.i("ELV", "Pos:" + childPosition);

        cp = (ColorPickerMenuView) v.findViewById(R.id.face_color);
        cp.setTitle((String) v.getTag());

        cp.setOnClickListener(new OnClickListener() {
            public void onClick(View v) { UpdateData(v); }
        });

        if(bShowSw)
        {
            sw = (Switch) v.findViewById(R.id.face_sw);
            sw.setOnClickListener(new OnClickListener() {
                public void onClick(View v) { UpdateData(v); }
            });
        }

        return v;
    }

    private void UpdateData(View v) { }

    @Override
    public Object getGroup(int groupPosition)
    {
        return groupPosition;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition)
    {
        return "Child:" + groupPosition + "." + childPosition;
    }

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

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

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

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

= Vista xml de la actividad

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:textColor="#fff"
        android:paddingTop="4dp"
        android:paddingBottom="4dp" />

</android.support.v4.view.ViewPager>

= m_backdrop.xml (menú para la configuración de fondo)

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:app="http://schemas.android.com/apk/res/com.zyphronics.aquafinger">

      <RelativeLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical" >

            <TextView
            android:id="@+id/Title_GeneralSettings_text"
            style="?android:attr/listSeparatorTextViewStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dip"
            android:text="General Settings" />

        <ExpandableListView
            android:id="@+id/FaceList"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/Title_GeneralSettings_text" >
        </ExpandableListView>

        </RelativeLayout>

</ScrollView>

= face_info.sw.xml (el face_info.xml es el mismo, pero sin el interruptor)

<?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" >

    <Switch
        android:id="@+id/face_sw"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:tag="face_sw"
        android:text="Enabled?"
        android:textOff="No"
        android:textOn="Yes" />

    <com.zyphronics.AF.Controls.colorpicker.ColorPickerMenuView
        android:id="@+id/face_color"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:tag="face_color" />
</LinearLayout>

Incluso sin la parte "ColorPickerMenuView" en face_info_sw.xml, todavía no se llama a la vista secundaria. También he intentado tener el diseño relativo por sí solo, en lugar de en una vista de desplazamiento, pero esto impidió que se desplazaran más elementos agregados (y también los controles personalizados tienen tamaños extraños).

Cualquier ayuda para resolver esto sería genial. Si alguien necesita una fuente empaquetada de este (compatible con eclipse), como en los comentarios, responderé con un enlace.

Respuestas a la pregunta(2)

Su respuesta a la pregunta