Форум программистов, компьютерный форум CyberForum.ru

Как реализовать трехуровневое меню в ListView? - Android

Восстановить пароль Регистрация
 
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 15:18     Как реализовать трехуровневое меню в ListView? #1
Здравствуйте!Как вообще реализуются такие вещи в приложениях?Есть список меню из 4-х пунктов созданный с помощью ListView. Cамо собой стартует этот список в MainActivity. Далее,если например нажать на первый пункт (Item1) меню,должен открыться другой список ListView уже с другими пунктами (Item1.1 , Item 1.2 и т.д.). Теперь у меня возник вопрос! Неужели для открытия следующего списка (по нажатию на Item1) нужно создавать свою Activity (например OneActivity) и так для каждого пункта? Это сколько ж Activity я насоздаю. Думаю это как-то не правильно. Может мне понадобиться в общей сложности 50-100 пунктов. Как быть?
Заранее спасибо.
P.S. Прикрепил схему для наглядности
Кликните здесь для просмотра всего текста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
26.11.2014, 15:23     Как реализовать трехуровневое меню в ListView? #2
Kroshandowski, товарищ, вы неправильно прикрепили вложение. Чем вам не понравился ExpandedListView? Может быть, его можно доработать до трёх уровней. Если же вы хотите при нажатии на элемент списка показывать другой список (с дочерними элементами), можете использовать ту же активность или даже фрагменты. А даже если используете другую активность, то больше 3 не потребуется (по числу уровней).
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 16:04  [ТС]     Как реализовать трехуровневое меню в ListView? #3
CoolMind, Просто конечный контент это текст отображающийся через string в файле content111.xml и таких файлов будет много (т.е. для каждого конечного item'a будет свой content.xml файл). Как мне визуально пролистать меню в одной и той же активности и дойдя до конечного itema по нажатию отобразить содержимое в этом же Activity или в другом, специально созданным для этого?
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
26.11.2014, 16:23     Как реализовать трехуровневое меню в ListView? #4
Kroshandowski, не совсем понятно, что такое конечный item.
Если вы разбираетесь в ListView, то знаете, что за его отображение отвечает так называемый адаптер, который и хранит данные. Возможно менять данные в адаптере. Например, щёлкнули на пункт 3, весь список заменится на новый, в котором будут показаны дочерние для пунта 3 элементы. Для этого вам надо запустить процедуру заполнения адаптера заново, а потом выполнить notifyDataSetChanged(). Когда будете возвращаться с более нижнего уровня назад, вам нужно будет снова загрузить список, но более высокого уровня, и прокрутить к нужному элементу (для этого есть методы прокрутки списка).
Ну не знаю, что ещё рассказать.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 18:33     Как реализовать трехуровневое меню в ListView? #5
Kroshandowski,

CoolMind дело говорит.

Для наглядности найдите реализацию File Manager/Explorer'a и покрутите.
Думаю, его поведение наиболее отвечает вашим потребностям - нажал на дирректорию, "свалился" в поддиректорию с своим собственным содержимым...
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 21:51  [ТС]     Как реализовать трехуровневое меню в ListView? #6
Armagedo, реализацию нашел и опробовал. Все бы хорошо,но ведь во всех ФМ идет переход между папками. Так сказать приложение просто читает содержимое папок и переходит. Кароч я не знаю как объяснить))))
В общем изложу суть "задуманного приложения". У меня изначально был MainActivity и в нем было 4 категории. По нажатию на одну из категорий осуществлялся переход на Activity конкретной категории (для каждой категории я сделал отдельный Activity). И уже после перехода появлялся контент считываемый из файла strings.
Только вот теперь задумка расширилась и теперь нужно много категорий и я подумал, что будет тупо для каждой категории делать свой Activity. Есть у кого ссылки на примеры? Что-то похожее на explorer'ы внутри проекта или типа читалок,когда выбираешь книгу из множества разделов.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 22:05     Как реализовать трехуровневое меню в ListView? #7
Kroshandowski, а ты не читай содержимое папок.
Ты читай то, что нужно тебе

Эта, без обид, с такой постановкой ТЗ я похоже пас...
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 22:06  [ТС]     Как реализовать трехуровневое меню в ListView? #8
CoolMind, Armagedo, тут нашел реализацию,но там они парсят через инет. А на вид как надо.
Ссылка
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 22:17     Как реализовать трехуровневое меню в ListView? #9
Kroshandowski,

через чего через чего они парсят?

Они отправляю запросы.
В ответ получают ответы в форме JSON-строки.
И уже её парсят, кидая во всякие JSONObject'ы.

Давай, делай начинай чего-нибудь уже.
По ходу разберешься что к чему.
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 22:30  [ТС]     Как реализовать трехуровневое меню в ListView? #10
Цитата Сообщение от Armagedo Посмотреть сообщение
через чего через чего они парсят?
Ну явно же не из папок в телефоне. Ну а если придираться к словам то они не
Цитата Сообщение от Armagedo Посмотреть сообщение
Они отправляю запросы.
, а ОТПРАВЛЯЮТ.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 22:44     Как реализовать трехуровневое меню в ListView? #11
Жги дальше...
Адьос амиго.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
27.11.2014, 10:28     Как реализовать трехуровневое меню в ListView? #12
Kroshandowski, я мельком прокрутил пример, к сайту отношусь с уважением и часто беру оттуда примеры. Если речь идёт о JSON, то это, пожалуй, лучший способ работы с сервером. У вас же ситуация с файлами xml (без сервера), что немного сложнее, но тоже решаемо. В общем, вам правильно посоветовал Armagedo, начните программировать и дальше сами разберётесь.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
27.11.2014, 12:05     Как реализовать трехуровневое меню в ListView? #13
Kroshandowski, создайте класс, который будет содержать всю информацию нужную для отображения. Пример для самой простой читалки:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Book{
 
private int id;
private String bookText;
 
public Book(int id){
     this.id = id;
}
 
public void setText(String text){
     this.bookText  = text;
}
 
public String getText(){
     return this.bookText;
}
 
public int getId(){
    return this.id;
}
 
}
Далее создайте ArrayList экземпляров вашего класса, передавайте этот лист в адаптер ListView, каждому элементу присваиваете тэг

Java
1
item.setTag(currentBook);
Далее в обработчике onItemClickListener добавляете переход к активити и кладете вашу книгу в интент:

Java
1
2
3
Intent intent = new Intent(context, BookActibity.class);
intent.putExtra("book", (Book) item.getTag);
startActivity(intent);
Для того чтобы ваш экземпляр класса Book записался в интент он должен реализовать интерфейс Serializable:

Java
1
2
public class Book implements Serializable{
//Просто добавьте эту строчку к определению класса.
Ну и в onCreate активити достаем вашу книгу:

Java
1
2
3
4
5
6
7
8
9
10
onCreate(){
 
Intent intent = getIntent();
Book currentBook = (Book) intent.getSerializableExtra("book");
//Ну и дальше достаем все нужные данные из экземпляра класса Book
//У нас только текст, его и достанем:
String bookText = currentBook.getText();
 
 
}
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
27.11.2014, 22:43  [ТС]     Как реализовать трехуровневое меню в ListView? #14
Spelcrawler, нашел пример на этом сайте: тыц в самом конце поста тема: "Переключаемся между двумя списками". Так как форума там нет,думаю обсудить это здесь с вами. В принципе там все как надо,основное листание категорий происходит в MainActivity. Но дело в том,что если мы находимся на втором уровне вложенности,то по нажатию на кнопку "Back" мы не возвращаемся на исходный первый уровень (ну или главное меню),а просто выходим из приложения.
Да,можно дописать кнопку "Back" для заполнения listView списком из адаптера главного меню,НО как же тогда осуществить выход из приложения по этой же самой кнопке "Back"?
Заранее спасибо.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
28.11.2014, 09:39     Как реализовать трехуровневое меню в ListView? #15
Kroshandowski, очевидно, требуется определить, на каком уровне вы находитесь. Если на первом, то заставить кнопку "Назад" выходить, иначе - переходить на уровень выше.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
28.11.2014, 10:43     Как реализовать трехуровневое меню в ListView? #16
Kroshandowski, в примере используются разные адаптеры - при нажатии кнопки "назад" можно проверять какой адаптер сейчас установлен в listView и исходя из этого либо менять адаптер на тот что "повыше", либо закрывать приложение.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ArrayAdapter firstAdapter, secondAdapter;
ListView listView;
 
onBackPressed(){
 
ArrayAdapter currentAdapter = listView.getAdapter();
switch(currentAdapter){
 
case(firstAdapter):
super.onBackPressed();
break;
case(secondAdapter):
listView.setAdapter(firstAdapter);
firstAdapter.notifyDataSetChanged();
break;
 
 
}
 
}
Код не проверял switch может и не сработать с адаптерами, в таком случае можно использовать if и equals.
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
28.11.2014, 15:16  [ТС]     Как реализовать трехуровневое меню в ListView? #17
Spelcrawler, на основе кода с того сайта я сделал под себя так: Есть список с годами "2010","2011","2012","2013","2014" - все это первый список. Далее при клике на год открывается список месяцев. Допустим нажали на "Январь" и тут как раз для меня проблема!!!!!
Как лучше,а скорее правильно будет организовать так скажем "Профиль или страницу" про январь. Т.е. для каждого месяца создавать свое Activity (типа JanActivity и т.д.) и потом вызывать по нажатию на "Январь" или такие вещи делаются как-то по-другому?
Просто не могу сейчас сдвинуться с мертвой точки. У меня же там категорий много получиться для каждого месяца в каждом году.
P.S. Информация для января содержиться в xml файле strings.

А это сам MainActivity:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class MainActivity extends ListActivity {
 
String[] year =  {"2010", "2011", "2012","2013", "2014"};   
 
String[] month10 = new String[] { "Январь", "Февраль", "Март", "Апрель", "Май","Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь" };
 
String[] month11 = new String[] { "Январь", "Февраль", "Март", "Апрель", "Май","Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь" }; 
 
String[] month12 = new String[] { "Январь", "Февраль", "Март", "Апрель", "Май","Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь" };
 
String[] month13 = new String[] { "Январь", "Февраль", "Март", "Апрель", "Май","Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь" };
 
String[] month14 = new String[] { "Январь", "Февраль", "Март", "Апрель", "Май","Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь","Декабрь" };
 
    // Создадим пять адаптеров
    ArrayAdapter<String> yearAdapter, month10Adapter, month11Adapter, month12Adapter, month13Adapter, month14Adapter;
    
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_main);
 
        yearAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, year);
    month10Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, month10);
        month11Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, month11);
        month12Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, month12);
        month13Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, month13);
        month14Adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, month14);
        
 
        setListAdapter(yearAdapter);
    }
 
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
 
        if (position == 0) {
           
            setListAdapter(month10Adapter);
            month10Adapter.notifyDataSetChanged();
                           }
        if (position == 1) {
            setListAdapter(month11Adapter);
            month11Adapter.notifyDataSetChanged();
                           }
        if (position == 2) {
            setListAdapter(month12Adapter);
            month12Adapter.notifyDataSetChanged();
                           }
        if (position == 3) {
            setListAdapter(month13Adapter);
            month13Adapter.notifyDataSetChanged();
                           }
        if (position == 4) {
            setListAdapter(month14Adapter);
            month14Adapter.notifyDataSetChanged();
                           }
        }
 
// А где-то тут должен быть код для перехода вверх или выход из приложения. Пытался применить ваш код выше,но чет все стало красным...
 
}
Как-то так организовываю переход.А вот как дальше организовать переход на описание выбранного января,когда мы оказались на втором уровне я в тупике...в голову приходит только вызов JanActivity вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
if (position == 0) {
            setListAdapter(month10Adapter);
            month10Adapter.notifyDataSetChanged();
                           }
        else
                           {
        if (position == 0) // Типа выбрали "Январь" и открываем JanActivity
                           {
                Intent intent=new Intent ( MainActivity.this , JanActivity.class );
                startActivity(intent);
                           }
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
28.11.2014, 15:20     Как реализовать трехуровневое меню в ListView? #18
Я же писал пример про книжки. Делайте по аналогии.
Kroshandowski
 Аватар для Kroshandowski
2 / 2 / 0
Регистрация: 05.04.2013
Сообщений: 234
28.11.2014, 15:56  [ТС]     Как реализовать трехуровневое меню в ListView? #19
Spelcrawler, исходя из вашего примера про книжки,все таки для каждого месяца своего года,нужно будет создавать свой Activity?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 15:59     Как реализовать трехуровневое меню в ListView?
Еще ссылки по теме:

Как реализовать swipe меню Android
Android Как присвоить обработчик ListView?
Скроллинг ViewPager-а как у ListView Android
Как перевернуть ListView? Android
Как реализовать поиск по Listview? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
28.11.2014, 15:59     Как реализовать трехуровневое меню в ListView? #20
Нет, одну на все месяцы, вторую на все недели, третью на все дни и т.д.. Почитайте код внимательнее, там описано все что нужно для отображения разной, но однотипной информации в одном активити, в зависимости от входных данных.
Yandex
Объявления
28.11.2014, 15:59     Как реализовать трехуровневое меню в ListView?
Ответ Создать тему
Опции темы

Текущее время: 21:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru