ExpandableListView; добавление itms помешает расширенным элементам

В настоящее время у меня есть ExpandableListView, который обрабатывается настраиваемым объектом BaseExpandableListAdapter (см. Ниже фрагменты). Список заполняется Plate-объектами, которые имеют название, показанное на уровне группы, расширенный элемент затем показывает некоторую информацию о Plate, например make.

Проблема, с которой я столкнулась, заключается в том, что мне нужно динамически добавлять элементы в список сверху, то есть вставлять новую позицию позиции позиции 0 в ArrayList элементов. Проблема, с которой я сейчас столкнулся, заключается в том, что если элемент в позиции 1 расширяется и я добавляю новый элемент, "расширенный статус" по-прежнему находится в позиции 1, хотя этот элемент теперь находится в позиции 2. Аналогично, элемент ранее в позиции 0 теперь расширяется. Элемент теперь в позиции 2 закрыт.

Как я могу контролировать открытые элементы, когда добавляю новые элементы в массив? Должен ли я не добавлять новые элементы непосредственно в массив? Или мне нужно переопределить notifyDataSetChanged() или что-то еще?

Фрагмент из кода, который добавляет элементы (прослушиватель кнопок):

int _position = this.recent_list.indexOf( new_plate );
if ( _position == -1 ) { this.recent_list.add( 0, new_plate );
} else { this.recent_list.get( _position ).duplicate( ); //Just adds info that it exists twice
}
this.recent_list_adapter.notifyDataSetChanged( );

Это настраиваемый адаптер:

public class RecentExpandableListAdapter extends BaseExpandableListAdapter { private Context context; private List<plate> list_data; public RecentExpandableListAdapter( Context context, List<plate> list_data ) { this.context = context; this.list_data = list_data; } @Override public Object getGroup( int plate_position ) { return this.list_data.get( plate_position ); } @Override public long getGroupId( int plate_position ) { return plate_position; } @Override public int getGroupCount( ) { return this.list_data.size( ); } @Override public Object getChild( int plate_position, int child_posititon ) { return this.list_data.get( plate_position ); } @Override public long getChildId( int plate_position, int child_position ) { return child_position; } @Override public int getChildrenCount( int plate_position ) { return 1; } @Override public View getGroupView( int plate_position, boolean is_expanded, View convert_view, ViewGroup parent ) { //The supplied view may be null, so we check if we need a new one if ( convert_view == null ) { LayoutInflater _inflater = ( LayoutInflater ) this.context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); convert_view = _inflater.inflate( R.layout.list_recent_group, parent, false ); } TextView list_header = ( TextView ) convert_view.findViewById( R.id.label_recent_group_name ); String header_title = getGroup( plate_position ).toString( ); list_header.setTypeface( null, Typeface.BOLD ); list_header.setText( header_title ); return convert_view; } @Override public View getChildView( int plate_position, final int child_position, boolean is_last_child, View convert_view, ViewGroup parent ) { //The supplied view may be null, so we check if we need a new one if ( convert_view == null ) { LayoutInflater infal_inflater = ( LayoutInflater ) this.context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); convert_view = infal_inflater.inflate(R.layout.list_recent_plate_info, parent, false ); } TextView _make = ( TextView ) convert_view.findViewById( R.id.label_recent_plate_make_value ); String child_text = getChild( plate_position, child_position ).toString( ); _make.setText( child_text ); return convert_view; } @Override public boolean hasStableIds( ) { return false; } @Override public boolean isChildSelectable( int plate_position, int child_position ) { return true; }
}
</plate></plate>
1 ответ

Получил это сам сейчас!

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

Этот метод просто вернул позицию, но когда он был изменен на ссылку на фактический элемент, теперь он нормально обрабатывает расширенный статус. Я изменил метод на:

@Override
public long getGroupId( int plate_position ) { return this.list_data.get( plate_position ).hashCode( );
}

licensed under cc by-sa 3.0 with attribution.