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

Обсуждение уроков
stas
Сообщения: 6
Зарегистрирован: 19 фев 2015, 02:18

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

Сообщение stas » 19 фев 2015, 18:18

наверно глупый вопрос. но где в коде урока видно как тот или иной элемент присваевается к той или иной группе? просто путем перечисления по порядку? первый блок элементов к первой группе, второй блок элементов ко второй группе?

stas
Сообщения: 6
Зарегистрирован: 19 фев 2015, 02:18

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

Сообщение stas » 19 фев 2015, 22:01

Arch1e писал(а):"А вообще вы можете создать для элементов свой layout, например, с тремя TextView. И к каждому элементу списка (Map) добавить еще по два атрибута: цена и цвет. Далее указываете ваш layout в конструкторе, формируете соответственно массивы childFrom и childTo чтобы сопоставить атрибуты и TextView, и получится, что каждый элемент группы содержит более подробную информацию о смартфоне."
Скиньте пожалуйста такой полный код урока

присоеденяюсь к просьбе. если не полный код, то хоть направления действия подробнее расписать. это бы добавило ясности в понимании урока

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 19 фев 2015, 22:22

Как по мне двойной список слишком тяжелый, чтобы находится в 45 уроке. Сначала нужно освоить обычные списки, адаптеры для них, в том числе и кастомные., а потом уже за такие штуки браться. Если не горит, то смело переходи к 46 уроку.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Neustart
Сообщения: 6
Зарегистрирован: 20 фев 2015, 01:03

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

Сообщение Neustart » 20 фев 2015, 01:22

Ребята, в конце урока написано
А вообще вы можете создать для элементов свой layout, например, с тремя TextView. И к каждому элементу списка (Map) добавить еще по два атрибута: цена и цвет. Далее указываете ваш layout в конструкторе, формируете соответственно массивы childFrom и childTo чтобы сопоставить атрибуты и TextView, и получится, что каждый элемент группы содержит более подробную информацию о смартфоне.
Привожу кусок кода, как я это попытался реализовать:

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

//добавил еще один массив с ценой
String[] prices = new String[]{"100","100","100","100","100","100","100","100","100","100","100"};
Добавляю в наш массив с коллецкиями коллекций еще цену, точно так же как добавляли модели телефонов.

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

 childDataItem = new ArrayList<Map<String,String>>();
        for (String price : prices){
            m = new HashMap<String,String>();
            m.put("price",price);
            childDataItem.add(m);
        }
        childData.add(childDataItem);
Пишу свой примитивный item.xml для отображения. В нем два текстовых поля с id textView1 и textView2 соответственно

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

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="50dp">

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="left|top">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView1"
            android:layout_gravity="left|center_vertical"
            android:textSize="25dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView2"
            android:layout_gravity="right|center_vertical"
            android:textSize="25dp" />
    </FrameLayout>

</FrameLayout>
А теперь пытаюсь вывести

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

 String childFrom[] = new String[]{"phoneName","price"};
        int childTo[] = new int[]{R.id.textView1,R.id.textView2};



        SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
                this,
                groupData,
                android.R.layout.simple_expandable_list_item_1,
                groupFrom,
                groupTo,
                childData,
                R.layout.item,
                childFrom,childTo
        );
Но выводит оно только в текстовое поле textView1, поле textView2 оно заполняет пустотой.
Что я не так делаю?
Изображение

stas
Сообщения: 6
Зарегистрирован: 19 фев 2015, 02:18

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

Сообщение stas » 20 фев 2015, 02:31

я примерно так же пытался, только еще надо from - to настроить , но у меня все равно не вышло. а сорри проглядел, ты тоже это делал. ну вобщем я по предыдущему совету бросил и пошел дальше по урокам. может потом разберусь или кто тут подскажет ...

Аватара пользователя
Neustart
Сообщения: 6
Зарегистрирован: 20 фев 2015, 01:03

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

Сообщение Neustart » 21 фев 2015, 18:52

В общем ,я так и не разобрался. Видимо особенности именно этого адаптера. В 49 уроке будет адаптер на два textview, там все почему-то работает.
Я просидел над этим уроком (45м), часа три. Перечитывал кучу раз, рисовал схемки что бы понять как оно все устроено в этом уроке, потому как нифига там не понятно разьяснено :( очень трудно вникнуть
Реально очень тяжелый урок, я не понимаю, что он тут делает, т.к последующие в разы легче. Может их как-то местами поменять бы?..
Выше уже написали, что урок можно пропустить если не понял. Полностью согласен.
Советую всем кто не может в него вникнуть, забить на него и читать дальше, через пару уроков все станет на свои места.

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

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

Сообщение Pavel-Pugach » 31 мар 2015, 15:35

Очень плохо что в уроке используются системные переменнты в childTo и groupTo. Из-за этого он сложен для понимания. Кстати, у меня поличилось сделать 2 текст-вью описаным Вами способом. Все работает :)

dmitry_n
Сообщения: 7
Зарегистрирован: 06 июн 2015, 13:47

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

Сообщение dmitry_n » 30 июл 2015, 03:26

А вообще вы можете создать для элементов свой layout, например, с тремя TextView. И к каждому элементу списка (Map) добавить еще по два атрибута: цена и цвет. Далее указываете ваш layout в конструкторе, формируете соответственно массивы childFrom и childTo чтобы сопоставить атрибуты и TextView, и получится, что каждый элемент группы содержит более подробную информацию о смартфоне.
stas, Neustart, Arch1e
Моя реализация, может кому поможет:
MainActivity:

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

public class MainActivity extends Activity {

    String[] groups = new String[] {"HTC", "Samsung", "LG"};
    String[] phonesHTC = new String[] {"Sensation", "Desire", "Wildfire", "Hero"};
    String[] phonesSams = new String[] {"Galaxy S II", "Galaxy Nexus", "Wave", "Absolute"};
    String[] phonesLG = new String[] {"Optimus", "Optimus Link", "Optimus Black", "Optimus One"};
    String[] colors = new String[] {"Black", "Blue", "White", "Pink"};
    String[] prices = new String[] {"400$", "350$", "500$", "200$"};

    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;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        elvMain = (ExpandableListView)findViewById(R.id.elvMain);

        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"};
        int groupTo[] = new int[] {android.R.id.text1};

        childData = new ArrayList<ArrayList<Map<String, String>>>();
        childDataItem = new ArrayList<Map<String, String>>();
        // заполняем список аттрибутов для каждого элемента
        for (int i = 0; i < phonesHTC.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesHTC[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        // добавляем в коллекцию коллекций
        childData.add(childDataItem);

        // создаем коллекцию элементов для второй группы
        childDataItem = new ArrayList<Map<String, String>>();
        for (int i = 0; i < phonesSams.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesSams[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        childData.add(childDataItem);

        // создаем коллекцию элементов для третьей группы
        childDataItem = new ArrayList<Map<String, String>>();
        for (int i = 0; i < phonesLG.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesLG[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        childData.add(childDataItem);

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


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

        elvMain.setAdapter(adapter);
    }
}
smartphone_field.xml:

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv1"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tv2"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tv3"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

dmitry_n
Сообщения: 7
Зарегистрирован: 06 июн 2015, 13:47

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

Сообщение dmitry_n » 30 июл 2015, 03:26

А вообще вы можете создать для элементов свой layout, например, с тремя TextView. И к каждому элементу списка (Map) добавить еще по два атрибута: цена и цвет. Далее указываете ваш layout в конструкторе, формируете соответственно массивы childFrom и childTo чтобы сопоставить атрибуты и TextView, и получится, что каждый элемент группы содержит более подробную информацию о смартфоне.
stas, Neustart, Arch1e
Моя реализация, может кому поможет:
MainActivity:

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

public class MainActivity extends Activity {

    String[] groups = new String[] {"HTC", "Samsung", "LG"};
    String[] phonesHTC = new String[] {"Sensation", "Desire", "Wildfire", "Hero"};
    String[] phonesSams = new String[] {"Galaxy S II", "Galaxy Nexus", "Wave", "Absolute"};
    String[] phonesLG = new String[] {"Optimus", "Optimus Link", "Optimus Black", "Optimus One"};
    String[] colors = new String[] {"Black", "Blue", "White", "Pink"};
    String[] prices = new String[] {"400$", "350$", "500$", "200$"};

    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;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        elvMain = (ExpandableListView)findViewById(R.id.elvMain);

        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"};
        int groupTo[] = new int[] {android.R.id.text1};

        childData = new ArrayList<ArrayList<Map<String, String>>>();
        childDataItem = new ArrayList<Map<String, String>>();
        // заполняем список аттрибутов для каждого элемента
        for (int i = 0; i < phonesHTC.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesHTC[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        // добавляем в коллекцию коллекций
        childData.add(childDataItem);

        // создаем коллекцию элементов для второй группы
        childDataItem = new ArrayList<Map<String, String>>();
        for (int i = 0; i < phonesSams.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesSams[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        childData.add(childDataItem);

        // создаем коллекцию элементов для третьей группы
        childDataItem = new ArrayList<Map<String, String>>();
        for (int i = 0; i < phonesLG.length; i++) {
            m = new HashMap<String, String>();
            m.put("phoneName", phonesLG[i]);
            m.put("colorName", colors[i]);
            m.put("price", prices[i]);
            childDataItem.add(m);
        }
        childData.add(childDataItem);

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


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

        elvMain.setAdapter(adapter);
    }
}
smartphone_field.xml:

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv1"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tv2"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/tv3"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

energo5
Сообщения: 1
Зарегистрирован: 09 дек 2015, 09:49

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

Сообщение energo5 » 09 дек 2015, 09:52

Добрый день, подскажите, как удалить группу в ExpandableListView.

t0psecret
Сообщения: 7
Зарегистрирован: 27 янв 2016, 14:16

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

Сообщение t0psecret » 09 фев 2016, 15:10

energo5 писал(а):Добрый день, подскажите, как удалить группу в ExpandableListView.
как вариант

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

groupData.remove(0);
        childData.remove(0);
        adapter = new SimpleExpandableListAdapter(this,
                groupData, android.R.layout.simple_expandable_list_item_2,
                groupFrom,
                groupTo,
                childData,
                android.R.layout.simple_expandable_list_item_2,
                childFrom,
                childTo);
        elvMain.setAdapter(adapter);

t0psecret
Сообщения: 7
Зарегистрирован: 27 янв 2016, 14:16

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

Сообщение t0psecret » 09 фев 2016, 15:17

Если вдруг кто не понимает для чего нужны Map<String, String> как основной элемент списка (я пол часа сидел, думал, не мог понять), то при изменении кода на такой:

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

for (String group : groups) {
            m = new HashMap<String, String>();
            m.put("groupName", group);
            m.put("groupName1", "hahaha");
            groupData.add(m);
        }
String[] groupFrom = new String[] {"groupName", "groupName1"};
int[] groupTo = new int[] {android.R.id.text1, android.R.id.text2};

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

childDataItem = new ArrayList<>();
        for (String phone : phonesLG) {
            m = new HashMap<>();
            m.put("phoneName", phone);
            m.put("phoneName1", "lalala");
            childDataItem.add(m);
        }
        childData.add(childDataItem);

        String[] childFrom = new String[] {"phoneName1", "phoneName"};
        int[] childTo = new int[] {android.R.id.text1, android.R.id.text2};

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

SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(this,
                groupData, android.R.layout.simple_expandable_list_item_2,
                groupFrom,
                groupTo,
                childData,
                android.R.layout.simple_expandable_list_item_2,
                childFrom,
                childTo);
получится вот такой список
Вложения
Безымянный.png
Безымянный.png (33.96 КБ) 14368 просмотров

mcGurov
Сообщения: 1
Зарегистрирован: 22 мар 2016, 22:13

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

Сообщение mcGurov » 22 мар 2016, 22:23

Сразу скажу, что код не из этого урока...
Как переделать адаптер, чтобы в ExpandableListView в child элементах находились определённые картинки?
В идеале конечно ловить название пункта и выводить соответствующую ему картинку...

Код основной активности: (Тут ловим выбранный пункт по слову и запускаем нужную активность...)

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

public class Name extends Activity implements
        SearchView.OnQueryTextListener, SearchView.OnCloseListener {
 
    private SearchView mSearchView;
    private FishNameExpandableListAdapter mAdapter;
    private ExpandableListView mExpandableListView;
    private ArrayList continentList = new ArrayList<FishNameContinent>();
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.name);
 
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        mSearchView = (SearchView) findViewById(R.id.searchViewFishName);
        mSearchView.setVisibility(View.GONE);
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
 
        final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
 
        displayList();
        expandAll();
        collapseAll();
 
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                Animation openSearch = AnimationUtils.loadAnimation(FishName.this, android.R.anim.slide_in_left);
                mSearchView.startAnimation(openSearch);
                mSearchView.setVisibility(View.VISIBLE);
 
                Animation hideFab = AnimationUtils.loadAnimation(FishName.this, android.R.anim.slide_out_right);
                fab.startAnimation(hideFab);
                fab.setVisibility(View.GONE);
 
                // открываем клавиатуру и активируем searchView
                mSearchView.requestFocus();
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                mSearchView.setIconifiedByDefault(false);
                mSearchView.setOnQueryTextListener(FishName.this);
                mSearchView.setOnCloseListener(FishName.this);
            }
        });
 
        // нажатие на элемент
        mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
 
            public boolean onChildClick(ExpandableListView parent, View convertView,
                                        int groupPosition, int childPosition, long id) {
 
                RelativeLayout relativeLayout = (RelativeLayout )convertView;
                TextView textView = (TextView) relativeLayout.findViewById(R.id.namerow);
 
                String childText = textView.getText().toString(); // получаем текст нажатого элемента
 
                //названия:
                if (childText == "Анабас") {Intent i = new Intent(FishName.this, Anabas.class);startActivity(i);};
                if (childText == "Ктенопома") {Intent i = new Intent(FishName.this, Ktenopoma.class);startActivity(i);};
                
            }
 
        });
    }
 
    //метод закрытия групп
    private void collapseAll() {
        int count = mAdapter.getGroupCount();
        for (int i = 0; i < count; i++){
            mExpandableListView.collapseGroup(i);
        }
    }
    //метод открытия групп
    private void expandAll() {
        int count = mAdapter.getGroupCount();
        for (int i = 0; i < count; i++) {
            mExpandableListView.expandGroup(i);
        }
    }
 
    private void displayList() {
        loadSomeData();
        mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListViewFishName);
        mAdapter = new FishNameExpandableListAdapter(FishName.this, continentList);
        mExpandableListView.setAdapter(mAdapter);
 
    }
 
    private void loadSomeData() {
       ArrayList countryList = new ArrayList<FishNamePopulation>();
        FishNamePopulation worldPopulation = new FishNamePopulation("Анабас");
        countryList.add(worldPopulation);
        worldPopulation = new FishNamePopulation("Ктенопома");
        countryList.add(worldPopulation);
 
        FishNameContinent continent = new FishNameContinent("Анабасовые", countryList);
        continentList.add(continent);
 
    }
 
    @Override
    public boolean onClose() {
        mAdapter.filterData("");
        expandAll();
        return false;
    }
 
    @Override
    public boolean onQueryTextSubmit(String query) {
        mAdapter.filterData(query);
        expandAll();
        return false;
    }
 
    @Override
    public boolean onQueryTextChange(String query) {
        mAdapter.filterData(query);
        expandAll();
        return false;
    }
 
}
Далее класс для отображения заголовков:

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

public class FishNameContinent {
    private String mName;
    private List<FishNamePopulation> mCountryList = new ArrayList<FishNamePopulation>();
 
    public FishNameContinent(String name, ArrayList<FishNamePopulation> countryList) {
        this.mName = name;
        this.mCountryList = countryList;
    }
 
    public String getName() {
        return mName;
    }
 
    public void setName(String name) {
        this.mName = name;
    }
 
    public ArrayList<FishNamePopulation> getCountryList() {
        return (ArrayList<FishNamePopulation>) mCountryList;
    }
 
    public void setCountryList(ArrayList<FishNamePopulation> countryList) {
        this.mCountryList = countryList;
    };
}
Класс для названий в child:

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

public class FishNamePopulation {
    private String mCountry;
 
    public FishNamePopulation(String country) {
        this.mCountry = country;
    }
 
    public String getCountry() {
        return this.mCountry;
    }
 
    public void setCountry(String country) {
        this.mCountry = country;
    }
 
 
}
Ну и собственно сам класс адаптера:

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

public class FishNameExpandableListAdapter extends BaseExpandableListAdapter {
 
    private Context mContext;
    private ArrayList<FishNameContinent> mContinentList;
    private ArrayList<FishNameContinent> mOriginalList;
 
    private LayoutInflater mInflater;
    private List<FishNamePopulation> mWorldpopulationlist = null;
    private ArrayList<FishNamePopulation> mArraylist;
 
    public FishNameExpandableListAdapter(Context context,
                                     ArrayList<FishNameContinent> continentList) {
        this.mContext = context;
 
        this.mContinentList = new ArrayList<>();
        this.mContinentList.addAll(continentList);
 
        this.mOriginalList = new ArrayList<>();
        this.mOriginalList.addAll(continentList);
    }
 
    public class ViewHolder {
        TextView country;
        TextView population;
        ImageView flag; // добавлено
    }
 
    @Override
    public int getGroupCount() {
        return mContinentList.size();
    }
 
    @Override
    public int getChildrenCount(int groupPosition) {
        ArrayList<FishNamePopulation> countryList = mContinentList.get(
                groupPosition).getCountryList();
        return countryList.size();
    }
 
    @Override
    public Object getGroup(int groupPosition) {
        return mContinentList.get(groupPosition);
    }
 
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        ArrayList<FishNamePopulation> countryList = mContinentList.get(
                groupPosition).getCountryList();
        return countryList.get(childPosition);
    }
 
    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }
 
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }
 
    @Override
    public boolean hasStableIds() {
        return true;
    }
 
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        FishNameContinent continent = (FishNameContinent) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.group_row, null);
 
        }
 
        TextView tvHeading = (TextView) convertView.findViewById(R.id.heading);
        tvHeading.setText(continent.getName().trim());
 
        return convertView;
    }
 
    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        FishNamePopulation worldpopulation = (FishNamePopulation) getChild(
                groupPosition, childPosition);
 
 
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.child_row, null);
        }
 
        TextView tvName = (TextView) convertView.findViewById(R.id.namerow);
        tvName.setText(worldpopulation.getCountry().trim());
 
        return convertView;
    }
 
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
 
    public void filterData(String query) {
 
        query = query.toLowerCase();
        Log.v("MyAdapter", String.valueOf(mContinentList.size()));
        mContinentList.clear();
 
        if (query.isEmpty()) {
            mContinentList.addAll(mOriginalList);
        } else {
 
            for (FishNameContinent continent : mOriginalList) {
 
                ArrayList<FishNamePopulation> countryList = continent
                        .getCountryList();
                ArrayList<FishNamePopulation> newList = new ArrayList<FishNamePopulation>();
                for (FishNamePopulation country : countryList) {
                    if (country.getCountry().toLowerCase()
                            .contains(query)) {
                        newList.add(country);
                    }
                }
                if (newList.size() > 0) {
                    FishNameContinent nContinent = new FishNameContinent(continent.getName(),
                            newList);
                    mContinentList.add(nContinent);
                }
            }
        }
 
        Log.v("MyAdapter", String.valueOf(mContinentList.size()));
        notifyDataSetChanged();
    }

MaximOdessa
Сообщения: 2
Зарегистрирован: 01 июн 2016, 12:23

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

Сообщение MaximOdessa » 01 июн 2016, 12:28

Добрый день, подскажите пожалуйста. У меня возникла такая ситуация:
я динамически заполняю список т.е. я беру все данные внутри составного обьекта, формирую список групп, далее добавляю их в android.R.id.text1 и начинаю заполнять "детей" и проделываю теже действия.
В результате у меня в первой (из N) группе содержатся ВСЕ "дети" от всех групп, а при попытке открыть другие группы - вылет. Переписывал многое количество раз, но никак не пойму почему не происходит соответствие Группа - Дети

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

    void showContextDefenitionList(ContextDefinitionList cDefinitionList) {

            Map<String, String> map;
            // коллекция для групп
            ArrayList<Map<String, String>> groupDataList = new ArrayList<Map<String, String>>();
            // заполняем коллекцию групп из массива с названиями групп

            for (int i =0; i< cDefinitionList.getContextList().size(); i++) {
                // заполняем список атрибутов для каждой группы
                map = new HashMap();
                map.put("groupName", cDefinitionList.getContextList().get(i).getName()); // имя контекста
                groupDataList.add(map);
            }

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


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

            // в итоге получится сhildDataList = ArrayList<сhildDataItemList>

            // создаем коллекцию элементов для первой группы
            ArrayList<Map<String, String>> сhildDataItemList = new ArrayList<Map<String, String>>();
            // заполняем список атрибутов для каждого элемента


        for (int i =0; i< cDefinitionList.getContextList().size(); i++) {
        //int i = 1;
            for (int j = 0; j < cDefinitionList.getContextList().get(i).getList().size(); j++) {
                map = new HashMap();
                map.put("sensorName", cDefinitionList.getContextList().get(i).getList().get(j).getSensorName() + ": " + cDefinitionList.getContextList().get(i).getList().get(j).getSensorData()); // имя и данные с сенсора
                сhildDataItemList.add(map);
            }
            // добавляем в коллекцию коллекций
            сhildDataList.add(сhildDataItemList);
        }

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

            SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
                    this, groupDataList,
                    android.R.layout.simple_expandable_list_item_1, groupFrom,
                    groupTo, сhildDataList, android.R.layout.simple_list_item_1,
                    childFrom, childTo);

            ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
            expandableListView.setAdapter(adapter);
}


MaximOdessa
Сообщения: 2
Зарегистрирован: 01 июн 2016, 12:23

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

Сообщение MaximOdessa » 01 июн 2016, 14:44

Кажется нашел ответ ... я не обнулял коллекцию детей...

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

[color=#FF0000]...[/color]
for (int i =0; i< cDefinitionList.getContextList().size(); i++) {
        //int i = 1;
        // создаем коллекцию элементов для каждой группы
        ArrayList<Map<String, String>> сhildDataItemList = new ArrayList<Map<String, String>>();
            for (int j = 0; j < cDefinitionList.getContextList().get(i).getList().size(); j++) {
                map = new HashMap();
                map.put("sensorName", cDefinitionList.getContextList().get(i).getList().get(j).getSensorName() + ": " + cDefinitionList.getContextList().get(i).getList().get(j).getSensorData()); // название месяца
                сhildDataItemList.add(map);
            }
            // добавляем в коллекцию коллекций
            сhildDataList.add(сhildDataItemList);
        }

[color=#FF0000]...[/color]

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

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

Сообщение Arvalon » 11 июл 2016, 12:24

Можно картинку как это выглядит на экране?
Не могу понять это то что мне нужно или нет?

У меня есть две таблички в SQLite, связанные отношением один-ко-многим. Хочу сделать выбор "Родительский элемент" -> выпадающий список элементов группы. + Множественный выбор с чекбоксами у каждого элемента, но это уже прикручу как сделано в уроке 54.

Какой адаптер вообще выбрать в таком случае? ExpandableListView или SimpleCursorTreeAdapter?

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

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

Сообщение Foenix » 11 июл 2016, 15:49

ExpandableListView это не адаптер. Это вью для показа дерева.
R.id.team

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

WilsonSmith
Сообщения: 1
Зарегистрирован: 07 июн 2018, 16:09

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

Сообщение WilsonSmith » 07 июн 2018, 16:12

You can refer below resource with good examples on sorting,

https://www.flowerbrackets.com/sort-string-array-java/
Последний раз редактировалось WilsonSmith 02 ноя 2018, 16:29, всего редактировалось 1 раз.

cyberLight
Сообщения: 1
Зарегистрирован: 18 июл 2018, 13:43

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

Сообщение cyberLight » 18 июл 2018, 13:51

Есть ли такой же список, но без разворотов/свертываний групп? Если нет, то можно ли убрать стрелку слева?

vadsan
Сообщения: 2
Зарегистрирован: 08 окт 2018, 09:43

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

Сообщение vadsan » 08 окт 2018, 09:48

Чтобы вот так вышло:
Изображение
Код:

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

String[] countryPhone = new String[]{"Тайвань", "Корея Samsung", "Корея LG"};

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

 @Override
    protected 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);
            for (String countryPh : countryPhone)
            {
                if (group.equals("HTC") && countryPh.equals("Тайвань"))
                {
                    m.put("groupName1", countryPh);
                    break;
                }
                if (group.equals("Samsung") && countryPh.equals("Корея Samsung"))
                {
                    m.put("groupName1", countryPh);
                    break;
                }
                if (group.equals("LG") && countryPh.equals("Корея LG"))
                {
                    m.put("groupName1", countryPh);
                    break;
                }
                else m.put("groupName1", "NOT");
            }
            groupData.add(m);
        }


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

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

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

Ответить