2016-07-07 2 views
0

Я использую Glide для загрузки изображений в Recyclerview (onBindViewHolder) с обратным вызовом RequestListener. всякий раз, когда изображение загружается, первая ссылка будет храниться в файле SharedPreferences с именем key. теперь я хочу передать имя в RequestListener в качестве аргумента. как передать имя в качестве аргумента в RequestListener? И мне также нужно передать ImageView, чтобы я мог загрузить метод onException в случае сбоя загрузки.Передача аргументов в RequestListener Glide

Код:

метод onBindViewHolder:

@Override 
    public void onBindViewHolder(final ContactsAdapter.ContactsViewHolder holder, int position) { 

     final ContactInfo current = cDataset.get(position); 
     holder.contactName.setText(current.Contact_name); 
     //current.Conatct_name has to be passed to requestListener 
     URL url = Util.getSignedUrl(getContext().getApplicationContext(), current.phone_number.concat("/").concat("profile").concat("/").concat(current.phone_number).concat(".jpg")); 

     if (url != null) { 

      Log.d("image", url.toString()); 
      Glide.with(getContext()).load(url.toString()).skipMemoryCache(true).fitCenter().diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(requestListener).error(R.mipmap.ic_launcher).into(holder.contactProfileImage); 

     } else { 
      Log.d("image", "null"); 
     } 

    } 

RequestListener:

 public RequestListener<String, GlideDrawable> requestListener = new RequestListener<String, GlideDrawable>() { 
     @Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 

      Log.d("No Image",String.valueOf(e)); 

       Log.d("Loading from cache","true"); 


      return true; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
      Log.d("storing cache ","true"); 

     return false; 
     } 
    }; 

ответ

1

В этом случае представляется целесообразным создать класс, назовем его CustomRequestListener и реализует RequestListener<String, GlideDrawable> - добавить конструктор до CustomRequestListener, который принимает String key и ImageView. CustomRequestListener может быть даже внутренним классом. Вот пример кода:

private class CustomRequestListener implements RequestListener<String, GlideDrawable>{ 
//variables to hold the arguments you will be passing to the constructor 
private String key; 
private ImageView imageView; 

//constructor taking the arguments as you desire 
public CustomRequestListener(String _key, ImageView defaultImageView){ 
    this.key = _key; 
    this.imageView = defaultImageView 
} 

//the rest of your code goes here 
@Override 
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { 

      Log.d("No Image",String.valueOf(e)); 
      Log.d("Loading from cache","true"); 
      //you can now load the "default" imageView here... 

      return true; 
     } 

     @Override 
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { 
     Log.d("storing cache ","true"); 
     //here you can save the URL into the SharedPreference - using the "key" variable as its key. Example: 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
     Editor editor = prefs.edit(); 
     editor.putString(key, theURL); 
     editor.apply(); 

     return false; 
     } 

}; 

Затем использовать собственный слушатель, вы сделать что-то вроде этого:

Glide.with(getContext()).load(url.toString()).skipMemoryCache(true).fitCenter().diskCacheStrategy(DiskCacheStrategy.SOURCE).listener(new CustomRequestListener (someKey, someImageView).... 

См some good examples of using RequestListener

Я надеюсь, что это помогает.

Смежные вопросы