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.