Android 查看可展开列表中的图像列表

Android 查看可展开列表中的图像列表,android,multithreading,image,android-asynctask,expandablelistview,Android,Multithreading,Image,Android Asynctask,Expandablelistview,我已经做了一个可扩展的列表,其中孩子的(子项)显示可绘图文件夹或文本中的图像 我想对来自网络的图像做同样的事情。因此,我也使用asynctask来避免 此代码位于我的ExpandableListAdapter中,我在其中初始化项和子项。Drawable和ImageView是全局定义的,因此所有函数都可以访问它们,而无需作为参数发送 Drawable drawable; ImageView imgView; @Override public View getChildView(int grou

我已经做了一个可扩展的列表,其中孩子的(子项)显示可绘图文件夹或文本中的图像

我想对来自网络的图像做同样的事情。因此,我也使用asynctask来避免

此代码位于我的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;
    }
私有类asyTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//显示进度条
}
@凌驾
受保护的void onPostExecute(整数结果){
super.onPostExecute(结果);
imgView.setImageDrawable(可绘制);
}
@凌驾
受保护的整数doInBackground(字符串…参数){
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"); 
返回0;
}
目前,在可展开列表中,我只能看到来自drawable文件夹和textview的图像,但没有来自internet的图像。有什么问题吗?

我已经解决了

getChildView():

这将调用以下方法:

    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类中显示来自internet的图像。它可以工作。

您的AndroidManifest.xml中是否具有internet权限?您还应该使用处理程序来设置imageview的可绘制性。是的,我具有internet权限。在这种情况下,处理程序如何提供帮助?你能举个例子吗?因为你在一个不同于主线程的线程中,你不能设置可绘制的。只需定义一个附加到UI线程的新处理程序,或者你可以使用runonmainthread.activity.runOnUiThread(new Runnable(){@Override public void run(){//你的代码在这里运行在GUI线程中});
    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;
}