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

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

Восстановить пароль Регистрация
 
Hmmer
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 11
25.06.2015, 16:02     Загрузка текста и картинки в listView с AsyncTask #1
Привет всем. Имеется файл в формате 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 минут
Я так понимаю, что либо я чушь написал, либо уже есть решение, но никто подсказать не хочет. Хоть бы ткнули носом где есть пример или сказали бы что совсем не в ту степь меня вообще понесло.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
25.06.2015, 16:10     Загрузка текста и картинки в listView с AsyncTask #2
Во-первых много кода, копаться в нем желания не возникает.

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

Задачу надо бы поделить на несколько более мелких и решать их по-порядку.
Hmmer
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 11
25.06.2015, 16:22  [ТС]     Загрузка текста и картинки в listView с AsyncTask #3
Попытаюсь ещё раз объяснить. Есть фаил в формате json, в котором выведены товары. Указаны в нём описание товара и ссылки на картинки. Вот нужно это всё упаковать в список. Список уже готов, только вот данные в примере который я опубликовал берутся из файла strings.xml, который находится по идее внутри приложения, а мне нужно данные из файла json который лежит на удалённом сервере. Так вот чтобы каждый раз не обновлять strings.xml, проще из магазина экспортировать по запросу json. При количестве товаров более 800 наименований сами понимаете, удобнее тянуть с сервера.
По крайней мере я так считаю.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
25.06.2015, 17:25     Загрузка текста и картинки в listView с AsyncTask #4
Hmmer, честно говоря, тоже лень копаться в коде. JSON, если не ошибаюсь, разрешает передачу не только текста, но и картинок. Соответственно, изучаете его структуру, распознаёте JSON, создаёте строку ListView, кладёте в ImageView рисунок.
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
25.06.2015, 18:19     Загрузка текста и картинки в listView с AsyncTask #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 уроков. Всё доступным языком рассказано.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
25.06.2015, 19:30     Загрузка текста и картинки в listView с AsyncTask #6
Mikalai, спору нет, ссылку передавать через JSON можно. Но, вроде как, некоторые выкручиваются, создают какие-то хитрости. Может быть, зависит от конкретного сервера (как настроишь, так и будет).
http://stackoverflow.com/questions/1...an-base64?lq=1 (дискуссия идёт до сих пор).
http://stackoverflow.com/questions/8...to-json-object

Добавлено через 6 минут
Хотя, ТС ещё рано. В его JSON нет таких данных (сначала думал, что есть). Так что моё предложение отменяется.
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
25.06.2015, 19:42     Загрузка текста и картинки в listView с AsyncTask #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....

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

Добавлено через 56 секунд
Кстати, а как вы сформировали такую строку?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2015, 20:35     Загрузка текста и картинки в listView с AsyncTask
Еще ссылки по теме:

Заполнение ListView в AsyncTask Android
Android Загрузка ListView после AsyncTask
Загрузка данных из SQLite для каждого пункта ListView Android
Android Асинхронная загрузка элементов в listview

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

Или воспользуйтесь поиском по форуму:
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
25.06.2015, 20:35     Загрузка текста и картинки в listView с AsyncTask #9
CoolMind, открыл бинарный файл блокнотом )))
Yandex
Объявления
25.06.2015, 20:35     Загрузка текста и картинки в listView с AsyncTask
Ответ Создать тему
Опции темы

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