我正在使用 Glide 加載 URL 串列,如下所示:
@Override
public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) {
Glide.with(context)
.load(arrayList.get(position))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.transparent_icon)
.override(Constants.THUMBNAIL_SIZE, Constants.THUMBNAIL_SIZE)
.fitCenter()
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
isBrokenUrl = true;
arrayList.remove(holder.getBindingAdapterPosition()); //ISSUE IS HERE
notifyItemRangeChanged(holder.getBindingAdapterPosition(), getItemCount());
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
isBrokenUrl = false;
return false;
}
}).into(holder.image);
holder.image.setOnClickListener(v -> itemStringClickListener.onItemClicked(arrayList.get(position)));
}
在串列中有一個損壞的 URL,我想從以下位置洗掉帶有這些損壞 url 的專案RecyclerView:
arrayList.remove(holder.getBindingAdapterPosition());
notifyItemRangeChanged(holder.getBindingAdapterPosition(), getItemCount());
它的作業,但如果我滾動太快,應用程式崩潰:
com.bumptech.glide.load.engine.CallbackException: Unexpected exception thrown by non-Glide code
at com.bumptech.glide.load.engine.EngineJob.callCallbackOnLoadFailed(EngineJob.java:175)
at com.bumptech.glide.load.engine.EngineJob$CallLoadFailed.run(EngineJob.java:402)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7889)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=109; index=-1
at java.util.ArrayList.remove(ArrayList.java:506)
at maa.utils.adapters.SearchedStickersAdapter$1.onLoadFailed(SearchedStickersAdapter.java:63)
at com.bumptech.glide.request.SingleRequest.onLoadFailed(SingleRequest.java:683)
at com.bumptech.glide.request.SingleRequest.onLoadFailed(SingleRequest.java:651)
at com.bumptech.glide.load.engine.EngineJob.callCallbackOnLoadFailed(EngineJob.java:173)
at com.bumptech.glide.load.engine.EngineJob$CallLoadFailed.run(EngineJob.java:402)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7889)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
uj5u.com熱心網友回復:
代碼失敗,因為 getBindingAdapterPosition 回傳 -1。該視圖持有者不受任何位置的約束。看起來你正在嘗試在這里做一些異步的事情。如果是這樣,您不應該將視圖持有者或其中的任何視圖傳遞給任何回呼。相反,您應該在進行異步呼叫時傳遞該索引處的位置和/或資料項,而不是在回呼期間查詢持有者。這是因為系結可以在那時和回呼發生時發生變化。如果您不這樣做,即使它“有效”,它也可能對錯誤的索引執行操作。
實際上,由于您是在 onBindViewHolder 中執行此操作,因此將其替換為僅position在您使用它的兩個地方都可以使其作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352780.html
