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

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 02 окт 2012, 20:34

String[] data = getResources().getTextArray(R.array.secondlines);
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 02 окт 2012, 20:43

rezak90 как всегда оперативен.
Только что нашел в Интернете: String[] groups = getResources().getStringArray(R.array.groups);
Спасибо.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 02 окт 2012, 21:41

Рано радовался.

Поменял на
String[] groups = getResources().getStringArray(R.array.groups);
String[] productsVeg = getResources().getStringArray(R.array.productsVeg);
и перестала исполняться.

Может в strings что-то не так отображаю:

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">MainActivity</string>
    <string-array name="groups">
        <item>Овощи</item>
        <item>Фрукты</item>
        <item>Молочные продукты</item>
        <item>Бакалея</item>
    </string-array>
    <string-array name="productsVeg">    
        <item>Картошка</item>
        <item>Морковь</item>
        <item>Лук</item>
        <item>Чеснок</item>
        <item>Баклажаны</item>
        <item>Помидоры</item>
        <item>Огурцы</item>
        <item>Капуста</item>
        <item>Свекла</item>
        <item>Редька</item>
        <item>Зелень</item>
    </string-array>
Подскажите пожалуйста.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 02 окт 2012, 22:27

файл ресурсов вроде бы правильный. А на чём валится и какая ошибка?
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 07:33

Удивительно :?
Просто скопипастил урок, решил, что разбираться лучше на утро (действительно, понять сразу сложно). Дай думаю объявлю массивы в strings файле, а не в самом коде. Меняю на то, что внизу, не трогая всего остального (замена телефонов на продукты питания, думаю не в счет), а она пройдя debugging выдает мне has stopped unexpectedly. Вернулся к объявлению массива в коде (как в уроке), все работает.

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends Activity {
    
    // названия групп продуктов 
    String[] groups = getResources().getStringArray(R.array.groups);
     
    // названия продуктов (элементов)
    String[] productsVeg = getResources().getStringArray(R.array.productsVeg);
    String[] productsFruit = getResources().getStringArray(R.array.productsFruit);
    String[] productsMilk = getResources().getStringArray(R.array.productsMilk);
    String[] productsGros = getResources().getStringArray(R.array.productsGros);
    
    // коллекция для групп
    ArrayList<Map<String, String>> groupData;
    
    // коллекция для элементов одной группы
    ArrayList<Map<String, String>> childDataItem;
    
    // общая коллекция для коллекций элементов
    ArrayList<ArrayList<Map<String, String>>> childData;
    
    // в итоге получится childData = ArrayList<childDataItem>
    
    // список аттрибутов группы или элемента
    Map<String, String> m;
    
    ExpandableListView elvMain;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.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 product: productsVeg) {
            m = new HashMap<String, String>();
            m.put("productName", product); // название продукта
            childDataItem.add(m);
        }
        // добавляем в коллекцию коллекций
        childData.add(childDataItem);

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

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

        // список аттрибутов элементов для чтения
        String childFrom[] = new String[]{"productName"};
        
        // список 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);

        elvMain = (ExpandableListView) findViewById(R.id.elvMain);
        elvMain.setAdapter(adapter);
    }
}
Просьба, объясните в чем дело.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 03 окт 2012, 08:41

Объявление массивов нужно оставить без инициализации.
Инициализировать в onCreate()

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

    String[] productsVeg;
    String[] productsFruit;
    String[] productsMilk;
    String[] productsGros;
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        productsVeg = getResources().getStringArray(R.array.productsVeg);
        productsFruit = getResources().getStringArray(R.array.productsFruit);
        productsMilk = getResources().getStringArray(R.array.productsMilk);
        productsGros = getResources().getStringArray(R.array.productsGros);
        ...
    }
В конструкторе Activtity ещё неизвестен контекст, поэтому ресурсы ещё не могут быть загружены.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 09:06

Объявил, потом вызвал и все сработало. Радует, что догнал сам.
Вам большое спасибо.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 11:33

В конструкторе класса SimpleExpandableListAdapter указываются только две коллекции для групп и элементов, соответственно:
List<? extends Map<String, ?>> groupData
List<? extends List<? extends Map<String, ?>>> childData
есть ли в других адапторах возможность наращивать количество коллекций

Заранее спасибо за разъяснение.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 03 окт 2012, 11:42

а зачем их наращивать? зачем адаптеру больше чем две коллекции?
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 11:50

ну, например страна-производитель-телефон, т.е. группа-элемент-подэлемент и т.д.
если это не предусмотрено в android, то как это реализовать в приложении.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 03 окт 2012, 12:01

так реализовать это можно десятками способов, всё зависит от дизайна который нужно. Если нужно что бы это выглядило как дерево то это в андроиде будет не красиво. А вот более менее что первое в голову пришло так это спинерами сделать страну и производителя а ниже их будет listview в котором отображаются телефоны. Вот как то так = )
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 12:04

Понял, спасибо.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 03 окт 2012, 16:47

Опять вопрос.

В adapter установил layout для группы: android.R.layout.simple_expandable_list_item_1,
для элементов: android.R.layout.simple_list_item_multiple_choice,
однако checkbox элементов не отображает галку при нажатии, хотя сам бокс и ее фоновое изображение присутствуют.
Попытался выставить: elvMain.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE); как в предыдущем уроке, не помогло. В чем может быть проблема?

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 04 окт 2012, 08:47

Проведя весь вечер в поисках ответа на свой вопрос, понял, что впервые столкнулся с недоработкой разработчиков Android.
Заменил в адаптере layout для элементов: android.R.layout.simple_list_item_multiple_choice, на свой my_layout, описав в нем TextView и CheckBox. Также пришлось указать свой TextView из my_layout для списка ID view-элементов
int childTo[] = new int[]{R.id.textView_1};
Вроде все сработало, элементы отображаются, и checkbox чекится, но при клике чекятся несколько боксов сразу (причем не важно нажимается ли непосредственно checkbox или отображаемый элемент).
Насколько я понял, все это как то связано с View, но не могу понять как.
Хотелось бы получить разъяснение роли View и если можно, пример, как решить проблему.

Заранее спасибо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 04 окт 2012, 09:28

dil_android это не есть недаработка разработчиков, просто нужно потренероваться писать кастомные адаптеры.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 04 окт 2012, 09:51

а по существу? Хотелось бы понять роль View, и решение этой проблемы.
Что касается разработчиков, то, что им мешало включить такую же возможность setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE/SINGLE) в адаптере ExpandableListView?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 04 окт 2012, 09:58

Хотелось бы понять роль View, и решение этой проблемы.
меня не множко насторожил такой кусочек кода:

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

//для списка ID view-элементов 
int childTo[] = new int[]{R.id.textView_1};
на первый взгляд не красиво выглядит. Кинь сюда код адаптера и код объявления листа, а так же луйауты, тогда думаю прояснится картина.
Что касается разработчиков, то, что им мешало включить такую же возможность setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE/SINGLE) в адаптере ExpandableListView?
это всё можно сделать ручками.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 04 окт 2012, 10:24

Адаптер:

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


        adapter = new SimpleExpandableListAdapter(
                ctx,
                groupData,
                android.R.layout.simple_expandable_list_item_1,
                groupFrom,
                groupTo,
                childData,
                R.layout.[color=#FF0000]my_layout,[/color] // вместо android.R.layout.simple_list_item_multiple_choice
                childFrom,
                childTo);

        return adapter;
    }

и

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

int childTo[] = new int[]{[color=#FF0000]R.id.textView_1[/color]}; //вместо text1
my_layout

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent" >
    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/textView_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textSize="20sp"
        android:text=""
        android:focusable="false">
    </TextView>
    <CheckBox android:id="@+id/checkbox_1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:focusable="false">
    </CheckBox>
</LinearLayout>
main

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/ll_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <TextView
            android:id="@+id/tvInfo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>
        <ExpandableListView
            android:id="@+id/elvMain"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ExpandableListView>
    </LinearLayout>
</LinearLayout>
остальное как в примере, не менял. Судя по тому, что нашел в Инете, решение вопроса лежит в изменении которое происходит с View, когда мы кликаем. Выложенные коды сложны для моего понимания на данном этапе. Поэтому и нуждаюсь в разъяснении, чтобы дальше по Адаптерам двигалось легче.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

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

Сообщение rezak90 » 04 окт 2012, 10:34

всё потому что писал бы кастомный адаптер то знал бы в чём ошибка, а так дефолтный использовать конечно будет где то ошибка и ищи потом где.
И мне кажется что CHOICE_MODE_MULTIPLE работает при дефолтной разметки и выделяет весь child layout и по этому чекбокс и не будет выделяться. Создай кастомный адаптер и прикрути к child layout оброботчик нажатия который будет чекать чекбокс, вот и все дела =)
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 04 окт 2012, 10:54

Да, скорее всего так и сделаю. Может по изучении всего материала выложенного по адаптерам смогу сам довести ситуацию. Слишком много времени отнял этот SimpleExpandableListAdapter.
Как говорится пойдем дальше. Будут вопросы, будем спрашивать.

Ответить