2013-01-16 108 views
4

我是一个开始的程序员。 我试图使用通用图像加载器来显示从网站解析的图像,但它不工作。我究竟做错了什么?通用图像加载器不工作

谢谢。

这是一个测试程序。

package com.example.imageloader; 

public class MainActivity extends ListActivity { 

private final String URL = "Site_URL"; 
private ArrayList<Order> listItems = null; 
private myAdapter myAdapter; 
private ProgressDialog pd; 
ImageLoader imageLoader;  
DisplayImageOptions options;  
String imgSrc; 
ListView lv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listItems = new ArrayList<Order>(); 
    this.myAdapter = new myAdapter(this, R.layout.list_item, listItems); 
    setListAdapter(this.myAdapter); 

    new Parse().execute(URL); 

    lv = getListView(); 

    imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(ImageLoaderConfiguration.createDefault(MainActivity.this)); 

    options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.ic_launcher) 
    .showImageForEmptyUri(R.drawable.ic_launcher) 
    .cacheOnDisc() 
    .cacheInMemory() 
    .build(); 
} 


private class Parse extends AsyncTask<String, Integer, ArrayList<Order>> { 
    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(MainActivity.this); 
     pd.setMessage("Loading"); 
     pd.show(); 
    } 

    @Override 
    protected ArrayList<Order> doInBackground(String... urls) { 
     listItems.clear();    
     try { 
      Document doc = Jsoup.connect(URL).get(); 
      Elements img = doc.select("img"); 
      for (Element src : img) { 
       String imgSrc = src.attr("src"); 

       System.out.println(imgSrc);       

       Order o = new Order(); 
       o.setLink(imgSrc); 
       o.setTextName(imgSrc); 
       listItems.add(o);     
      }    

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return listItems; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Order> listItems) { 
     myAdapter = new myAdapter(MainActivity.this, R.layout.list_item, listItems); 
     setListAdapter(myAdapter); 
     myAdapter.notifyDataSetChanged(); 
     pd.dismiss(); 
    } 
} 
} 

定制adater 我这里

package com.example.imageloader; 

public class myAdapter extends ArrayAdapter<Order> { 

private LayoutInflater lInflater; 
private ArrayList<Order> data; 
DisplayImageOptions options; 
ImageLoader imageLoader; 
private Order o; 
String imgSrc; 

public myAdapter(Context c, int listItem, ArrayList<Order> data) { 
    super(c, listItem, data); 
    this.data = data; 
    lInflater = LayoutInflater.from(c); 
} 

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder = null; 

    if (convertView == null) { 
     convertView = lInflater.inflate(R.layout.list_item, null); 
     holder = new ViewHolder(); 
     holder.img = (ImageView) convertView.findViewById(R.id.image); 
     holder.textName = (TextView) convertView.findViewById(R.id.text); 
     convertView.setTag(holder); 

     holder.textName.setOnClickListener(new OnItemClickListener(position)); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    o = data.get(position); 
    holder.textName.setText(o.getTextName()); 
    holder.img.setTag(o); 

     try { 
      imageLoader.displayImage(o.getLink(), holder.img, options); // NullPointerException here! 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
    } else {    
     return null;    
    } 
    return convertView; 


static class ViewHolder { 
    ImageView img; 
    TextView textName; 
} 
} 

得到一个错误日志

01-16 11:55:04.480: W/System.err(19105): java.lang.NullPointerException 
01-16 11:55:04.496: W/System.err(19105): at   com.example.imageloader.myAdapter.getView(myAdapter.java:62) 

回答

8

你应该在你的myAdapter构造函数中添加此代码

imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(ImageLoaderConfiguration.createDefault(c)); 

。 还检查的ImageView的ID,它是正确的或正确的地方,你是它引用到

holder.img = (ImageView) convertView.findViewById(R.id.image); 
1

在你忘了初始化imageloader类,它的唯一原因NullPointerException

初始化:

imageLoader=new ImageLoader(activity.getApplicationContext()); 

更新@你adpater内更换整理以下的代码。

public class myAdapter extends ArrayAdapter<Order> { 

private LayoutInflater lInflater; 
private ArrayList<Order> data; 
DisplayImageOptions options; 
ImageLoader imageLoader; 
private Order o; 
String imgSrc; 
private Activity activity; 

public myAdapter(Activity a, int listItem, ArrayList<Order> data) { 
    super(c, listItem, data); 
    this.data = data; 
    activity = a; 
    lInflater = LayoutInflater.from(c); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 
} 
+0

我不明白。如何初始化它?'构造函数ImageLoader()不可见' –

+0

检查它,我更新了我的答案。 – RobinHood

+0

不工作'构造函数ImageLoader(Context)未定义' –

0

一对夫妇的意见:

  1. 正如已经指出@RobinHood在他的解决方案中,您需要在适配器中初始化imageLoader实例

  2. 您已申报实例:DisplayImageOptions options;,但未将其配置为使用Adapter。您的选项在MainActivity中配置。

如果你看看这里的例子:https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/sample/src/com/nostra13/example/universalimageloader/ImageListActivity.java,你会发现,这里的活动,扩展BaseActivity它已经初始化的ImageLoader的实例(您扩展ListActivity)。

如果您的活动(MainActivity)中有适配器(myAdapter)类,那就没问题了。

修复这些,它会很好。

6

只需添加

imageLoader = ImageLoader.getInstance(); 

myAdapter构造。

+0

Ага,спасибо。 Ужесделалтак。所有的东西。 –

+1

Тогдапометьтекак“ответ”。 – NOSTRA

相关问题