0

我想在我的 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 的答案

所以你也可以看到,我必须再次使用 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,我只是想知道是不是因为这样:

  1. 我从 jsonData 获取 urlStrings,然后
  2. 一张一张地从 urlStrings 下载图片。

我的意思是我连接到 REST 两次。我也在使用 aHandler这可能不是一个好的选择,但实际上我用 a 测试了它AsyncTask并且我遇到了同样的问题。

我感谢任何可以解决我的问题的想法。

附加物:

当我快速滚动列表时,我发现图像加载不正确,否则很好。

4

3 回答 3

0

从这里使用UniversalImageLoader库。它几乎没有错误。做内存处理,线程和所有其他的东西。

整合需要 2 分钟。试试看 !

于 2013-04-19T08:11:14.797 回答
0

好家伙!!每次下载图像时,您都在设置列表适配器。我建议您使用 androids 教程来使用列表视图,然后使用带有延迟图像加载的列表视图。

列表显示

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

图像处理

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

于 2013-04-19T08:15:20.783 回答
0

我通过为我的 ListView 实现 OnScrollListener 解决了我的问题,并在滚动处于空闲模式时下载图像。但我认为正确的方法是在延迟加载实现中不获取图片url,也许图片url需要包含在main Object中。

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;
        }
    }
});
于 2013-04-22T10:00:32.150 回答