0

Я сделал расширяемый список, в котором дочерние (подпозиции) отображаются изображения из выпадающей папки или текста.Просмотр списка изображений в Расширяемом списке

Я хочу сделать то же самое с изображениями из Интернета. Поэтому я использовал asynctask, чтобы избежать NetworkOnMainThreadException

Этот код находится в моем ExpandableListAdapter, где я инициализирую элементы и подпозиции. Drawable и ImageView глобально определены так, чтобы все функции могли достичь их без отправки в качестве параметров.

Drawable drawable; 
ImageView imgView; 


@Override 
public View getChildView(int groupPosition, int childPosition, 
     boolean isLastChild, View convertView, ViewGroup parent) { 

String child = childList[groupPosition][childPosition]; 

    if(child.equalsIgnoreCase("none")){ 
     ImageView i = new ImageView(context); 
     i.setImageResource(R.drawable.blank_image_for_view_business); 
     i.setPadding(0, 0, 0, 0); 
     return i ;   
    } 
     else if(child.startsWith("http")){ 
     imgView = new ImageView(context); 
     new asyTask(); 
     return imgView; 
    }else{ 
     TextView tv = new TextView(context); 
     tv.setText(childList[groupPosition][childPosition]); 
     tv.setPadding(30, 0, 0, 0); 
     return tv; 
    } 
} 

private Drawable LoadImageFromWeb(String url){ 
     try{ 
      InputStream is = (InputStream) new URL(url).getContent(); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     }catch (Exception e) { 
      System.out.println("Exc="+e); 
      return null; 
     } 
} 

И это мой асинхронный класс:

private class asyTask extends AsyncTask<String, Void, Integer> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //show a progress bar 
    } 


    @Override 
    protected void onPostExecute(Integer result) { 
     super.onPostExecute(result); 
     imgView.setImageDrawable(drawable); 
    } 

    @Override 
    protected Integer doInBackground(String... params) { 
     drawable = LoadImageFromWeb("http://www.ettinger.co.uk/var/ezflow_site/storage/images/collections/ettinger/ettinger-walkie-pen/lifestyle-navy-walkie-pen/navy-walkie-pen-gallery/wlkp_pens_navy-2/20569-2-eng-GB/wlkp_pens_navy-2.jpg"); 
     return 0; 
    } 

На данный момент в раздвижном списке я могу видеть только изображения из растяжимой папки и TextView, но нет изображений из Интернета. В чем проблема ?

+0

У вас есть разрешение на использование в вашем AndroidManifest.xml? Также вы должны использовать обработчик для установки drawable для изображения. –

+0

да, у меня есть разрешение на интернет. Как обработчик может помочь в этой ситуации? можете ли вы привести пример? – Asqan

+0

Поскольку вы находитесь в другом потоке, кроме основного потока, вы не можете установить drawable. просто определите новый обработчик, прикрепленный к потоку пользовательского интерфейса, или вы можете использовать runonmainthread. activity.runOnUiThread (новый Runnable() { @Override общественности недействительным запуска() { // Ваш код выполняется в GUI потоке здесь } }); –

ответ

0

Я исправил его!

getChildView():

....  
else if (child.startsWith("http")) {  
    Drawable image = ImageOperations(context,child,"image.jpg"); 
    ImageView imgView = new ImageView(context); 
    imgView.setImageDrawable(image); 
    imgView.setPadding(0, 0, 0, 0); 
    return imgView; 
    }.... 

Это вызывает следующие методы:

private Drawable ImageOperations(Context ctx, String url, String saveFilename) { 
    try { 
     InputStream is = (InputStream) this.fetch(url); 
     Drawable d = Drawable.createFromStream(is, "src"); 
     return d; 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

public Object fetch(String address) throws MalformedURLException,IOException { 
    URL url = new URL(address); 
    Object content = url.getContent(); 
    return content; 
} 

Таким образом, нет необходимости создавать другие частные занятия, чтобы показать изображения из Интернета в классе ExpandableListAdapter , Оно работает.

Смежные вопросы