Парсинг HashMap<Obj1,List<Obj2>> в BaseExpandableListAdapter

Ответить
Аватара пользователя
Arvalon
Сообщения: 5
Зарегистрирован: 07 июл 2016, 21:49

Парсинг HashMap<Obj1,List<Obj2>> в BaseExpandableListAdapter

Сообщение Arvalon » 16 июл 2016, 20:11

Доброго дня.
Пишу кастомный адаптер, унаследованный от BaseExpandableListAdapter для заполнения ExpandableListView. В адаптер передаётся коллекция HashMap, ключём в которой является объект. Это не специально, так получилось т.к. я захотел что бы у заголовков групп был не только текст, но и картинка. И простой int или String в качестве ключа уже не подходит. Соответственно получилось:
Адаптер

Код: Выделить всё

public class AddMusclesToExerciseAdapter extends BaseExpandableListAdapter {
 
Context ctx;
Map<MuscleGroup,List<Muscle>> musclesByGroups=new HashMap<>();
 
    public AddMusclesToExerciseAdapter(Context context, Map<MuscleGroup, List<Muscle>> inputMap){
 
        ctx=context;
        musclesByGroups=inputMap;
    }
 
    @Override
    public int getGroupCount() {
        return musclesByGroups.size();
    }
 
    @Override
    public int getChildrenCount(int groupPosition) {
        return 0;
    }
 
    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }
 
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }
 
    @Override
    public long getGroupId(int groupPosition) {
        return 0;
    }
 
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return 0;
    }
 
    @Override
    public boolean hasStableIds() {
        return false;
    }
 
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        return null;
    }
 
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        return null;
    }
 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
}
И тут, ещё не добравшись до "сложных" методов getGroupView и getChildView, с которыми ещё придётся повозиться, настал полный ступор. C getGroupCount разобрался, но не понимаю что писать в
  • getChildrenCount
  • getGroup
  • getChild
  • getGroupId
  • getChildId
  • isChildSelectable
Ведь во всех них на вход подаётся int groupPosition!

А в некоторых ещё и int childPosition, но с этим по идее понятно. Ведь значениями у ключей моей HashMap является коллекция, реализующая интерфейс List, там "на первый-второй рассчитайся" можно сделать, перечисляемая коллекция.

Но у меня нет номера ключа коллекции HashMap, откуда его взять вообще?

Класс объектов, используемого в качестве ключа - MuscleGroup

Код: Выделить всё

public class MuscleGroup {
    private int id;
    private String name;
    private int power;
    private byte[] img;
    private String description;
 
    public MuscleGroup(int id, String name, int power, byte[] img, String description) {
        this.id = id;
        this.name = name;
        this.power = power;
        this.img = img;
        this.description = description;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    public int getId() {return id;}
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public byte[] getImg() {
        return img;
    }
 
    public void setImg(byte[] img) {
        this.img = img;
    }
 
    public int getPower() {
        return power;
    }
 
    public void setPower(int power) {
        this.power = power;
    }
 
    @Override
    public int hashCode(){
        return getId();
    }
 
    @Override
    public boolean equals(Object o) {
        if ((o!=null) && (o instanceof MuscleGroup)) {
            if (this.getId()==((MuscleGroup) o).getId()) return true;
        }
        return false;
    }
}
В принципе в нём есть поле ID - оно 100% уникально т.к. это первичный ключ из БД. Можно использовать его под groupPosition, сделать проброс из класса ключа в адаптер? Что-то говорит что что могут быть проблемы если это хоть как-то заработает вообще. Например если у последовательности в БД, формирующий это ID, будут "дырки" после удаления-добавления записей.

В кратце, как нумеровать ключи в HasMap?
Последний раз редактировалось Arvalon 18 июл 2016, 11:11, всего редактировалось 1 раз.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Парсинг HashSet<Obj1,List<Obj2>> в BaseExpandableListAda

Сообщение klblk » 18 июл 2016, 05:34

кажется вы путаете HashSet и HashMap это разные вещи.
Сделайте дополнительное поле со списком ключей. И уже в этом списке по позиции получайте ключ, а по ключу из мэпа значение.
[syntax=java5]keyList = new ArrayList<MuscleGroup>(musclesByGroups.keySet());[/syntax]

Аватара пользователя
Arvalon
Сообщения: 5
Зарегистрирован: 07 июл 2016, 21:49

Re: Парсинг HashSet<Obj1,List<Obj2>> в BaseExpandableListAda

Сообщение Arvalon » 18 июл 2016, 11:09

klblk писал(а):кажется вы путаете HashSet и HashMap это разные вещи.
Да да, спасибо, ошибся при наборе большого сообщения. У меня везде в коде HashMap. Поправил везде.

klblk писал(а):Сделайте дополнительное поле со списком ключей. И уже в этом списке по позиции получайте ключ, а по ключу из мэпа значение.
[syntax=java5]keyList = new ArrayList<MuscleGroup>(musclesByGroups.keySet());[/syntax]
Т.е. в адаптер передаётся всё тот же HashMap, а далее из него с помощью keySet можно получить список ключей и положить всё в ArrayList. А в свою очередь у элементов ArrayList можно получить порядковые номера? Если я правильно понял.

Totplay
Сообщения: 1
Зарегистрирован: 18 июл 2016, 23:00

Re: Парсинг HashMap<Obj1,List<Obj2>> в BaseExpandableListAda

Сообщение Totplay » 18 июл 2016, 23:07

Сделайте дополнительное поле со списком ключей. И уже в этом списке по позиции получайте ключ, а по ключу из мэпа значение.
Заработай на своем adndoid/iphone устанавливая приложения с Play market и App Store.Ссылка - http://go.advertapp.ru/9o4td

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Парсинг HashSet<Obj1,List<Obj2>> в BaseExpandableListAda

Сообщение klblk » 19 июл 2016, 06:20

Arvalon писал(а):Т.е. в адаптер передаётся всё тот же HashMap, а далее из него с помощью keySet можно получить список ключей и положить всё в ArrayList. А в свою очередь у элементов ArrayList можно получить порядковые номера? Если я правильно понял.
Да именно так. Может можно сделать более правильно, но это первое что приходит на ум.

Ответить