在Kotlin成功后滑行回调

private SimpleTarget target = new SimpleTarget() { @Override public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { // do something with the bitmap // for demonstration purposes, let's just set it to an ImageView imageView1.setImageBitmap( bitmap ); } }; private void loadImageSimpleTarget() { Glide.with(context) .load(uri) .override(600, 600) .fitCenter() .into(target); } 

我试图把它转换成Kotlin,如下所示。

 val finish_target = object : SimpleTarget() { override fun onResourceReady(bitmap: Bitmap?, glideAnimation: GlideAnimation?) { preview_image.setImageBitmap(bitmap) } } Glide.with(context) .load(uri) .override(600, 600) .fitCenter() .into(finish_target) 

但编译错误表明

 public open fun <Y : Target!> into(target: (???..???)): (???..???) defined in com.bumptech.glide.DrawableRequestBuilder public open fun into(view: ImageView!): Target! defined in com.bumptech.glide.DrawableRequestBuilder 

请帮助我如何解决这个问题。

问题是在Java代码中,您使用了SimpleTargettypes作为target的types。 这是一个原始types(缺少generics参数),是Javagenerics中最大的遗留问题之一。 Kotlin不允许原始types,这就是为什么你在转换时遇到问题。

要解决这个问题,您应该在Java中执行以下操作:

 private SimpleTarget target = new SimpleTarget() { ... } 

这将迫使你添加asBitmap()到你的Glide调用中:

 Glide.with(context) .load(uri) .asBitmap() .override(600, 600) .fitCenter() .into(target); 

现在,您的代码安全地使用generics,可以毫无问题地将其转换为Kotlin:

 Glide.with(context) .load(uri) .asBitmap() .override(600, 600) .fitCenter() .into>(target) 

如果您只想使用GlideBitmap设置到ImageView中,那么您可以尝试在Kotlin中使用扩展function ,只需要传递像uri/url or size这样的参数。

例如:

 class KotlinActivity : AppCompatActivity() { var sampleImageView : ImageView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_kotlin) sampleImageView = findViewById(R.id.imageView) as ImageView? sampleImageView?.setImage("android/sample-3.jpg") } //Extension function for ImageView fun ImageView.setImage(url:String, context:Context){ Glide.with(context).load(url).into(this) } } 
  Glide.with(context) .load(url) .listener(object : RequestListener { override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target?, p3: Boolean): Boolean { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target?, p3: DataSource?, p4: Boolean): Boolean { Log.d(TAG, "OnResourceReady") //do something when picture already loaded return false } }) .into(imgView) 

通过Glide,您可以将Listener添加到您的链中,该链监视图像加载的状态。 你必须重写两个方法,在onResourceReady方法你有回调,你的图像已经加载,你可以做一些事情,例如隐藏加载器或从其他视图完成animation。 在onLoadFailed中,您可以在加载时获得关于某个错误的信息,也可以以某种方式作出反应。 这样你可以避免这些错误。

对于那些正在使用Glide 3.8

  Glide.with(this) .load(imgUrl) .listener(object : RequestListener { override fun onException(e: Exception?, model: String?, target: Target?, isFirstResource: Boolean): Boolean { return false } override fun onResourceReady(resource: GlideDrawable?, model: String?, target: Target?, isFromMemoryCache: Boolean, isFirstResource: Boolean): Boolean { return false } }) .into(image)