Utilisez Recyclerview pour afficher une série d'images. Utilisez la fresque pour charger.
Afin d'adapter imageView au rapport hauteur/largeur de l'image, fresco configure DraweeController pour calculer la taille.
Ce code peut fonctionner normalement lorsque la version 17 du Sdk cible est utilisée et les images peuvent être affichées normalement. Par exemple, 5 images sont affichées une par une dans l'ordre.
Plus tard, j'ai défini la version 25 du SDK cible. Sans changer le code, les 5 images ont été chargées. Cependant, les positions des 5 images étaient superposées et une seule image pouvait être vue. J'ai changé pour cibler la version 17 du SDK et cela a de nouveau fonctionné normalement. . .
S'il vous plaît, dites-moi ce qui se passe. Après tout, Android O est sorti. . . .
Fichier de mise en page
<?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>
Le code clé appelé par RecyclerView.Adapter dans onBindViewHolder. les données sont un bean, getImage obtient l'URL de l'image
if(data.getImage()!=null && data.getImage().length()>0) {
imageView.setVisibility(View.VISIBLE);
//imageView.setImageURI(data.getImage());
setControllerListener(imageView, data.getImage(),Tools.getScreenWidth(CircleDetailsActivity.this));
Le code de la fresque
/***
* 根据图片大小,更新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);
}
Devis de forfait
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'
Cela devrait être un problème de mise en page. Impossible d'imbriquer scrollView dans scrollView