Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
PhantomR
5 / 5 / 0
Регистрация: 04.02.2016
Сообщений: 78
#1

Parser XML + RecyclerView + Fragments - Программирование Android

28.08.2016, 22:54. Просмотров 287. Ответов 4
Метки нет (Все метки)

3 вопроса.

Вопрос по XML парсингу. Подскажите как сделать выборку парсера по номеру <categoryId>6</categoryId>? (парсится отсюда http://ufa.farfor.ru/getyml/?key=ukAXxeJYZN)

Вопрос по RecyclerView. Подскажите почему, когда заходишь в категорию "Супы" показывает одинаковый элемент, а не разные?

Вопрос по фрагментам. И почему при входе в категорию под индексом "0" (Салаты). Он открывает супы а потом салаты). Не могу понять.

2 дня бьюсь. Подскажите люди добрые!

Вот проект! https://github.com/PhantomRec/OnlineShopProject
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2016, 22:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Parser XML + RecyclerView + Fragments (Программирование Android):

Пример fragments and RecyclerView - Программирование Android
может кто-то показать пример проекта как на фото, с 2 активити, и 2 фрагментами, слева список RecyclerView а справа какая-то инфа, при...

RecyclerView с картинками или xml разметка что лучше? - Программирование Android
У меня есть 2 вопроса, может вам они покажутся глупыми, но я в этом пока что не очень разбираюсь: 1) RecyclerView отображает список...

Xml sax parser как вытащить картинку из тега <description> - Программирование Android
пишу клиент для сайта использую xml sax parser вопрос как вытащить картинки и сделать что бы они коректно отображались класс парсера ...

Advanced RecyclerView и Expandable RecyclerView - Программирование Android
Сделал expandable recycler view на основе advancedRecyclerView сборочки, но не важно это думаю, наследуется от обычного RecyclerView. ...

RecyclerView внутри recyclerView - Программирование Android
Добрый день. Хочу сделать список recyclerView c горизонтальной прокруткой, который отображает допустим 20 элементов(card). Т.е....

Fragments - Программирование Android
Не пойму как исправить код чтобы открыл новую страницу import android.content.Intent; import android.os.Bundle; ...

4
Pablito
29.08.2016, 11:25
  #2

Не по теме:

смахивает на "напишите за меня тестовое задание"

0
PhantomR
5 / 5 / 0
Регистрация: 04.02.2016
Сообщений: 78
30.08.2016, 14:52  [ТС] #3
Хм. Если вы смотрели проект. То там готово 8-9 их 10. Есть нерешенные вопросы, я ищу ответы и так. Но может и здесь кто, что подскажет.

Добавлено через 21 час 54 минуты
Итак. Вопрос по фрагментам решен. Там глупая ошибка.

По RV. Выяснил что приходит список из нужного размера, но с одинаковыми элементами. Почему-то во время парсинга парсит разные значения, но добавляет в итоге одинаковое последнее. Это странно. Разбираюсь.

Может кто глянет?

А может это связано и с ошибкой PARSER'а, т.к. в прошлый раз им парсил <item> и всё было ок, а сейчас тег <offer id ="222">, а не просто <offer>. И выдает Exception name expected position:START_TAG <n.length

По категориям разбивку потом сделаю. Думаю передачей интентом после парсинг нужной категории в нужный список.

Жду ответа по одинаковым элементам. Закоммитил новую версию.

Добавлено через 1 минуту
Код парсера:
Java
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
    public void parse(String xml) {
        try {
            XmlPullParser parser = prepareXpp(xml);
            Boolean isSiteMeta = true;
            String tagValue = null;
            postLists.clear();
            PostList posts = new PostList();
            while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
                switch (parser.getEventType()) {
                    case XmlPullParser.START_TAG:
                        if (parser.getName().equalsIgnoreCase("offer")) {
                            isSiteMeta = false;
                        }
                        break;
                    case XmlPullParser.TEXT:
                        tagValue = parser.getText();
                    default:
                        break;
                    case XmlPullParser.END_TAG:
                        if (!isSiteMeta) {
                            if (parser.getName().equalsIgnoreCase("name")) {
                                posts.setName(tagValue);
                            } else if (parser.getName().equalsIgnoreCase("picture")) {
                                posts.setImageUrl(tagValue);
                            } else if (parser.getName().equalsIgnoreCase("price")) {
                                posts.setPrice(tagValue);
                            } else if (parser.getName().equalsIgnoreCase("description")) {
                                Log.d(TAG, "parse: " + tagValue);
                                posts.setDescription(tagValue);
                            } else if (parser.getName().equalsIgnoreCase("param")) {
                                if (tagValue != null && tagValue.contains("гр")) {
                                    posts.setWeight(tagValue);
                                }
                            } else if (parser.getName().equalsIgnoreCase("categoryId")) {
                                posts.setDescription(tagValue);
                            }
                        }
                        if (parser.getName().equalsIgnoreCase("offer")) {
                            postLists.add(posts);
//                            Log.d(TAG, "parse: " + postLists.size());
//                            Log.d(TAG, "parse: " + postLists.get(0));
//                            Log.d(TAG, "parse: " + postLists.get(1));
                            isSiteMeta = true;
                        }
                        break;
                }
                parser.next();
            }
        } catch (Exception e) {
            Log.d(TAG, "Exception: " + e.toString());
        }
    }
 
    private XmlPullParser prepareXpp(String rss) throws XmlPullParserException {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(new StringReader(rss));
        return parser;
    }
Добавлено через 5 часов 28 минут
Тема закрыта. Все вопросы решены!
0
vxg
Модератор
3199 / 2002 / 230
Регистрация: 13.01.2012
Сообщений: 7,751
31.08.2016, 09:41 #4
Цитата Сообщение от PhantomR Посмотреть сообщение
Тема закрыта. Все вопросы решены!
небо улыбалось бы вам если бы вы найдя решение оставляли его в теме
0
PhantomR
5 / 5 / 0
Регистрация: 04.02.2016
Сообщений: 78
31.08.2016, 11:16  [ТС] #5
Закоммитил новый проект на gitHub.

С фрагментами тупейшая ошибка не было break; в switch-case.

Категории, сделал проще, отпарсил всё, а потом передавал нужные категории при вызове нужного фрагмента.
Java
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
    private final static String CATEGORY_ID_SALAD = "7";
    private final static String CATEGORY_ID_DESSERT = "10";
    private final static String CATEGORY_ID_PIZZA = "1";
    private final static String CATEGORY_ID_SOUP = "6";
 
  adapter.setListener(new CategoryAdapter.Listener() {
            public void onClick(int position) {
                Fragment fragment;
                FragmentTransaction ft;
                Bundle bundle;
                switch (position) {
                    case 0:
                        fragment = new CategoryListFragment();
                        bundle = new Bundle();
                        bundle.putString("ID", CATEGORY_ID_SALAD);
                        fragment.setArguments(bundle);
                        ft = getFragmentManager().beginTransaction();
                        ft.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
                        break;
                    case 1:
                        fragment = new CategoryListFragment();
                        bundle = new Bundle();
                        bundle.putString("ID", CATEGORY_ID_SOUP);
                        fragment.setArguments(bundle);
                        ft = getFragmentManager().beginTransaction();
                        ft.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
                        break;
                    case 2:
                        fragment = new CategoryListFragment();
                        bundle = new Bundle();
                        bundle.putString("ID", CATEGORY_ID_DESSERT);
                        fragment.setArguments(bundle);
                        ft = getFragmentManager().beginTransaction();
                        ft.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
                        break;
                    case 3:
                        fragment = new CategoryListFragment();
                        bundle = new Bundle();
                        bundle.putString("ID", CATEGORY_ID_PIZZA);
                        fragment.setArguments(bundle);
                        ft = getFragmentManager().beginTransaction();
                        ft.replace(R.id.content_frame, fragment).addToBackStack(null).commit();
                        break;
                    default:
                        break;
                }
            }
        });
v RV сложнее, Сейчас скину. Правильный парсинг. ПРоблемы была при создании и пересоздании элемента. Вот весь парсинг:
Java
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
 public void parse(String xml) {
        String name = "";
        String weight = "";
        String price = "";
        String imageUrl = "";
        String description = "";
        String categoryId = "";
        try {
            XmlPullParser parser = prepareXpp(xml);
            Boolean isSiteMeta = true;
            String tagValue = null;
            int event = parser.getEventType();
            postLists.clear();
            do {
                String tagName = parser.getName();
                switch (event) {
                    case XmlPullParser.START_TAG:
                        if (tagName.equalsIgnoreCase("offer")) {
                            isSiteMeta = false;
                        }
                        break;
                    case XmlPullParser.TEXT:
                        tagValue = parser.getText();
                    default:
                        break;
                    case XmlPullParser.END_TAG:
                        if (!isSiteMeta) {
                            if (tagName.equalsIgnoreCase("name")) {
                                name = tagValue;
                            } else if (tagName.equalsIgnoreCase("picture")) {
                                imageUrl = tagValue;
                            } else if (tagName.equalsIgnoreCase("price")) {
                                price = tagValue;
                            } else if (tagName.equalsIgnoreCase("description")) {
                                description = tagValue;
                            } else if (tagName.equalsIgnoreCase("param")) {
                                if (tagValue != null && tagValue.contains("гр")) {
                                    weight = tagValue;
                                }
                            } else if (tagName.equalsIgnoreCase("categoryId")) {
                                categoryId = tagValue;
                            }
                        }
                        if (tagName.equalsIgnoreCase("offer")) {
                            postLists.add(new PostList(name, weight, price,
                                    imageUrl, description, categoryId));
                            isSiteMeta = true;
                        }
                        break;
                }
                event = parser.next();
            } while (event != XmlPullParser.END_DOCUMENT);
        } catch (Exception e) {
            Log.d(TAG, "Exception: " + e.toString());
        }
    }
 
    private XmlPullParser prepareXpp(String rss) throws XmlPullParserException {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(new StringReader(rss));
        return parser;
    }
Добавлено через 52 секунды
Ещё подсказали, что парсинг и запросы лучше делать через Retrofit. Планирую заняться этим вопросом в ближ дни
1
31.08.2016, 11:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2016, 11:16
Привет! Вот еще темы с ответами:

Fragments - Программирование Android
Здравствуйте, я новичок и многого не понимаю. У меня такой вопрос, что содержит в себе приложение по типу ВКонтаке и Facebook. Я имею ввиду...

Fragments и service - Программирование Android
такой вопрос как реализовать запуск сервиса и обработку результатов приложении где есть fragments.? хотелось бы запускать сервис в...

Fragments и Activity - Программирование Android
Есть приложение некоего калькулятора, в котором есть activity_main.xml, где реализованы кнопки и клас MainActivity.java, в котором...

Работа с fragments и MediaPlayer - Программирование Android
Здравствуйте! Возник такой вопрос. Я организовал кнопку, при нажатии которой вызывается фрагмент и включается медиафайл. Во фрагменте...


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

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

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