getChildView wird nicht aufgerufen
Ich erstelle ein Menü, das einen benutzerdefinierten ExpandableListView-Adapter enthält. Obwohl ich versuche, meinen Code so gut wie möglich mit den API-Beispielen und anderen Beispielen abzugleichen, die ich online gesehen habe (einschließlich mehrerer eng verwandter SO-Fragen), kann ich ihn immer noch nicht zum Laufen bringen.
Ich weiß, dass der Adapter verwendet wird, weil die Gruppenansicht angezeigt wird (die aus einer XML-Datei besteht). Durch Klicken auf das Gruppenelement wird auch "getGroupView" aufgerufen, der Code führt jedoch niemals "getChildView", "getChild" oder "getChildId" aus.
Ich habe sogar den Android-15-Quellcode durchgesehen, um herauszufinden, was ich möglicherweise falsch gemacht habe, aber es ist nichts Ungewöhnliches aufgetaucht.
= Basisaktivität
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;
}
}
}
= Erweiterbarer Listenansicht-Adapter
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-Ansicht der Aktivität
<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ü für die Hintergrundeinstellung)
<?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 (Die face_info.xml ist dieselbe, aber ohne den Schalter)
<?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>
Auch ohne den Teil "ColorPickerMenuView" in der Datei face_info_sw.xml wird die untergeordnete Ansicht immer noch nicht aufgerufen. Ich habe auch versucht, das relative Layout allein anstatt in einer Bildlaufansicht zu haben, aber dies verhinderte, dass ein Bildlauf zu weiteren hinzugefügten Elementen durchgeführt werden konnte (und benutzerdefinierte Steuerelemente hatten seltsame Größen).
Jede Hilfe, um dies zu lösen, wäre großartig. Wenn jemand eine gepackte Quelle dafür braucht (Eclipse-kompatibel), wie in den Kommentaren und ich werde mit einem Link antworten.