<?xml version="1.0"?>
<rss version="2.0"><channel><title/><link>https://opencartforum.com/blogs/143-ocdroid-blog/</link><description/><language>uk</language><item><title>Opencart - Android - JSON - &#x43F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x441;&#x43F;&#x438;&#x441;&#x43E;&#x43A; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x43E;&#x432; &#x432; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x438;</title><link>https://opencartforum.com/blogs/entry/172-opencart-android-json-poluchaem-spisok-tovarov-v-prilozhenii/</link><description><![CDATA[
<p>
	Всем привет!
</p>

<p>
	 
</p>

<p>
	Сегодня мы разберем получение товаров из категории Opencart в Android-приложение через JSON. Для начала не будем использовать сторонние библиотеки, а сделаем все нативным образом, чтобы ознакомиться с базовыми принципами обмена данными.
</p>

<p>
	Итак, поехали <img alt=":)" data-emoticon="" data-src="https://opencartforum.com/uploads/emoticons/test_smile.png" height="20" src="https://opencartforum.com/applications/core/interface/js/spacer.png" srcset="https://opencartforum.com/storage/smiles/emoticons/smile@2x.png 2x" style="height:auto;" title=":)" width="20" />
</p>

<p>
	 
</p>

<p>
	Сперва нужно определить выдачу массива товаров в JSON-объект из магазина.<br />
	Открываем <strong>catalog/controller/product/category.php</strong><br />
	И в цикле выдачи данных для товаров добавляем свои запросы. Перед
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">$data</span><span class="pun">[</span><span class="str">'products'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="com">// изображение для списка, размер 100х100</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[</span><span class="str">'image'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $json_image </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_tool_image</span><span class="pun">-&gt;</span><span class="pln">resize</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[</span><span class="str">'image'</span><span class="pun">],</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $json_image </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_tool_image</span><span class="pun">-&gt;</span><span class="pln">resize</span><span class="pun">(</span><span class="str">'placeholder.png'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// создаем массив данных для каждого товара</span><span class="pln">
</span><span class="com">// получаем имя, путь изображения, описание и цену</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'json-products'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'name'</span><span class="pln">        </span><span class="pun">=&gt;</span><span class="pln"> $result</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">],</span><span class="pln">
    </span><span class="str">'thumb'</span><span class="pln">       </span><span class="pun">=&gt;</span><span class="pln"> $json_image</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'description'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> utf8_substr</span><span class="pun">(</span><span class="pln">trim</span><span class="pun">(</span><span class="pln">strip_tags</span><span class="pun">(</span><span class="pln">html_entity_decode</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[</span><span class="str">'description'</span><span class="pun">],</span><span class="pln"> ENT_QUOTES</span><span class="pun">,</span><span class="pln"> </span><span class="str">'UTF-8'</span><span class="pun">))),</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'theme_'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_theme'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'_product_description_length'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'..'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'price'</span><span class="pln">       </span><span class="pun">=&gt;</span><span class="pln"> $price</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span></pre>

<p>
	Дальше ищем response
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">view</span><span class="pun">(</span><span class="str">'product/category'</span><span class="pun">,</span><span class="pln"> $data</span><span class="pun">));</span></pre>

<p>
	И заменяем на
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="com">// формируем массив products</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'json_products'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'products'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $data</span><span class="pun">[</span><span class="str">'json-products'</span><span class="pun">],</span><span class="pln">
</span><span class="pun">);</span><span class="pln">
</span><span class="com">// и отдаем его в json при запросе в адресной строке &amp;json_products</span><span class="pln">
</span><span class="com">// для этого поставим условие запроса</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">[</span><span class="str">'json_products'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">json_encode</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">[</span><span class="str">'json_products'</span><span class="pun">]));</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">response</span><span class="pun">-&gt;</span><span class="pln">setOutput</span><span class="pun">(</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">view</span><span class="pun">(</span><span class="str">'product/category'</span><span class="pun">,</span><span class="pln"> $data</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Таким образом, теперь при запросе к сайту по адресу <span style="color:#3498db;">мой-сайт/index.php?route=product/category&amp;path=20<strong>&amp;json_products</strong></span> мы будем получать массив данных вида:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted">
<span class="pun">{</span><span class="str">"products"</span><span class="pun">:[</span><span class="pln">

    </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="str">"Apple Cinema30'"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"thumb"</span><span class="pun">:</span><span class="str">"http:\/\/store.url\/image\/cache\/catalog\/demo\/apple_cinema_30-100x100.jpg"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"description"</span><span class="pun">:</span><span class="str">"The 30-inch Apple Cinema HD Display delivers an amazing 2560 x 1600 pixel resolution. Designed speci.."</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"price"</span><span class="pun">:</span><span class="str">"$100.00"</span><span class="pun">},</span><span class="pln">

    </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="str">"Canon EOS 5D"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"thumb"</span><span class="pun">:</span><span class="str">"http:\/\/store.url\/image\/cache\/catalog\/demo\/canon_eos_5d_1-100x100.jpg"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"description"</span><span class="pun">:</span><span class="str">"Canon's press material for the EOS 5D states that it 'defines (a) new D-SLR category', while we're n.."</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"price"</span><span class="pun">:</span><span class="str">"$100.00"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
</span><span class="pun">]}</span></pre>

<p>
	 
</p>

<p>
	С серверной частью закончили, переходим к программной части приложения.
</p>

<p>
	 
</p>

<p>
	Что мы будем делать?
</p>

<ul>
	<li>
		Получим JSON данные из url
	</li>
	<li>
		Разберем эти данные и актуализируем с listView(textView)
	</li>
	<li>
		Скачаем картинки, кешируем их в приложении и актуализируем по позициям в listView(imageView)
	</li>
</ul>

<p>
	 
</p>

<p>
	Для начала не забудьте дать приложению разрешение на использование сети (в манифесте):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="tag">&lt;uses-permission</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.permission.INTERNET"</span><span class="tag">/&gt;</span></pre>

<p>
	Также в папку <strong>res/drawable</strong> мы поместим заглушку для изображений(до того, как они спарсятся)<br />
	<strong>blank.png (100x100px)</strong>
</p>

<p>
	 
</p>

<p>
	Теперь разметка.<br />
	Для простоты будем работать с <em><strong>activity_main</strong></em> и стандартным <em><strong>listView</strong></em><br />
	<strong>activity_main.xml:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="tag">&lt;RelativeLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">xmlns:tools</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/tools"</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln"> </span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;ListView</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/lv_products"</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">tools:context</span><span class="pun">=</span><span class="atv">".MainActivity"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/RelativeLayout&gt;</span></pre>

<p>
	Здесь все просто - в релятивную разметку мы поместили <strong><em>listView</em></strong> c id=<strong><em>lv_products</em></strong>
</p>

<p>
	<br />
	Теперь создадим кастомную разметку для этого <strong><em>listView</em></strong><br />
	<strong>lv_layout.xml:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;RelativeLayout</span><span class="pln"> </span><span class="atn">xmlns:android</span><span class="pun">=</span><span class="atv">"http://schemas.android.com/apk/res/android"</span><span class="pln">
    </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
    </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln"> </span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;TextView</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/tv_product"</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_marginLeft</span><span class="pun">=</span><span class="atv">"5dp"</span><span class="pln">
        </span><span class="atn">android:layout_marginRight</span><span class="pun">=</span><span class="atv">"5dp"</span><span class="pln">
        </span><span class="atn">android:layout_marginTop</span><span class="pun">=</span><span class="atv">"5dp"</span><span class="pln">
        </span><span class="atn">android:textColor</span><span class="pun">=</span><span class="atv">"#195F74"</span><span class="pln">
        </span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="pln">
        </span><span class="atn">android:textStyle</span><span class="pun">=</span><span class="atv">"bold"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;ImageView</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/iv_thumb"</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"100dp"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"100dp"</span><span class="pln">
        </span><span class="atn">android:layout_below</span><span class="pun">=</span><span class="atv">"@id/tv_product"</span><span class="pln">
        </span><span class="atn">android:layout_centerVertical</span><span class="pun">=</span><span class="atv">"true"</span><span class="pln">
        </span><span class="atn">android:contentDescription</span><span class="pun">=</span><span class="atv">"@string/str_iv_thumb"</span><span class="pln">
        </span><span class="atn">android:padding</span><span class="pun">=</span><span class="atv">"5dp"</span><span class="pln">
        </span><span class="atn">android:scaleType</span><span class="pun">=</span><span class="atv">"fitXY"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;TextView</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/tv_description"</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_below</span><span class="pun">=</span><span class="atv">"@id/tv_product"</span><span class="pln">
        </span><span class="atn">android:layout_toRightOf</span><span class="pun">=</span><span class="atv">"@id/iv_thumb"</span><span class="pln">
        </span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"16sp"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">

    </span><span class="tag">&lt;TextView</span><span class="pln">
        </span><span class="atn">android:id</span><span class="pun">=</span><span class="atv">"@+id/tv_price"</span><span class="pln">
        </span><span class="atn">android:layout_width</span><span class="pun">=</span><span class="atv">"match_parent"</span><span class="pln">
        </span><span class="atn">android:layout_height</span><span class="pun">=</span><span class="atv">"wrap_content"</span><span class="pln">
        </span><span class="atn">android:layout_below</span><span class="pun">=</span><span class="atv">"@id/tv_description"</span><span class="pln">
        </span><span class="atn">android:layout_marginBottom</span><span class="pun">=</span><span class="atv">"10dp"</span><span class="pln">
        </span><span class="atn">android:gravity</span><span class="pun">=</span><span class="atv">"right"</span><span class="pln">
        </span><span class="atn">android:layout_marginRight</span><span class="pun">=</span><span class="atv">"5dp"</span><span class="pln">
        </span><span class="atn">android:textColor</span><span class="pun">=</span><span class="atv">"#cc3333"</span><span class="pln">
        </span><span class="atn">android:textSize</span><span class="pun">=</span><span class="atv">"20sp"</span><span class="pln">
        </span><span class="atn">android:textStyle</span><span class="pun">=</span><span class="atv">"bold"</span><span class="tag">/&gt;</span><span class="pln">

</span><span class="tag">&lt;/RelativeLayout&gt;</span></pre>

<p>
	 
</p>

<p>
	С разметкой закончили — приступаем к коду<br />
	<br />
	Создаем файл <strong>ProductsJSONParser.java</strong> (это и будет класс парсера)
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">package com</span><span class="pun">.</span><span class="pln">opencart</span><span class="pun">.</span><span class="pln">ocproducstlist</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>ArrayList</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>HashMap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>List</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">json</span><span class="pun">.</span><span>JSONArray</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">json</span><span class="pun">.</span><span>JSONException</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">json</span><span class="pun">.</span><span>JSONObject</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">res</span><span class="pun">.</span><span>Resources</span><span class="pun">;</span><span class="pln">

</span><span class="com">/** класс парсера JSON данных */</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>ProductsJSONParser</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="com">// Получаем JSONObject и возвращаем List</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span>List</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;</span><span class="pln"> parse</span><span class="pun">(</span><span>JSONObject</span><span class="pln"> jObject</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span>JSONArray</span><span class="pln"> jProducts </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// Здесь элементы из массива 'products', который мы получаем из контроллера</span><span class="pln">
            jProducts </span><span class="pun">=</span><span class="pln"> jObject</span><span class="pun">.</span><span class="pln">getJSONArray</span><span class="pun">(</span><span class="str">"products"</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>JSONException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="com">// применяем getProducts к массиву объекта JSON</span><span class="pln">
        </span><span class="com">// теперь каждый объект - это товар</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> getProducts</span><span class="pun">(</span><span class="pln">jProducts</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">private</span><span class="pln"> </span><span>List</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;</span><span class="pln"> getProducts</span><span class="pun">(</span><span>JSONArray</span><span class="pln"> jProducts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">int</span><span class="pln"> productCount </span><span class="pun">=</span><span class="pln"> jProducts</span><span class="pun">.</span><span class="pln">length</span><span class="pun">();</span><span class="pln">
        </span><span>List</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;</span><span class="pln"> productList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>ArrayList</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;();</span><span class="pln">
        </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> product </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// разбираем товары по одному и добавляем к объекту List</span><span class="pln">
        </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> productCount</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// вызываем getProduct и парсим, добавляем</span><span class="pln">
                product </span><span class="pun">=</span><span class="pln"> getProduct</span><span class="pun">((</span><span>JSONObject</span><span class="pun">)</span><span class="pln"> jProducts</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="pln">i</span><span class="pun">));</span><span class="pln">
                productList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="pln">product</span><span class="pun">);</span><span class="pln">

            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>JSONException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> productList</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">// Разбираем JSON-объект product</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> getProduct</span><span class="pun">(</span><span>JSONObject</span><span class="pln"> jProduct</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> product </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;();</span><span class="pln">

        </span><span>String</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
        </span><span>String</span><span class="pln"> thumb </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
        </span><span>String</span><span class="pln"> description </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
        </span><span>String</span><span class="pln"> price </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// обратите внимание на метод .replaceAll</span><span class="pln">
            </span><span class="com">// без него разные "непечатные" символы будут отображаться неправильно</span><span class="pln">
            name </span><span class="pun">=</span><span class="pln"> jProduct</span><span class="pun">.</span><span class="pln">getString</span><span class="pun">(</span><span class="str">"name"</span><span class="pun">).</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">""", "</span><span class="pln">\"</span><span class="str">");</span><span class="pln">
            thumb </span><span class="pun">=</span><span class="pln"> jProduct</span><span class="pun">.</span><span class="pln">getString</span><span class="pun">(</span><span class="str">"thumb"</span><span class="pun">);</span><span class="pln">
            description </span><span class="pun">=</span><span class="pln"> jProduct</span><span class="pun">.</span><span class="pln">getString</span><span class="pun">(</span><span class="str">"description"</span><span class="pun">).</span><span class="pln">replaceAll</span><span class="pun">(</span><span class="str">""", "</span><span class="pln">\"</span><span class="str">").replaceAll("</span><span class="pun">’</span><span class="str">", "</span><span class="pln">\'</span><span class="str">");</span><span class="pln">
            price </span><span class="pun">=</span><span class="pln"> jProduct</span><span class="pun">.</span><span class="pln">getString</span><span class="pun">(</span><span class="str">"price"</span><span class="pun">);</span><span class="pln">

            product</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"product"</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">);</span><span class="pln">
            </span><span class="com">// здесь сперва ставим заглушку</span><span class="pln">
            product</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"thumb"</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span class="pln">blank</span><span class="pun">);</span><span class="pln">
            product</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"thumb_path"</span><span class="pun">,</span><span class="pln"> thumb</span><span class="pun">);</span><span class="pln">
            product</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"description"</span><span class="pun">,</span><span class="pln"> description</span><span class="pun">);</span><span class="pln">
            product</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"price"</span><span class="pun">,</span><span class="pln"> price</span><span class="pun">);</span><span class="pln">

        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>JSONException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> product</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<br />
	Ну а теперь <strong>MainActivity</strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">package com</span><span class="pun">.</span><span class="pln">opencart</span><span class="pun">.</span><span class="pln">ocproducstlist</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>BufferedReader</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>File</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>FileOutputStream</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>IOException</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>InputStream</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">io</span><span class="pun">.</span><span>InputStreamReader</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span>HttpURLConnection</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">net</span><span class="pun">.</span><span class="pln">URL</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>HashMap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>List</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> org</span><span class="pun">.</span><span class="pln">json</span><span class="pun">.</span><span>JSONObject</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">app</span><span class="pun">.</span><span>Activity</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span>Bitmap</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span>BitmapFactory</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span>Color</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">drawable</span><span class="pun">.</span><span>ColorDrawable</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span>AsyncTask</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">os</span><span class="pun">.</span><span>Bundle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">util</span><span class="pun">.</span><span>Log</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">view</span><span class="pun">.</span><span>Menu</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span>ListView</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> android</span><span class="pun">.</span><span class="pln">widget</span><span class="pun">.</span><span>SimpleAdapter</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>MainActivity</span><span class="pln"> extends </span><span>Activity</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span>ListView</span><span class="pln"> mListView</span><span class="pun">;</span><span class="pln">

    </span><span class="lit">@Override</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onCreate</span><span class="pun">(</span><span>Bundle</span><span class="pln"> savedInstanceState</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        super</span><span class="pun">.</span><span class="pln">onCreate</span><span class="pun">(</span><span class="pln">savedInstanceState</span><span class="pun">);</span><span class="pln">
        setContentView</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">activity_main</span><span class="pun">);</span><span class="pln">

        </span><span class="com">// URL с нашими JSON-данными</span><span class="pln">
        </span><span>String</span><span class="pln"> strUrl </span><span class="pun">=</span><span class="pln"> </span><span class="str">"http://мойсайт.com/index.php?route=product/category&amp;path=20&amp;json_products"</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// определяем задачу по загрузке</span><span class="pln">
        </span><span class="com">// и запускаем ее с нашим url</span><span class="pln">
        </span><span>DownloadTask</span><span class="pln"> downloadTask </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>DownloadTask</span><span class="pun">();</span><span class="pln">
        downloadTask</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">strUrl</span><span class="pun">);</span><span class="pln">

        </span><span class="com">// ссылаемся на ListView в activity_main</span><span class="pln">
        mListView </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>ListView</span><span class="pun">)</span><span class="pln"> findViewById</span><span class="pun">(</span><span class="pln">R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">lv_products</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">/** метод загрузки данных из url */</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span>String</span><span class="pln"> downloadUrl</span><span class="pun">(</span><span>String</span><span class="pln"> strUrl</span><span class="pun">)</span><span class="pln"> throws </span><span>IOException</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span>String</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
        </span><span>InputStream</span><span class="pln"> iStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            URL url </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">strUrl</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// Создаем http соединение, соединяемся и считываем данные</span><span class="pln">
            </span><span>HttpURLConnection</span><span class="pln"> urlConnection </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>HttpURLConnection</span><span class="pun">)</span><span class="pln"> url
                    </span><span class="pun">.</span><span class="pln">openConnection</span><span class="pun">();</span><span class="pln">
            urlConnection</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">();</span><span class="pln">
            iStream </span><span class="pun">=</span><span class="pln"> urlConnection</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">();</span><span class="pln">

            </span><span>BufferedReader</span><span class="pln"> br </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>BufferedReader</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span>InputStreamReader</span><span class="pun">(</span><span class="pln">
                    iStream</span><span class="pun">));</span><span class="pln">

            </span><span>StringBuffer</span><span class="pln"> sb </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>StringBuffer</span><span class="pun">();</span><span class="pln">

            </span><span>String</span><span class="pln"> line </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">line </span><span class="pun">=</span><span class="pln"> br</span><span class="pun">.</span><span class="pln">readLine</span><span class="pun">())</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                sb</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">line</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            data </span><span class="pun">=</span><span class="pln"> sb</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">

            br</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">

        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span>Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="str">"Exception while downloading url"</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> finally </span><span class="pun">{</span><span class="pln">
            iStream</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">/** Асинхронно скачиваем json */</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>DownloadTask</span><span class="pln"> extends </span><span>AsyncTask</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Integer</span><span class="pun">,</span><span class="pln"> </span><span>String</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span>String</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span>String</span><span class="pln"> doInBackground</span><span class="pun">(</span><span>String</span><span class="pun">...</span><span class="pln"> url</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                data </span><span class="pun">=</span><span class="pln"> downloadUrl</span><span class="pun">(</span><span class="pln">url</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">

            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span>Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="str">"Background Task"</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPostExecute</span><span class="pun">(</span><span>String</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

            </span><span class="com">// закончили в non-ui</span><span class="pln">
            </span><span>ListViewLoaderTask</span><span class="pln"> listViewLoaderTask </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>ListViewLoaderTask</span><span class="pun">();</span><span class="pln">

            </span><span class="com">// начинаем парсить</span><span class="pln">
            listViewLoaderTask</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">

        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">/** Асинхронно парсим данные и кидаем в listView */</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>ListViewLoaderTask</span><span class="pln"> extends
            </span><span>AsyncTask</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Void</span><span class="pun">,</span><span class="pln"> </span><span>SimpleAdapter</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span>JSONObject</span><span class="pln"> jObject</span><span class="pun">;</span><span class="pln">

        </span><span class="com">// парсим в non-ui</span><span class="pln">
        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span>SimpleAdapter</span><span class="pln"> doInBackground</span><span class="pun">(</span><span>String</span><span class="pun">...</span><span class="pln"> strJson</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                jObject </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>JSONObject</span><span class="pun">(</span><span class="pln">strJson</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
                </span><span>ProductsJSONParser</span><span class="pln"> productsJsonParser </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>ProductsJSONParser</span><span class="pun">();</span><span class="pln">
                productsJsonParser</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">jObject</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span>Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="str">"JSON Exception1"</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="com">// Инстанцируем класс парсера</span><span class="pln">
            </span><span>ProductsJSONParser</span><span class="pln"> productsJsonParser </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>ProductsJSONParser</span><span class="pun">();</span><span class="pln">

            </span><span class="com">// Список для сохранения</span><span class="pln">
            </span><span>List</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;</span><span class="pln"> products </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

            </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// Получаем спарсеные данные в List (наш список)</span><span class="pln">
                products </span><span class="pun">=</span><span class="pln"> productsJsonParser</span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">jObject</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span>Log</span><span class="pun">.</span><span class="pln">d</span><span class="pun">(</span><span class="str">"Exception"</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="com">// Ключи, которые используем в hashMap</span><span class="pln">
            </span><span>String</span><span class="pun">[]</span><span class="pln"> from </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"product"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"thumb"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"description"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"price"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

            </span><span class="com">// и айдишники, используемые в listView</span><span class="pln">
            </span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> to </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">tv_product</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">iv_thumb</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">tv_description</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">id</span><span class="pun">.</span><span class="pln">tv_price </span><span class="pun">};</span><span class="pln">

            </span><span class="com">// задаем адаптер</span><span class="pln">
            </span><span class="com">// и закидываем ключи в айдишники</span><span class="pln">
            </span><span>SimpleAdapter</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>SimpleAdapter</span><span class="pun">(</span><span class="pln">getBaseContext</span><span class="pun">(),</span><span class="pln">
                    products</span><span class="pun">,</span><span class="pln"> R</span><span class="pun">.</span><span class="pln">layout</span><span class="pun">.</span><span class="pln">lv_layout</span><span class="pun">,</span><span class="pln"> from</span><span class="pun">,</span><span class="pln"> to</span><span class="pun">);</span><span class="pln">

            </span><span class="kwd">return</span><span class="pln"> adapter</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="com">/** doInBackground выполнен - займемся картинками */</span><span class="pln">
        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPostExecute</span><span class="pun">(</span><span>SimpleAdapter</span><span class="pln"> adapter</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

            </span><span class="com">// Задаем адаптер для listview</span><span class="pln">
            mListView</span><span class="pun">.</span><span class="pln">setAdapter</span><span class="pun">(</span><span class="pln">adapter</span><span class="pun">);</span><span class="pln">

            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> adapter</span><span class="pun">.</span><span class="pln">getCount</span><span class="pun">();</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> hm </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;)</span><span class="pln"> adapter
                        </span><span class="pun">.</span><span class="pln">getItem</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
                </span><span>String</span><span class="pln"> imgUrl </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>String</span><span class="pun">)</span><span class="pln"> hm</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"thumb_path"</span><span class="pun">);</span><span class="pln">
                </span><span>ImageLoaderTask</span><span class="pln"> imageLoaderTask </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>ImageLoaderTask</span><span class="pun">();</span><span class="pln">

                </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> hmDownload </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;();</span><span class="pln">
                hm</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"thumb_path"</span><span class="pun">,</span><span class="pln"> imgUrl</span><span class="pun">);</span><span class="pln">
                hm</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"position"</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// запускаем ImageLoaderTask для скачивания</span><span class="pln">
                </span><span class="com">// и актуализации картинок в listview</span><span class="pln">
                imageLoaderTask</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="pln">hm</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="com">/** Асинхронно качаем картинки и помещаем в listView */</span><span class="pln">
    </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>ImageLoaderTask</span><span class="pln"> extends
            </span><span>AsyncTask</span><span class="pun">&lt;</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;,</span><span class="pln"> </span><span>Void</span><span class="pun">,</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> doInBackground</span><span class="pun">(</span><span class="pln">
                </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;...</span><span class="pln"> hm</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

            </span><span>InputStream</span><span class="pln"> iStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
            </span><span>String</span><span class="pln"> imgUrl </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>String</span><span class="pun">)</span><span class="pln"> hm</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"thumb_path"</span><span class="pun">);</span><span class="pln">
            </span><span class="kwd">int</span><span class="pln"> position </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>Integer</span><span class="pun">)</span><span class="pln"> hm</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"position"</span><span class="pun">);</span><span class="pln">

            URL url</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                url </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">imgUrl</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// создаем соединение и подключаемся</span><span class="pln">
                </span><span>HttpURLConnection</span><span class="pln"> urlConnection </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>HttpURLConnection</span><span class="pun">)</span><span class="pln"> url
                        </span><span class="pun">.</span><span class="pln">openConnection</span><span class="pun">();</span><span class="pln">
                urlConnection</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">();</span><span class="pln">

                </span><span class="com">// считываем данные</span><span class="pln">
                iStream </span><span class="pun">=</span><span class="pln"> urlConnection</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">();</span><span class="pln">

                </span><span class="com">// директория кеширования</span><span class="pln">
                </span><span>File</span><span class="pln"> cacheDirectory </span><span class="pun">=</span><span class="pln"> getBaseContext</span><span class="pun">().</span><span class="pln">getCacheDir</span><span class="pun">();</span><span class="pln">

                </span><span class="com">// временно сохраняем картинку в кеш-дир</span><span class="pln">
                </span><span>File</span><span class="pln"> tmpFile </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>File</span><span class="pun">(</span><span class="pln">cacheDirectory</span><span class="pun">.</span><span class="pln">getPath</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"/ocpl_"</span><span class="pln">
                        </span><span class="pun">+</span><span class="pln"> position </span><span class="pun">+</span><span class="pln"> </span><span class="str">".png"</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// поток в кеш-файл</span><span class="pln">
                </span><span>FileOutputStream</span><span class="pln"> fOutStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>FileOutputStream</span><span class="pun">(</span><span class="pln">tmpFile</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// из потока в картинку</span><span class="pln">
                </span><span>Bitmap</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span>BitmapFactory</span><span class="pun">.</span><span class="pln">decodeStream</span><span class="pun">(</span><span class="pln">iStream</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// пишем файл в темп (png)</span><span class="pln">
                b</span><span class="pun">.</span><span class="pln">compress</span><span class="pun">(</span><span>Bitmap</span><span class="pun">.</span><span>CompressFormat</span><span class="pun">.</span><span class="pln">PNG</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> fOutStream</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// сбрасываем и закрываем поток</span><span class="pln">
                fOutStream</span><span class="pun">.</span><span class="pln">flush</span><span class="pun">();</span><span class="pln">
                fOutStream</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">

                </span><span class="com">// создаем hashMap для передачи картинки</span><span class="pln">
                </span><span class="com">// в listview, в соответствии с позицией</span><span class="pln">
                </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> hmBitmap </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;();</span><span class="pln">

                </span><span class="com">// сохраняем путь к картинке</span><span class="pln">
                </span><span class="com">// и позицию картинки в listview</span><span class="pln">
                hmBitmap</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"thumb"</span><span class="pun">,</span><span class="pln"> tmpFile</span><span class="pun">.</span><span class="pln">getPath</span><span class="pun">());</span><span class="pln">
                hmBitmap</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"position"</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">);</span><span class="pln">

                </span><span class="com">// возвращаем объект с картинкой и позицией</span><span class="pln">
                </span><span class="kwd">return</span><span class="pln"> hmBitmap</span><span class="pun">;</span><span class="pln">

            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span>Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="lit">@Override</span><span class="pln">
        </span><span class="kwd">protected</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> onPostExecute</span><span class="pun">(</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// теперь получаем путь и позицию</span><span class="pln">
            </span><span>String</span><span class="pln"> path </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>String</span><span class="pun">)</span><span class="pln"> result</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"thumb"</span><span class="pun">);</span><span class="pln">
            </span><span class="kwd">int</span><span class="pln"> position </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>Integer</span><span class="pun">)</span><span class="pln"> result</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"position"</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// задаем адаптер</span><span class="pln">
            </span><span>SimpleAdapter</span><span class="pln"> adapter </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>SimpleAdapter</span><span class="pun">)</span><span class="pln"> mListView</span><span class="pun">.</span><span class="pln">getAdapter</span><span class="pun">();</span><span class="pln">

            </span><span class="com">// забираем объекты из hashMap</span><span class="pln">
            </span><span class="com">// с соответствующей позицией в listview</span><span class="pln">
            </span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;</span><span class="pln"> hm </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span>HashMap</span><span class="pun">&lt;</span><span>String</span><span class="pun">,</span><span class="pln"> </span><span>Object</span><span class="pun">&gt;)</span><span class="pln"> adapter
                    </span><span class="pun">.</span><span class="pln">getItem</span><span class="pun">(</span><span class="pln">position</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// заменяем текущий путь (сейчас "заглушка" - res/drawable/blank.png)</span><span class="pln">
            hm</span><span class="pun">.</span><span class="pln">put</span><span class="pun">(</span><span class="str">"thumb"</span><span class="pun">,</span><span class="pln"> path</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// и сообщаем listView об изенении содержимого</span><span class="pln">
            adapter</span><span class="pun">.</span><span class="pln">notifyDataSetChanged</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Запускаем приложение и любуемся результатом:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="283655" href="https://opencartforum.com/storage/attachment/monthly_2019_01/nexus.jpg.e9f73dc8ed26c60349e8bf523a2c041f.jpg" rel="" data-fileext="jpg"><img alt="nexus.thumb.jpg.364147d8815428c5240f877d26904e83.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="283655" data-ratio="100" style="height:auto;" data-src="https://opencartforum.com/uploads/monthly_2019_01/nexus.thumb.jpg.364147d8815428c5240f877d26904e83.jpg" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></a>
</p>

<p>
	 
</p>

<p>
	До новых встреч <span><img alt=":)" data-emoticon="" data-src="https://opencartforum.com/uploads/emoticons/test_smile.png" height="20" src="https://opencartforum.com/applications/core/interface/js/spacer.png" srcset="https://opencartforum.com/storage/smiles/emoticons/smile@2x.png 2x" style="height:auto;" title=":)" width="20" /> </span>
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">172</guid><pubDate>Tue, 22 Jan 2019 10:18:00 +0000</pubDate></item></channel></rss>
