getChildView не вызывается

Я делаю меню, которое включает в себя пользовательский адаптер ExpandableListView. Несмотря на попытки сопоставить мой код с примерами API и любыми другими примерами, которые я видел в Интернете (включая несколько тесно связанных вопросов SO), я все еще не могу заставить его работать.

Я знаю, что адаптер используется, потому что отображается представление группы (которое сделано из XML). Нажатие на элемент группы также вызывает «getGroupView», но код никогда не запускает «getChildView», «getChild» или «getChildId».

Я даже просмотрел исходный код Android-15, чтобы выяснить, что я мог сделать неправильно, но ничего странного не произошло.

= Базовая активность

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;
        }
    }
}

= Расширяемый Адаптер Представления Списка

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;
    }
}

= Вид деятельности xml

<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 (меню для настройки фона)

<?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 (face_info.xml такой же, но без переключателя)

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

Даже без части «ColorPickerMenuView» в face_info_sw.xml дочернее представление все еще не вызывается. Я также попытался использовать Относительный макет сам по себе, а не в виде прокрутки, но это предотвратило прокрутку дополнительных добавленных элементов (а также сделал нестандартные размеры пользовательских элементов управления).

Любая помощь, чтобы решить это было бы здорово. Если кому-то понадобится упакованный источник этого (совместимый с Eclipse), как в комментариях, я отвечу ссылкой.

Ответы на вопрос(2)

Ваш ответ на вопрос