使用Recyclerview展示一系列圖片。使用fresco加載。
為了讓imageView自適應圖片寬高比,所以fresco設定了DraweeController 計算大小。
這段程式碼在target Sdk version 17的情況下,是能正常運作,圖片可以正常顯示。例如5張圖按順序一一展示。
後來我設定target sdk version 25,代碼未更改的情況下,5張圖都有執行加載,但是5張圖的位置疊加到一起,只能看到一張圖片。我改為target sdk version 17又能正常運作了。 。 。
求教這是什麼情況。畢竟android O都出來了。 。 。 。
佈局檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/activity_circle_details"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/white"
>
<TextView
android:id="@+id/test_item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="17sp"
android:layout_margin="5dp"
android:lineSpacingMultiplier="1.5"
android:textColor="@color/black"
/>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/test_item_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:layout_marginBottom="5dp"
fresco:placeholderImage="@mipmap/img_empty"
fresco:placeholderImageScaleType="fitCenter"
fresco:failureImage="@mipmap/img_error"
/>
</LinearLayout>
RecyclerView.Adapter在onBindViewHolder中呼叫的關鍵程式碼。 data是bean,getImage取得圖片url
#if(data.getImage()!=null && data.getImage().length()>0) {
imageView.setVisibility(View.VISIBLE);
//imageView.setImageURI(data.getImage());
setControllerListener(imageView, data.getImage(),Tools.getScreenWidth(CircleDetailsActivity.this));
Fresco的程式碼
/***
* 根据图片大小,更新view的大小自适应图片,按宽高比缩放
* 不知道为什么。targetVersion必须为4.2. 如果我设置为7.1则会发生图像覆盖的现象只能看到最后一张图
* @param simpleDraweeView
* @param imagePath
* @param imageWidth
*/
public static void setControllerListener(final SimpleDraweeView simpleDraweeView, String imagePath, final int imageWidth) {
final ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams();
ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {
if (imageInfo == null) {
return;
}
int height = imageInfo.getHeight();
int width = imageInfo.getWidth();
layoutParams.width = imageWidth;
layoutParams.height = (int) ((float) (imageWidth * height) / (float) width);
simpleDraweeView.setLayoutParams(layoutParams);
}
@Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
Log.d("TAG", "Intermediate image received");
}
@Override
public void onFailure(String id, Throwable throwable) {
throwable.printStackTrace();
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder().setControllerListener(controllerListener).setTapToRetryEnabled(true).setUri(Uri.parse(imagePath)).build();
simpleDraweeView.setController(controller);
}
套件引用
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.facebook.fresco:fresco:0.13.0'
compile 'com.squareup.okhttp3:okhttp:3.7.0'
compile 'com.facebook.fresco:animated-gif:0.13.0'
compile 'com.facebook.fresco:imagepipeline-okhttp3:0.13.0+'
compile 'com.android.support:recyclerview-v7:25.3.1'
compile 'com.android.support:percent:25.3.1'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:support-v4:25.3.1'