我想在ListView中实现一个延迟加载图像。首先,我需要连接到一个url并获取属于一个对象的所有图像的urlStrings。我得到一个jsonString,然后解析:
String RESTUrl = new MasterdataDataProvider(mContext).getSyncServicePath() + "PhotoInfo/" + objectEntryID;
List<String> urlStrings = new ArrayList<String>();
try {
HttpGet httpGet = new HttpGet((RESTUrl + "/" + token));
HttpParams httpParameters = new BasicHttpParams();
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
httpGet.addHeader("Accept", "application/json");
httpGet.addHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(httpGet);
String jsonData = EntityUtils.toString(response.getEntity());
if (!jsonData.equals("[]")) {
GsonPhotoInfo x = new GsonPhotoInfo(new GsonBuilder());
PhotoInfo[] info = x.parseJSON(jsonData);
for(PhotoInfo p : info) {
System.out.println(p.getFileName());
urlStrings.add(photoWebURL + objectDefID + "/" + objectEntryID + "/" + p.getFileName());
}
}
} catch(Exception e) {
e.printStackTrace();
}
正如您在此段代码中看到的,我获取了FileName from jsonData
。
然后我需要从urlStrings下载图片:
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
ImagePagerAdapter adapter = new ImagePagerAdapter((Drawable[]) message.obj);
viewPager.setAdapter(adapter);
}
};
Thread thread = new Thread() {
@Override
public void run() {
//PARSE THE JSON DATA and FETCH URLStrings (as you see in the piece of code at top)
Drawable[] drawables = new Drawable[urlStrings.size()];
for(int i=0; i< urlStrings.size(); i++)
drawables[i] = fetchDrawable(urlStrings.get(i));
Message message = handler.obtainMessage(1, drawables);
handler.sendMessage(message);
}
};
thread.start();
获取图片的代码取自James Wilson answer。
因此,您也可以在那里看到,我必须再次使用HTTPClient来下载每个图像:
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
问题是它在我的listView中无效。 The images are not loaded correctly in listView sometimes
,我只是想知道这是因为:
我的意思是我连接两次REST。我也使用Handler
这可能不是一个好选择,但实际上我用AsyncTask
进行了测试,我遇到了同样的问题。
我很感激任何可以解决我问题的想法。
附录
当我在列表中滚动速度非常快时,我发现图像加载不正确,否则就可以了。
答案 0 :(得分:0)
使用here中的UniversalImageLoader
库。它几乎没有错误。内存处理,线程和所有其他内容。
需要2分钟才能整合。试试看 !
答案 1 :(得分:0)
哦,小伙子!每次下载图像时都要设置列表适配器。我建议你使用orroids教程使用列表视图,然后使用延迟图像加载listview。
列表视图
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
图像处理
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
答案 2 :(得分:0)
我通过为ListView实现OnScrollListener解决了我的问题,并在滚动处于空闲模式时下载图像。但我认为正确的方法是在延迟加载实现中获取图像URL,也许图像URL需要包含在主对象中。
public static boolean scroll_is_idle = true;
mListView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { }
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
scroll_is_idle = true;
mAdapter.notifyDataSetChanged();
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
scroll_is_idle = false;
break;
case OnScrollListener.SCROLL_STATE_FLING:
scroll_is_idle = false;
break;
}
}
});