Intereting Posts
Кордова Build – игнорировать файлы Как передать изображение по умолчанию предыдущей активности, если изображение не выбрано Может android PopupWindow показать другое PopupWindow? SelectionArgs в SQLiteQueryBuilder не работает с целыми значениями в столбцах Необычный способ обработки фрагментации при изменении ориентации Использование пользовательских представлений в XML без использования полностью квалифицированного имени класса Adb shell dumpsys meminfo – В чем смысл каждой ячейки его вывода? Android Studio, неожиданно возникла проблема с драйвером GPU при запуске эмулятора Полноэкранное уведомление, показывающее только заголовки Проверка EditText с помощью TextWatcher Как ссылаться на файл в необработанной папке на Android Android webview SKIPS javascript даже с setJavascriptEnabled (true) и WebChromeClient Bintray: невозможно загрузить файлы: группа Maven, артефакт или версия, определенные в файле pom, не совпадают Перетаскивание + пользовательский чертеж на Android Android Studio: как удалить APK (или выполнить команду adb) автоматически до запуска или отладки?

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 дочерний вид все еще не вызывается. Я также попытался использовать Relative Layout самостоятельно, а не в виде прокрутки, но это предотвратило прокрутку дополнительных добавленных элементов (а также сделало пользовательские элементы управления странными размерами).

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

Solutions Collecting From Web of "GetChildView не вызывается"

Проблема в том, что ваш ExpandableListView находится в ScrollView. В большинстве случаев это результат плохих макетов, и вы должны стараться избегать его.

Однако иногда это единственное решение (на самом деле это не так, но другие решения могут быть не такими). Ваше решение также работает, но немного сложнее. Вместо этого напишите собственный ExpandableListView следующим образом:

 public class ExpandExpandableListView extends ExpandableListView{ boolean expanded = true; public ExpandExpandableListView(Context context) { super(context); } public ExpandExpandableListView(Context context, AttributeSet attrs) { super(context, attrs); } public ExpandExpandableListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public boolean isExpanded() { return expanded; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (isExpanded()) { // Calculate entire height by providing a very large height hint. // View.MEASURED_SIZE_MASK represents the largest height possible. int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); }else{ super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } public void setExpanded(boolean expanded) { this.expanded = expanded; } } 

И в вашем файле m_backdrop.xml:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" ... <RelativeLayout ... <com.package.name.to.class.ExpandExpandableListView android:id="@+id/FaceList" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_below="@id/Title_GeneralSettings_text" > </ExpandableListView> </RelativeLayout> </ScrollView> 

Это уже так. Он должен работать должным образом.

Bummer, что никто не смог ответить на этот вопрос … но, к счастью, мне удалось найти решение этой проблемы, чтобы другие могли добавлять расширяемые виды списка к своим фрагментам.

Я нашел решение, проверяя исходный код для счетчика (потому что я хотел создать счетчик с пользовательскими записями). Ключевым моментом в коде был «onMeasure», когда он измеряет всех своих детей … ну, до заданного предела в 15, но основным является измерение детей.

= Решение = При создании адаптера необходимо передать родительский вид. Это ключ, потому что это единственная ссылка, которую вы используете для просмотра с адаптера (только простой способ).

 public Context context; public ExpandableListView parent; private LayoutInflater inflator; // Only measure this many items to get a decent max height. private static final int MAX_ITEMS_MEASURED = 15; public ExpandableFaceList(Context context, final ExpandableListView parent) { this.context = context; this.parent = parent; this.inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mDensity = context.getResources().getDisplayMetrics().density; } 

Далее, в вашем «getGroupView», потому что это, кажется, единственное, что обычно называется, вам нужно добавить следующий код:

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if(convertView != null) { int nH = 0; if(isExpanded) { nH = measureChildrenHeight(groupPosition); } else { nH = convertView.getMeasuredHeight(); } parent.getLayoutParams().height = (int) (nH * mDensity); parent.invalidate(); } return convertView; } 

Ключевой частью вышеуказанного кода является «measureChildrenHeight», «convertView.getMeasuredHeight ()» – это просто восстановление ПЗВ при свертывании. Код детского измерения выглядит следующим образом:

 int measureChildrenHeight(int groupPosition) { int height = 0; View itemView = null; LinearLayout viewGroup = new LinearLayout(context); viewGroup.setOrientation(LinearLayout.VERTICAL); final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); // Make sure the number of items we'll measure is capped. If it's a huge data set // with wildly varying sizes, oh well. int start = 0;//Math.max(0, getSelectedItemPosition()); final int end = Math.min(getChildrenCount(groupPosition), start + MAX_ITEMS_MEASURED); final int count = end - start; start = Math.max(0, start - (MAX_ITEMS_MEASURED - count)); for (int i = start; i < end; i++) { itemView = getChildView(groupPosition, i, (i+1 == end), itemView, viewGroup); if (itemView.getLayoutParams() == null) { itemView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } itemView.measure(widthMeasureSpec, heightMeasureSpec); if(i+1 != end) height += itemView.getMeasuredHeight();//Math.max(height, itemView.getMeasuredHeight()); } return height; } 

Примечание. Мне пришлось настроить код, чтобы исключить высоту последнего элемента, поскольку он добавлял дополнительное пространство под последний элемент. Если у вас есть дети разной высоты, могут возникнуть проблемы. Я все еще получаю пустое место под заголовком children / group, но это простительно (в отличие от предыдущей суммы, которая составляла 3-4 ребенка).