Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
1

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

26.11.2014, 15:18. Просмотров 979. Ответов 19
Метки нет (Все метки)

Здравствуйте!Как вообще реализуются такие вещи в приложениях?Есть список меню из 4-х пунктов созданный с помощью ListView. Cамо собой стартует этот список в MainActivity. Далее,если например нажать на первый пункт (Item1) меню,должен открыться другой список ListView уже с другими пунктами (Item1.1 , Item 1.2 и т.д.). Теперь у меня возник вопрос! Неужели для открытия следующего списка (по нажатию на Item1) нужно создавать свою Activity (например OneActivity) и так для каждого пункта? Это сколько ж Activity я насоздаю. Думаю это как-то не правильно. Может мне понадобиться в общей сложности 50-100 пунктов. Как быть?
Заранее спасибо.
P.S. Прикрепил схему для наглядности
Кликните здесь для просмотра всего текста
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 15:18
Ответы с готовыми решениями:

Хочу сделать подписи к меню, меню у меня создано ListView, есть два массива, как их передать в адаптер?
public class MainMenu extends ListActivity { public void onCreate(Bundle...

Как реализовать поиск по Listview?
Listview adapter public class ListViewAdapter extends BaseAdapter { ...

Как реализовать swipe меню
Подскажите как реализовать подобное меню.

Контекстное меню в ListView
Здравствуйте,выложите пожалуйста рабочий код контекстного меню для listview и...

ListView и контекстное меню
Подскажите как сделать так, чтобы контекстное меню знало пункт listview из...

19
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
26.11.2014, 15:23 2
Kroshandowski, товарищ, вы неправильно прикрепили вложение. Чем вам не понравился ExpandedListView? Может быть, его можно доработать до трёх уровней. Если же вы хотите при нажатии на элемент списка показывать другой список (с дочерними элементами), можете использовать ту же активность или даже фрагменты. А даже если используете другую активность, то больше 3 не потребуется (по числу уровней).
0
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 16:04  [ТС] 3
CoolMind, Просто конечный контент это текст отображающийся через string в файле content111.xml и таких файлов будет много (т.е. для каждого конечного item'a будет свой content.xml файл). Как мне визуально пролистать меню в одной и той же активности и дойдя до конечного itema по нажатию отобразить содержимое в этом же Activity или в другом, специально созданным для этого?
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
26.11.2014, 16:23 4
Kroshandowski, не совсем понятно, что такое конечный item.
Если вы разбираетесь в ListView, то знаете, что за его отображение отвечает так называемый адаптер, который и хранит данные. Возможно менять данные в адаптере. Например, щёлкнули на пункт 3, весь список заменится на новый, в котором будут показаны дочерние для пунта 3 элементы. Для этого вам надо запустить процедуру заполнения адаптера заново, а потом выполнить notifyDataSetChanged(). Когда будете возвращаться с более нижнего уровня назад, вам нужно будет снова загрузить список, но более высокого уровня, и прокрутить к нужному элементу (для этого есть методы прокрутки списка).
Ну не знаю, что ещё рассказать.
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 18:33 5
Kroshandowski,

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

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

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

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

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

Давай, делай начинай чего-нибудь уже.
По ходу разберешься что к чему.
1
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
26.11.2014, 22:30  [ТС] 10
Цитата Сообщение от Armagedo Посмотреть сообщение
через чего через чего они парсят?
Ну явно же не из папок в телефоне. Ну а если придираться к словам то они не
Цитата Сообщение от Armagedo Посмотреть сообщение
Они отправляю запросы.
, а ОТПРАВЛЯЮТ.
0
Armagedo
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.11.2014, 22:44 11
Жги дальше...
Адьос амиго.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
27.11.2014, 10:28 12
Kroshandowski, я мельком прокрутил пример, к сайту отношусь с уважением и часто беру оттуда примеры. Если речь идёт о JSON, то это, пожалуй, лучший способ работы с сервером. У вас же ситуация с файлами xml (без сервера), что немного сложнее, но тоже решаемо. В общем, вам правильно посоветовал Armagedo, начните программировать и дальше сами разберётесь.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2014, 12:05 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();
 
 
}
0
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
27.11.2014, 22:43  [ТС] 14
Spelcrawler, нашел пример на этом сайте: тыц в самом конце поста тема: "Переключаемся между двумя списками". Так как форума там нет,думаю обсудить это здесь с вами. В принципе там все как надо,основное листание категорий происходит в MainActivity. Но дело в том,что если мы находимся на втором уровне вложенности,то по нажатию на кнопку "Back" мы не возвращаемся на исходный первый уровень (ну или главное меню),а просто выходим из приложения.
Да,можно дописать кнопку "Back" для заполнения listView списком из адаптера главного меню,НО как же тогда осуществить выход из приложения по этой же самой кнопке "Back"?
Заранее спасибо.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
28.11.2014, 09:39 15
Kroshandowski, очевидно, требуется определить, на каком уровне вы находитесь. Если на первом, то заставить кнопку "Назад" выходить, иначе - переходить на уровень выше.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
28.11.2014, 10:43 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.
0
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
28.11.2014, 15:16  [ТС] 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);
                           }
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
28.11.2014, 15:20 18
Я же писал пример про книжки. Делайте по аналогии.
0
Kroshandowski
2 / 2 / 4
Регистрация: 05.04.2013
Сообщений: 234
28.11.2014, 15:56  [ТС] 19
Spelcrawler, исходя из вашего примера про книжки,все таки для каждого месяца своего года,нужно будет создавать свой Activity?
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
28.11.2014, 15:59 20
Нет, одну на все месяцы, вторую на все недели, третью на все дни и т.д.. Почитайте код внимательнее, там описано все что нужно для отображения разной, но однотипной информации в одном активити, в зависимости от входных данных.
0
28.11.2014, 15:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 15:59

Выпадающее меню для каждого пункта ListView
Здравствуйте! Как реализовать подобное меню в списке? Я придумал только с...

ListView, ToggleButton, SQLite, CursorAdapter. Как найти idItem в ListView, где была нажата ToggleButton?
Добрый день. Затрудняюсь понять один момент: У меня есть ListView,...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru