4

I'm a beginning programmer. I'm trying use Universal image loader to display images parsed from site, but it is not work. What am I doing wrong?

Thanks.

This is a test programm.

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();
    }
}
}

Custom adater I get an error here

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;
}
}

Log

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)
Azat-777
  • 95
  • 1
  • 10

4 Answers4

8

you should add this code

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

in your constructor of myAdapter. and also checks the id of imageview, is it correct or at right place where you are referencing it to

holder.img = (ImageView) convertView.findViewById(R.id.image);
Lalit Poptani
  • 67,150
  • 23
  • 161
  • 242
skygeek
  • 1,548
  • 11
  • 24
6

Just add

imageLoader = ImageLoader.getInstance();

to myAdapter constructor.

nostra13
  • 12,377
  • 3
  • 33
  • 43
0

Within adpater you forgot to initialize imageloader class, its only cause NullPointerException.

initialize it:

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

Updated@ replace below sort of code within your 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());
}
RobinHood
  • 10,897
  • 4
  • 48
  • 97
  • I don't understand. How to initialize it? `The constructor ImageLoader() is not visible` – Azat-777 Jan 16 '13 at 06:44
  • check again, i change some sort of things, and let me know whether its work or not. – RobinHood Jan 16 '13 at 06:56
  • A similar error + if i change the constructor in my adapter i get error in MainActivity `The constructor myAdapter(MainActivity, int, ArrayList) is undefined`. Thanks, i thinks resolved my problem :) – Azat-777 Jan 16 '13 at 07:01
  • its context issue, pass appropriate context,[check this](http://stackoverflow.com/a/12172733/646806) now you should dig your code and trace what sort of thing you missing. – RobinHood Jan 16 '13 at 07:06
0

A couple of observations:

  1. As already pointed out by @RobinHood in his solution, you will need to initialize the imageLoader instance in the adapter.

  2. You have declared and instance: DisplayImageOptions options; but are not configuring it in the Adapter where it will be used. You options are configured in the MainActivity.

If you look at the example here: https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/sample/src/com/nostra13/example/universalimageloader/ImageListActivity.java, you will notice that the Activity here, extends BaseActivity (you extend ListActivity) which has an instance of the imageLoader already initialized.

If you had the adapter (myAdapter) class in your activity (MainActivity), it would have been alright.

Fix these, and it will be good.

Siddharth Lele
  • 27,623
  • 15
  • 98
  • 151