我是一名初学者。 我正在尝试使用通用图像加载器来显示从站点解析的图像,但它不起作用。我做错了什么?
感谢。
这是一个测试程序。
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();
}
}
}
自定义广告 我在这里收到错误
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)
答案 0 :(得分:8)
你应该添加这段代码
imageLoader = ImageLoader.getInstance();
imageLoader.init(ImageLoaderConfiguration.createDefault(c));
在myAdapter的构造函数中。 并检查imageview的id,是正确的还是在你引用它的正确位置
holder.img = (ImageView) convertView.findViewById(R.id.image);
答案 1 :(得分:6)
添加
imageLoader = ImageLoader.getInstance();
到myAdapter
构造函数。
答案 2 :(得分:0)
在adpater
内,您忘记初始化imageloader
课程,这是唯一原因NullPointerException
。
初始化它:
imageLoader=new ImageLoader(activity.getApplicationContext());
在您的adpater中更新了@ replace以下的代码。
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());
}
答案 3 :(得分:0)
有几点意见:
正如 @RobinHood 在其解决方案中已经指出的那样,您需要初始化适配器中的imageLoader
实例 。
您已声明并实例:DisplayImageOptions options;
但未在Adapter
中对其进行配置。您可以在MainActivity
。
如果您查看此处的示例:https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/sample/src/com/nostra13/example/universalimageloader/ImageListActivity.java,您会注意到此处的活动,扩展了BaseActivity
(您扩展ListActivity
),其中已经初始化了imageLoader的实例。
如果你的活动(MainActivity)中有适配器(myAdapter
)类,那就没问题了。
修复这些问题,这样会很好。