Урок 45. Список-дерево ExpandableListView

Обсуждение уроков
assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 45. Список-дерево ExpandableListView

Сообщение assan » 25 июн 2013, 09:39

Foenix писал(а):Я имела ввиду - покажи свой проект с работающим деревом (с данными) где нет пока фрагмента. Нужно с ним вначале разобраться. Я хочу посмотреть как у тебя даные заполняются.
Вообще не пойму зачем сразу делать анимации, пока у тебя нормально данные не заполнены?
прошу извинить за долгое молчание, дела другие...

проблемы с заполнением не возникло, поэтому меня устроили те данные, что там есть.
в итоге заменил на другую анимацию, т.к. в данном случае видимо нет возможности заполнять не активный фрагмент (фрагмент не на activity)...
как заносятся данные у меня, таблица с данными заполняется из вне, по сети сервисом, поэтому её структура подогнана под простое запонение дерева, есть поле level для заполнения DEMO_NODES, и поле name для тектового поля

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

readBase(); //заполнение DEMO_NODES
        TreeType newTreeType = null;
        boolean newCollapsible;
        if (savedInstanceState == null) {
            manager = new InMemoryTreeStateManager<Long>();
            final TreeBuilder<Long> treeBuilder = new TreeBuilder<Long>(manager);
            for (int i = 0; i < DEMO_NODES.length; i++) {
                treeBuilder.sequentiallyAddNextNode((long) i, DEMO_NODES[i]);
            }
            newTreeType = TreeType.SIMPLE;
            newCollapsible = true;
        } else {
            manager = (TreeStateManager<Long>) savedInstanceState.getSerializable("treeManager");
            newTreeType = (TreeType) savedInstanceState.getSerializable("treeType");
            newCollapsible = savedInstanceState.getBoolean("collapsible");
        }
        setContentView(R.layout.main_demo);
.........................
 private void readBase() {
        File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File(sdCard.getAbsolutePath() + "/MyDB");
        directory.mkdirs();
        File dbFile = new File(directory, "myDB.db");
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
        Cursor c = db.query("mytable", null, null, null, null, null, null);
        if (c.moveToFirst()) {
            int idColIndex = c.getColumnIndex("id");
            int nameColIndex = c.getColumnIndex("name");
            int levelColIndex = c.getColumnIndex("level");
            int i = 0;
            DEMO_NODES = new int[c.getCount()];
            do {
                DEMO_NODES[i] = c.getInt(levelColIndex);
                i++;
            } while (c.moveToNext());
        }
        c.close();
        db.close();
    }
//в SimpleStandartAdapter
...........
   private String getDescription(final long id) {
        final Integer[] hierarchy = getManager().getHierarchyDescription(id);

        File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File(sdCard.getAbsolutePath() + "/MyDB");
        directory.mkdirs();
        File dbFile = new File(directory, "myDB.db");
        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
        String whe = "id=" + String.valueOf(id + 1);
        Cursor c = db.query("mytable", new String[]{"name"}, whe, null, null, null, null);
        c.moveToFirst();
        String st = c.getString(c.getColumnIndex("name"));
        c.close();
        db.close();


        return st;
    }
.............
но дальнейшая работа столкнулась с новой проблемой
после того как на главной активити все, что требуется для дерева выполнилось, дерево прячем таким образом

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

//прячем дерево, чтоб оно появлялось по требованию
        fr = (FrameLayout) findViewById(R.id.fr_tree);
        fr.setVisibility(View.GONE); //делаем фрейм не видимым
        anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_left_b); //анимацией задвигаем его влево
        fr.startAnimation(anim);
.....
 //назначение листенера кнопке
        Button mButton = (Button) findViewById(R.id.b1);
        final Context context = this;
        View.OnClickListener click1 = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //если дерево видно - прячем, иначе показываем
                if (fr.getVisibility() == View.GONE) {
                    ssr();
                } else {
                    ssl();
                }

            }
        };
        mButton.setOnClickListener(click1);


//показываем дерево - сдвигаем в право
    private void ssr() {
        fr.setVisibility(View.VISIBLE);
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_right);
        fr.startAnimation(anim);
    }

    //прячем дерево - сдвигаем в лево
    public void ssl() {
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_left);
        fr.startAnimation(anim);
        fr.setVisibility(View.GONE);
    }
после выдвижения фрейма с деревом вправо и обратного - влево, происходит странное -все слои, что ниже этого фрейма становятся как за стеклом, не реагируют на клики, как будто эт этого фрейма что-то остается..

dusshes
Сообщения: 23
Зарегистрирован: 25 сен 2013, 14:23

Re: Урок 45. Список-дерево ExpandableListView

Сообщение dusshes » 05 окт 2013, 21:17

Простой вроде бы вопрос, но не могу решить.
Нужно найти количество пикселей от верхнего края ExpandableListView до верхнего края выбранного Чилда.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Урок 45. Список-дерево ExpandableListView

Сообщение парень » 06 окт 2013, 14:34

Добрый день!

Как сделать список дерево как в уроке, но с маленьким изменением - не на каждую группу будет подгруппа. Например делается список групп "Транспорт", "Продукты", "Бассейн", "Телефон". И соответственно подгруппы на каждую группу - в "транспорт" пойдет "автобус","трамвай", "маршрутка" и т.д... в "продукты" - "хлеб","молоко" и т.д. А в группу "бассейн", не пойдет никаких подгрупп.

Сам еще не пробовал кодить данный пример... Пробую на бумаге :)

И второй почти такой же вопрос по данному примеру:
Данные хранятся в базе в виде id,name,roditel,id_roditel.
id -авто номер.
name - название.
roditel - или 1 или 0. 0- элемент родитель (есть подгруппа), 1-подгруппа в группе с номером группы id_roditel.
Нужно автопостроение списка из этих данных.
Думаю так делать:
1. читаю базу и создаю двумерный массив Massiv(x)(y) - где x=номер группы, y=номер подгруппы. значение массива name (из базы с названием группы\подгруппы).
2. Делаю цикл по X, в котором идет проверка на наличие подгруппы - если есть то надо добавлять коллекцию подгруппы к группе, а если нет то не надо.
3. все как в примере...

Все данные динамические, и будут редактироваться\удаляться,создаваться пользователем... (в базе соотвественно все в хаотичном порядке)

вот на втором пункте то я и задумался... как реализовать... извините если много текста и непонтно объяснил задачу...

Заранее спасибо
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Урок 45. Список-дерево ExpandableListView

Сообщение парень » 07 окт 2013, 16:46

up...
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 07 окт 2013, 16:50

а че ап, читай тему, этот вопрос уже мусолили
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Урок 45. Список-дерево ExpandableListView

Сообщение парень » 07 окт 2013, 17:32

Foenix писал(а):а че ап, читай тему, этот вопрос уже мусолили
ткни в меня ссылкой плз, перечитал всю тему... некоторые сообщения перечитывал несколько раз, а некоторые более 10 раз... я совсем плох? ;) Не увидел "моего вопроса" ... ну или направление куда рыть... желательно с примером.
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 07 окт 2013, 19:06

да вот именно так и был задан вопрос - как сделать дерево, в котором некоторые ветки без подгрупп. Значит была другая тема, но про ExpandableListView, ищи в поиске это слово.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Isaev » 18 окт 2013, 13:20

А скорость сворачивания/разворачивания можно как-то менять?

yushka
Сообщения: 1
Зарегистрирован: 22 окт 2013, 21:17

Re: Урок 45. Список-дерево ExpandableListView

Сообщение yushka » 22 окт 2013, 21:23

А можете подсказать, можно ли переименовывать id у child'ов ?? вот допустим у нас есть structure.xml , из которого парсим список. И хочется, чтобы id были не 0,1,2... а id_name0, id_name1 , id_name2 ...

MKDenys
Сообщения: 1
Зарегистрирован: 27 окт 2013, 17:41

Re: Урок 45. Список-дерево ExpandableListView

Сообщение MKDenys » 27 окт 2013, 17:52

Помогите добавить рисунки для каждого элемента группы. Нашел пример (№15): http://www.vogella.com/articles/Android ... ticle.html
Только не могу сделать чтобы они были разными.

Scotik
Сообщения: 19
Зарегистрирован: 14 авг 2013, 12:28

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Scotik » 29 окт 2013, 17:56

вопрос можно ли сворачивать и разворачивать ExpandableListView только на groupIndicator?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 45. Список-дерево ExpandableListView

Сообщение altwin » 13 ноя 2013, 14:50

Можно вопрос? Разве нормально в обучающих примерах закладывать заведомо bad practice???

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

Для примера:
добавить функцию -

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

private ArrayList childItemIterator(String[] phones) {
        childDataItem = new ArrayList<Map<String, String>>();
        for (String phone : phones) {
            m = new HashMap<String, String>();
            m.put("phoneName", phone);
            childDataItem.add(m);
        }
        return childDataItem;
    }
удалить лишнее и делать так -

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

        childItemIterator(phonesHTC);
        childData.add(childDataItem);

        childItemIterator(phonesSams);
        childData.add(childDataItem);

        childItemIterator(phonesLG);
        childData.add(childDataItem);
P.S. При желании можно и еще минимум в половину уменьшить число строк кода, но остальное - терпимо. спасибо, очень интересные уроки...
Изображение

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 45. Список-дерево ExpandableListView

Сообщение trew » 13 ноя 2013, 15:05

altwin писал(а):Можно вопрос? Разве нормально в обучающих примерах закладывать заведомо bad practice???

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

Для примера:
добавить функцию -

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

private ArrayList childItemIterator(String[] phones) {
        childDataItem = new ArrayList<Map<String, String>>();
        for (String phone : phones) {
            m = new HashMap<String, String>();
            m.put("phoneName", phone);
            childDataItem.add(m);
        }
        return childDataItem;
    }
удалить лишнее и делать так -

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

        childItemIterator(phonesHTC);
        childData.add(childDataItem);

        childItemIterator(phonesSams);
        childData.add(childDataItem);

        childItemIterator(phonesLG);
        childData.add(childDataItem);
P.S. При желании можно и еще минимум в половину уменьшить число строк кода, но остальное - терпимо. спасибо, очень интересные уроки...
Для новичков - это наглядно как и что происходит. Поэтому у меня претензий нет. :)
Вы ведь можете ещё попросить усложнить этот пример. Например, массивы получать из файлов.
Поэтому, я бы оставил всё как есть.

Между прочим, если количество чилдренов будет разное, в каждой группе - Ваша оптимизация не подходит.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 45. Список-дерево ExpandableListView

Сообщение altwin » 13 ноя 2013, 15:19

trew писал(а):
altwin писал(а):
Между прочим, если количество чилдренов будет разное, в каждой группе - Ваша оптимизация не подходит.
Не совсем понял если честно, что вы имеете в виду под чилдренами? в данном случае эта функция просто удаляет дублирования кода вообще не касаясь логики... простой итератор и количество элементов значения не имеет(по сути даже не я это сделал а IDEA ;)).

P.S. дублирование кода - это один из первый признаков кода, от которого "дурно пахнет" (термин не я придумал ;)). Все конечно понятно и я не спорю, что логика есть, но переучить всегда труднее... Подобные вещи должны быть на уровне инстинкта и человеку должно быть не приятно писать код методом ctr+C/ctr+V...

Но по сути наверно не важно, надеюсь не придется возвращаться к данному уроку и я такого не увижу больше )))). Попытался поступить правильно ради интереса, как делал раньше - набрать весь код ручками... очень плевался ;)

P.S.v.2.0 Ну а если вдаваться в подробности реализации - я бы вообще не стал использовать Array в случае частого поиска элементов :) Все таки очень затратная операция. Да и вообще как по мне- для реализации List идеально подходит двустороння очередь( double ended queue) , просто решил написать о том, что явно режет глаз, ни в коем случае не пытаясь как то отнять лавры у автора.. очень благодарен за проделанную работу ;)
Изображение

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 45. Список-дерево ExpandableListView

Сообщение trew » 13 ноя 2013, 15:31

altwin
Извините, был не внимателен. Думал, Вы решили несколько циклов for объединить.

Да, действительно можно уменьшить количество кода. Просто эта оптимизация, будет заставлять новичков
дополнительно ещё думать.
А нужно доносить материал очень доступно. А потом показывать, как сократить количество кода.
У всех разный уровень знаний.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 45. Список-дерево ExpandableListView

Сообщение altwin » 13 ноя 2013, 15:40

trew писал(а):altwin
У всех разный уровень знаний.
Да конечно понимаю и не против.. но честное слово очень режет глаз и боюсь в работе подобное встретить ;)

по сути, для желающих можно порекомендовать вот такую штуку почитать - http://habrahabr.ru/post/111501/, вредно точно не будет.

P.S. и кстати, заметил автор любит выполнять одно действие разными способами, не знаю уж для ознакомления или просто от скуки, но вот еще пример, как повысить читаемость и разнообразить жизнь ;)
https://github.com/roboguice/roboguice/wiki
Изображение

Аватара пользователя
BeKZaT
Сообщения: 41
Зарегистрирован: 27 сен 2013, 23:28

Re: Урок 45. Список-дерево ExpandableListView

Сообщение BeKZaT » 17 ноя 2013, 17:21

ПОМОГИТЕ ПОЖАЛУЙСТА !
Как поставить иконки(значки) рядом с заголовком текста
Снимок.PNG
Снимок.PNG (17.57 КБ) 12312 просмотров
Код MainActivity:
[syntax=xml]import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;

public class MainActivity extends Activity {

String[] groups = new String[] { "Как начать ?", "Игровой процесс", "Гайды","Новости" };

String[] winterMonths = new String[] { "1.Регистрация на сайте", "2.Добавление скина", "3.Скачаивание лаунчера" };
String[] springMonths = new String[] { "Март", "Апрель", "Май" };
String[] summerMonths = new String[] { "Июнь", "Июль", "Август" };
String[] autumnMonths = new String[] { "Сентябрь", "Октябрь", "Ноябрь" };
// коллекция для групп
ArrayList<Map<String, String>> groupData;

// коллекция для элементов одной группы
ArrayList<Map<String, String>> childDataItem;

// общая коллекция для коллекций элементов
ArrayList<ArrayList<Map<String, String>>> childData;
// в итоге получится childData = ArrayList<childDataItem>

// список атрибутов группы или элемента
Map<String, String> m;

ExpandableListView expandableListView1;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// заполняем коллекцию групп из массива с названиями групп
groupData = new ArrayList<Map<String, String>>();
for (String group : groups) {
// заполняем список атрибутов для каждой группы
m = new HashMap<String, String>();
m.put("groupName", group); // время года
groupData.add(m);
}

// список атрибутов групп для чтения
String groupFrom[] = new String[] { "groupName" };
// список ID view-элементов, в которые будет помещены аттрибуты групп
int groupTo[] = new int[] { android.R.id.text1 };

// создаем коллекцию для коллекций элементов
childData = new ArrayList<ArrayList<Map<String, String>>>();

// создаем коллекцию элементов для первой группы
childDataItem = new ArrayList<Map<String, String>>();
// заполняем список аттрибутов для каждого элемента
for (String month : winterMonths) {
m = new HashMap<String, String>();
m.put("monthName", month); // название месяца
childDataItem.add(m);
}
// добавляем в коллекцию коллекций
childData.add(childDataItem);

// создаем коллекцию элементов для второй группы
childDataItem = new ArrayList<Map<String, String>>();
for (String month : springMonths) {
m = new HashMap<String, String>();
m.put("monthName", month);
childDataItem.add(m);
}
childData.add(childDataItem);

// создаем коллекцию элементов для третьей группы
childDataItem = new ArrayList<Map<String, String>>();
for (String month : summerMonths) {
m = new HashMap<String, String>();
m.put("monthName", month);
childDataItem.add(m);
}
childData.add(childDataItem);

// создаем коллекцию элементов для четвертой группы
childDataItem = new ArrayList<Map<String, String>>();
for (String month : autumnMonths) {
m = new HashMap<String, String>();
m.put("monthName", month);
childDataItem.add(m);
}
childData.add(childDataItem);

// список аттрибутов элементов для чтения
String childFrom[] = new String[] { "monthName" };
// список ID view-элементов, в которые будет помещены аттрибуты
// элементов
int childTo[] = new int[] { android.R.id.text1 };

SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
this, groupData,
android.R.layout.simple_expandable_list_item_1, groupFrom,
groupTo, childData, android.R.layout.simple_list_item_1,
childFrom, childTo);

expandableListView1 = (ExpandableListView) findViewById(R.id.expandableListView1);
expandableListView1.setAdapter(adapter);
}
}[/syntax]
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 17 ноя 2013, 17:43

используй кастомный иерархический вью. Тут в ветке давали названия разных и ссылки на них.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
BeKZaT
Сообщения: 41
Зарегистрирован: 27 сен 2013, 23:28

Re: Урок 45. Список-дерево ExpandableListView

Сообщение BeKZaT » 17 ноя 2013, 17:48

Foenix писал(а):используй кастомный иерархический вью. Тут в ветке давали названия разных и ссылки на них.
ПОДРОБНЕЕ пожалуйста
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 45. Список-дерево ExpandableListView

Сообщение Foenix » 17 ноя 2013, 18:00

вы хотите, чтоб я за вас почитала всю ветку?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить