ExpandableListView показывает индикатор для групп без дочернего

Я создаю ExpandableListView с данными из базы данных. Для этого я использую CursorTreeAdapter и я заполняю его объектом Cursor который содержит данные, которые я извлекаю из базы данных.

Я думал, что по умолчанию Android будет рассматривать группы без дочернего «не расширяемого» .

Однако он все еще показывает значок расширения в строке, и когда я нажимаю на него, он ничего не делает. Я не хочу, чтобы он показывал эту иконку.

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


ОБНОВИТЬ

Я изучил свой код, и я видел, что проблема в основном заключается в настройке groupIndicator для групп. Однако я пробовал множество подходов, таких как создание селектора и установка его на основе состояния и расширяемости, например:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_empty="true" android:state_expanded="false" android:drawable="@android:color/transparent"/> <item android:drawable="@drawable/expander_ic_maximized" /> </selector> 

Но когда группа рушится, она скрывается для всех групп, включая те, у которых есть дети (поскольку Android распознал свернутые группы как пустые).

Любой лучший подход для установки показателя только для групп с детьми?


Вот мой код.

 public class ContactsExpandableListAdapter extends CursorTreeAdapter { TextView mContactNameTextView, mContactNumberTextView; Cursor mChildrenCursor = null; public ContactsExpandableListAdapter(Cursor cursor, Context context) { super(cursor, context); } @Override protected Cursor getChildrenCursor(Cursor cursor) { if(mContactId == -1) mContactId = null; return mController.getContactById(mContactId); } public int getChildrenCount(int groupPosition) { return mChildrenCursor.getCount(); } @Override protected View newGroupView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) { View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); else mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); return view; } @Override protected View newChildView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) { View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } else { mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } view.setTag(cursor.getString(cursor.getColumnIndex("contact_number"))); return view; } @Override protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); else mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); } @Override protected void bindChildView(View view, Context context, Cursor cursor, boolean paramBoolean) { if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } else { mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } } } 

В xml добавьте в ExpandableListView следующее:

  android:groupIndicator="@android:color/transparent" 

Чем для каждого элемента группы в вашем адаптере нужен внутренний индикатор. Например, вы можете добавить ImageView с правой стороны в ваш .xml.

Затем в адаптере вы делаете следующее:

 @Override protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) ... if (getChildrenCount(groupPosition) > 0) { viewHolder.indicator.setVisibility(View.VISIBLE); viewHolder.indicator.setImageResource( isExpanded ? R.drawable.indicator_expanded : R.drawable.indicator); } else { viewHolder.indicator.setVisibility(View.GONE); } } 

В вашем классе адаптера используйте:

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent) { if (getChildrenCount(groupPosition) == 0 ) { indicator.setVisibility( View.INVISIBLE ); } else { indicator.setVisibility( View.VISIBLE ); indicator.setImageResource( isExpanded ? R.drawable.group_expanded : R.drawable.group_closed ); } } 

Почему бы не оставить без детей детей?

Измените свой запрос, чтобы дать вам только группы, в которых будут дети.