如何在自定义适配器中使用ImageRequest?

时间:2015-08-10 13:00:50

标签: android asynchronous android-volley basic-authentication

我正在尝试从服务器检索一些图片,以便用结果填充GridView。为此,我有一个自定义适配器,其中我想下载图片并将其设置为ImageButton小部件的位图。我正在使用Volley库中的ImageRequest,并且还需要基本身份验证,这是我无法弄清楚如何做的。这是自定义适配器的代码:

public View getView(int position, View convertView, ViewGroup parent) {
    final boolean loaded = false;
    currentMarque = getItem(position);
    String url = "https://uriToServer";

    currentMarque.setImageUrl(url + currentMarque.getId());

    if (convertView == null)
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.brand_gridcell_layout, parent, false);

    currentImageBtn = (ImageButton) convertView.findViewById(R.id.brandImageBtn);

    ImageRequest request = new ImageRequest(currentMarque.getImageUrl(),
            new Response.Listener<Bitmap>() 
            {
                @Override
                public void onResponse(Bitmap bitmap) 
                {
                    currentImageBtn.setImageBitmap(bitmap);
                }

            }, 0, 0, null,
            new Response.ErrorListener() 
            {

                @Override
                public void onErrorResponse(VolleyError arg0) 
                {

                }

            }){

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<String, String>();
                    String auth = "Basic " + Base64.encodeToString((GlobalVariables.getInstance().getWS_KEY()+":").getBytes(),
                                    Base64.NO_WRAP);
                    headers.put("Authorization", auth);
                    return headers;
                }
            };
            GlobalVariables.getInstance().addToRequestQueue(request); 


    return convertView;
}

问题是ImageRequest是一个异步请求,我们不知道何时会得到响应,因此 ConvertView 在呼叫结束前返回。有没有办法等到请求完成?

1 个答案:

答案 0 :(得分:0)

您应该使用ImageRequest而不是NetworkImageView。使用后者,您可以在相应网址的图像到来时放置图像。它完美地适用于适配器并使用缓存。看看这个例子:

进入xml

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/networkImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:background="#000000"/>

进入java类:

NetworkImageView _networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);

_networkImageView.setImageUrl(url, AppControllerImage.getInstance().getImageLoader());
_networkImageView.setDefaultImageResId(R.drawable.notfound);
_networkImageView.setErrorImageResId(R.drawable.notfound);

以下网站与我发布的示例略有不同,但您可以获得更多信息:http://cypressnorth.com/mobile-application-development/setting-android-google-volley-imageloader-networkimageview/