Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Hmmer
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 11
1

Загрузка текста и картинки в listView с AsyncTask

25.06.2015, 16:02. Просмотров 1469. Ответов 8
Метки нет (Все метки)

Привет всем. Имеется файл в формате JSON на удалённом сервере. Мне нужно вывести текст из определённых узлов файла и картинки по указанным в файле ссылкам.

JSON
1
2
{"success":1,"products":[{"id":"956","name":"\u041c\u044f\u0447 ","price":"29.0000","description":"","image_url":"http:\/\/..../1711.750x0.jpg"},{"id":"955","name":"\u0416\u0435\u043d\u0441\u043a\u0430\u044f \u0444\u0443\u0442\u0431\u043e\u043b\u043a\u0430 (Allianz)","price":"110.5000","description":"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b: CLIMACOOL\u00ae, 100% \u043f\u043e\u043b\u0438\u044d\u0441\u0442\u0435\u0440","image_url":"http:\/\/.../1709.750x0.jpg"},{"id":"954","name":"\u0422\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u0430\u044f \u043a\u043e\u0444\u0442\u0430 15\/16","price":"91.0000","description":"
100% \u043f\u043e\u043b\u0438\u044d\u0441\u0442\u0435\u0440<\/p>","image_url":"http:\/\/.../1706.750x0.jpg"}]}
Нашёл в интеренте примеры, только вот дела все примеры делают чтото одно, либо текст, либо картинку. Попытался както допилить. Но увы познаний не хватает. Вот код:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class MainActivity extends Activity {
 
    // Создаем объект JSON Parser
    JSONParser jParser = new JSONParser();
 
 
    private static String url_all_products = "http://.../test.php";
    // Имена узлов JSON
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PRODUCTS = "products";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_IMAGE = "image_url";
    // массив товаров JSONArray
    JSONArray products = null;
 
 
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
// Загружаем товары в другом потоке
        new LoadAllProductsTask().execute();
 
 
        ArrayList<ListItem> listData = getListData();
 
        final ListView listView = (ListView) findViewById(R.id.custom_list);
        listView.setAdapter(new CustomListAdapter(this, listData));
        listView.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                ListItem newsData = (ListItem) listView.getItemAtPosition(position);
                Toast.makeText(MainActivity.this, "Selected :" + " " + newsData, Toast.LENGTH_LONG).show();
            }
        });
    }
 
    private ArrayList<ListItem> getListData() {
        ArrayList<ListItem> listMockData = new ArrayList<ListItem>();
 
 
        String[] images = getResources().getStringArray(R.array.images_array);
        String[] headlines = getResources().getStringArray(R.array.headline_array);
 
        for (int i = 0; i < images.length; i++) {
            ListItem newsData = new ListItem();
            newsData.setUrl(images[i]);
            newsData.setHeadline(headlines[i]);
            newsData.setReporterName("Папарацци");
            newsData.setDate("May 26, 2013, 13:35");
            listMockData.add(newsData);
        }
        return listMockData;
    }
 
 
    // Задача в другом потоке для загрузки всех товаров через HTTP Request
    class LoadAllProductsTask extends AsyncTask<String, String, String> {
 
 
 
        // получим все товары через url
        protected String doInBackground(String... args) {
            // Строим параметры
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // получим строку JSON из URL
            JSONObject json = jParser.makeHttpRequest(url_all_products, "GET",
                    params);
 
            // Check your log cat for JSON reponse
            //Log.d("All Products: ", json.toString());
 
            try {
                // Проверяем переменную SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // товар найден
                    // получаем массив товаров
                    products = json.getJSONArray(TAG_PRODUCTS);
 
                    // проходим в цикле через все товары
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);
 
 
 
 
 
 
                        Log.d("Продукт ID: ", c.getString(TAG_PID));
 
 
                    }
 
                } else {
                    // ничего не найдено
 
 
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
 
    }
 
 
}
как мне получить данные внутри getListData() из LoadAllProductsTask? Если кому не трудно допишите или исправте код. Ничего не получается. В гугл не посылайте несколько дней рыл, и примера так и не нашёл.
Лог выводит как положено ID продуктов.
Пример вывода листа берёт ссылки на картинки и тексты из двух array в файле strings.xml, а мне надо из удалённого json файла.

Добавлено через 22 часа 38 минут
Я так понимаю, что либо я чушь написал, либо уже есть решение, но никто подсказать не хочет. Хоть бы ткнули носом где есть пример или сказали бы что совсем не в ту степь меня вообще понесло.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2015, 16:02
Ответы с готовыми решениями:

Загрузка ListView после AsyncTask
В классе, который расшияет AsyncTask, занружаю данные из JSON и сохраняю в бд....

Заполнение ListView в AsyncTask
Нужно заполнить ListView картинками, которые скачиваются в AsyncTask с помощью...

Свой listview с AsyncTask
Подскажите, что не так делаю. При запуске приложения listview просто не...

Как из AsyncTask Добавить элементы в ListView
В общем сабж. Используя адаптер как сделать?

Порционная загрузка с AsyncTask и бесконечный скролл
Есть большой JSON с текстом и картинками. С помощью AsyncTask я гружу все...

8
Pablito
2722 / 2165 / 735
Регистрация: 12.05.2014
Сообщений: 7,573
Завершенные тесты: 1
25.06.2015, 16:10 2
Во-первых много кода, копаться в нем желания не возникает.

Цитата Сообщение от Hmmer Посмотреть сообщение
Мне нужно вывести текст из определённых узлов файла и картинки по указанным в файле ссылкам.
Корабли бороздят просторы большого театра.
Я, к примеру, вообще не понял о чем речь.

Задачу надо бы поделить на несколько более мелких и решать их по-порядку.
0
Hmmer
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 11
25.06.2015, 16:22  [ТС] 3
Попытаюсь ещё раз объяснить. Есть фаил в формате json, в котором выведены товары. Указаны в нём описание товара и ссылки на картинки. Вот нужно это всё упаковать в список. Список уже готов, только вот данные в примере который я опубликовал берутся из файла strings.xml, который находится по идее внутри приложения, а мне нужно данные из файла json который лежит на удалённом сервере. Так вот чтобы каждый раз не обновлять strings.xml, проще из магазина экспортировать по запросу json. При количестве товаров более 800 наименований сами понимаете, удобнее тянуть с сервера.
По крайней мере я так считаю.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,732
25.06.2015, 17:25 4
Hmmer, честно говоря, тоже лень копаться в коде. JSON, если не ошибаюсь, разрешает передачу не только текста, но и картинок. Соответственно, изучаете его структуру, распознаёте JSON, создаёте строку ListView, кладёте в ImageView рисунок.
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
25.06.2015, 18:19 5
JSON, по моему, всё таки текстовый формат и передавать изображения с его помощью нельзя. Можно передать ссылку на изображение.

Hmmer, я так понял ты не знаешь как достать информацию из метода doInBackground.
Нужно поступить примерно так :
Создай объект который будет передаваться как результат из метода doInBackground. Допустим MyResult(это может быть список или массив или любой другой объект). Класс LoadAllProductsTask будет выглядеть примерно так:

Java
1
2
3
4
5
6
7
    class LoadAllProductsTask extends AsyncTask<"тип входных данных", String, MyResult> {
 
        protected MyResult doInBackground("тип входных данных"... args) {
            // получим все товары через url и записываем в объект MyResult
            return MyResult;
        }
    }
А вместо
Java
1
new LoadAllProductsTask().execute();
Нужно написать что-то на подобии:

Java
1
2
3
        LoadAllProductsTask allProductsTask = new LoadAllProductsTask();
        allProductsTask.execute("тип входных данных" arg);// "тип входных данных" - это может быть String или любой другой тип
        MyResult myResult = allProductsTask.get();
Подробнее про AsyncTask почитай тут. Там 6 уроков. Всё доступным языком рассказано.
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,732
25.06.2015, 19:30 6
Mikalai, спору нет, ссылку передавать через JSON можно. Но, вроде как, некоторые выкручиваются, создают какие-то хитрости. Может быть, зависит от конкретного сервера (как настроишь, так и будет).
http://stackoverflow.com/questions/1...an-base64?lq=1 (дискуссия идёт до сих пор).
http://stackoverflow.com/questions/8...to-json-object

Добавлено через 6 минут
Хотя, ТС ещё рано. В его JSON нет таких данных (сначала думал, что есть). Так что моё предложение отменяется.
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
25.06.2015, 19:42 7
CoolMind, как я понял идея заключается в интерпретировании массива байт(картинки) как текста. В итоге получится что-то типо:

3F33ё3с4+4e4ћ4Ш55M5‡5В5э676r6®6й7$7`7њ7Ч88P8Њ8И99B99ј9щ:6:t:І:п;-;k;Є;и<'<e<¤<г="=a=Ў=а> >`>*>а?!?a?ў?в@#@d@¦@зA)AjA¬AоB0BrBµBчC:C}CАDDGDЉDОEEUEљEЮF"FgF«FрG5G{GАHHKH‘HЧIIcI©IрJ7J}JДK KSKљKвL*LrLєMMJM“MЬN%NnN·O....

а на другом конце обратная операция. Это как сковородкой яму копать. Извращение в чистом виде
0
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,732
25.06.2015, 20:16 8
Mikalai, это один из вариантов, вы можете его не использовать, но это лучше, чем ничего. Вы же помните, как передаются картинки в почтовых программах? Точно так же кодируются через Base64 (или по-другому, я уже подзабыл). И всё нормально.

Добавлено через 56 секунд
Кстати, а как вы сформировали такую строку?
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
25.06.2015, 20:35 9
CoolMind, открыл бинарный файл блокнотом )))
0
25.06.2015, 20:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2015, 20:35

Загрузка информации через AsyncTask и возврат ее в mainactivity
Здравствуйте. Задача вроде проста, а ничего не получается) мне необходим...

Динамическая загрузка в ListView
Добрый день ув. Программисты. 3й день в безуспешных поисках. Точнее поиски...

Асинхронная загрузка элементов в listview
Столкнулся с такой проблемой, что у меня есть listview, в который с сайта...


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

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

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