ExpandableListView с разными layout в childView

Ответить
EspanaMia
Сообщения: 24
Зарегистрирован: 10 янв 2014, 11:03

ExpandableListView с разными layout в childView

Сообщение EspanaMia » 07 окт 2014, 13:57

Подскажите, как правильно реализовать ExpandableListView???
В случае, если используется везде один layout, то структура будет такая:

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

    
 if (convertView == null) {
                holder = new viewHolder();
                convertView = inflater.inflate(R.layout.child_item, parent, false);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
но как быть, если у каждого groupPosition в childView используется разный layout ?

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: ExpandableListView с разными layout в childView

Сообщение Leeroy » 07 окт 2014, 19:59

Переопредели методы
public int getItemViewType(int position)
public int getViewTypeCount()

а в

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

@Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // Choose the layout type
        int viewType = getItemViewType(cursor.getPosition());
        int layoutId = -1;
        switch (viewType) {
            case VIEW_TYPE_ONE: {
                layoutId = R.layout.list_item_one;
                break;
            }
            case VIEW_TYPE_TWO: {
                layoutId = R.layout.list_item_two;
                break;
            }
        }
        View view = LayoutInflater.from(context).inflate(layoutId, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);
        view.setTag(viewHolder);

        return view;
    }
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: ExpandableListView с разными layout в childView

Сообщение KamiSempai » 08 окт 2014, 09:20

Leeroy писал(а):Переопредели методы
public int getItemViewType(int position)
public int getViewTypeCount()

а в

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

@Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // Choose the layout type
        int viewType = getItemViewType(cursor.getPosition());
        int layoutId = -1;
        switch (viewType) {
            case VIEW_TYPE_ONE: {
                layoutId = R.layout.list_item_one;
                break;
            }
            case VIEW_TYPE_TWO: {
                layoutId = R.layout.list_item_two;
                break;
            }
        }
        View view = LayoutInflater.from(context).inflate(layoutId, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);
        view.setTag(viewHolder);

        return view;
    }
Не получится. У ExpandableListAdapter нет таких методов. Нужно искать альтернативные библиотеки, так как ExpandableListView такой возможности не предоставляет.
Можно конечно не переиспользовать View и игнорировать convertView, создавая каждый раз новую, подходящую для текущей строки View. Но это больше из разряда вредных советов.

А еще можно самому вести учет View для переиспользования. У AbsListView есть слушатель RecyclerListener он срабатывает когда View отправляется в кучу для не используемых View. Но для реализации подобного нужно хорошо понимать как работает ListView. И еще мне не совсем понятно как поведет себя ListView если подсовывать ему View из его же списка ScrapViews.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

EspanaMia
Сообщения: 24
Зарегистрирован: 10 янв 2014, 11:03

Re: ExpandableListView с разными layout в childView

Сообщение EspanaMia » 10 окт 2014, 10:12

Проблема решилась методами:
public int getChildType(final int groupPosition, final int childPosition)
public int getChildTypeCount()

спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: ExpandableListView с разными layout в childView

Сообщение KamiSempai » 11 окт 2014, 10:23

EspanaMia писал(а):Проблема решилась методами:
public int getChildType(final int groupPosition, final int childPosition)
public int getChildTypeCount()

спасибо.
Хм. По началу удивился как так получилось, ведь у ExpandableListAdapter ДЕЙСТВИТЕЛЬНО нет таких методов. Оказывается есть еще один интерфейс HeterogeneousExpandableList в нем они есть и все реализации ExpandableListAdapter дополнительно реализуют HeterogeneousExpandableList. Такие дела.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

EspanaMia
Сообщения: 24
Зарегистрирован: 10 янв 2014, 11:03

Re: ExpandableListView с разными layout в childView

Сообщение EspanaMia » 11 окт 2014, 10:36

они есть в BaseExpandableListAdapter
http://developer.android.com/reference/ ... apter.html

Ответить