una - mostrar imagen en imageview android
Cómo establecer el recurso de imagen en ImageView usando DataBinding (10)
Esta pregunta ya tiene una respuesta aquí:
¿Cómo podemos utilizar el enlace de datos en Android para poner recursos de imágenes en un ImageView
?
<ImageView
android:id="@+id/is_synced"
android:src="@{model.pending ? @mipmap/pending: @mipmap/synced}"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Quiero una imagen si está pendiente y otra imagen si está pendiente es falsa. Pero muestra un error. ¿Cómo puedo lograr esta funcionalidad?
De acuerdo con este gran artículo: carga de imágenes con enlace de datos y Picasso
Hay dos maneras de hacerlo:
- Usando
@BindingAdapter
-
ObservableField
y objetivo personalizado de Picasso
En Android Developers reference Data Binding Guide , encontrará solo el primero.
Por favor lea ambos artículos.
Más información:
- http://www.mutualmobile.com/posts/using-data-binding-api-in-recyclerview
- https://blog.stylingandroid.com/data-binding-part-3/
Espero que ayude
El problema es con todos los atributos que tienen los setters con el mismo nombre. por ejemplo, android: x no funcionará si el método setX () no está en esa vista; si tuviéramos el método setSrc () en ImageView, su código habría funcionado sin un adaptador de enlace personalizado
Intenté esto, y funciona para mí (buildToolsVersion: 24.0.1):
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="8dp"
android:scaleType="centerInside"
app:imageResource="@{item.avatarResId}"/>
simplemente use la app:imageResource
para reemplazar a android:src
, android:src="@{item.avatarResId}"
no funciona, defina un @BindAdapter("android:src")
personalizado @BindAdapter("android:src")
para ello.
pero use la app:imageResource
no necesita definir un @BindAdapter
adicionalmente, porque ImageView tiene un método llamado setImageResource()
, cuando usa la app:imageResource
, llamará a setImageResource()
automáticamente.
La answer :
definir:
@BindingAdapter({"android:src"})
public static void setImageViewResource(ImageView imageView, int resource) {
imageView.setImageResource(resource);
}
utilizar:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="center"
android:src="@{viewModel.imageRes, default=@drawable/guide_1}"/>
Más detalles Consulte aquí Details Carga de imágenes con enlace de datos y Picasso
public class ProfileViewModel {
// The URL will usually come from a model (i.e Profile)
static final String IMAGE_URL = "http://cdn.meme.am/instances/60677654.jpg";
public ObservableField<Drawable> profileImage;
private BindableFieldTarget bindableFieldTarget;
public ProfileViewModel(Context context) {
profileImage = new ObservableField<>();
// Picasso keeps a weak reference to the target so it needs to be stored in a field
bindableFieldTarget = new BindableFieldTarget(profileImage, context.getResources());
Picasso.with(context)
.load(IMAGE_URL)
.placeholder(R.drawable.placeholder)
.into(bindableFieldTarget);
}
public class BindableFieldTarget implements Target {
private ObservableField<Drawable> observableField;
private Resources resources;
public BindableFieldTarget(ObservableField<Drawable> observableField, Resources resources) {
this.observableField = observableField;
this.resources = resources;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
observableField.set(new BitmapDrawable(resources, bitmap));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
observableField.set(errorDrawable);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
observableField.set(placeHolderDrawable);
}
}
}
Puede hacerlo sin hacer nada programáticamente si su modelo de datos contiene el ID de recurso de la imagen.
Ejemplo:
<layout>
<data>
<import type="android.support.v4.content.ContextCompat" />
<variable
name="roomInfoItem"
type="com.example......model.RoomInfoModel" /> </data>
<RelativeLayout>
<ImageView
android:id="@+id/iv_room_info_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
</layout>
Simplemente agregue la siguiente línea a su imageView (no pude formatear el código cuando lo estaba agregando allí):
android:src="@{ContextCompat.getDrawable(context,roomInfoItem.resId)}"
donde resId
contiene R.drawable.your_image_name
Si desea pasar una discusión al método como @IdRes, puede usar
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="<package name>.R" />
</data>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:load_image="@{R.drawable.image}" />
</layout>
@BindingAdapter("load_image")
public static void loadImage(ImageView view, @IdRes int imageId) {
//Logic
}
Tal vez su lectura here y recordar que los viejos sistemas no pueden manejarlo
establecer una imagen como esta,
<ImageView
android:layout_width="28dp"
android:layout_height="28dp"
android:src="@{model.isActive ? @drawable/white_activated_icon :@drawable/activated_icon}"
tools:src="@mipmap/white_activated_icon" />
<ImageView ...
app:svg="@{@drawable/ic_car_placeholder}" />
entonces
@BindingAdapter({"app:svg"})
public static void setImageViewResource(ImageView imageView, Drawable resource) {
imageView.setBackgroundDrawable(resource);
}