2016-01-05 15 views
28

Come possiamo utilizzare l'associazione dati in Android per inserire la risorsa immagine in un ImageView?Come impostare la risorsa Immagine su ImageView usando DataBinding

<ImageView 
      android:id="@+id/is_synced" 
      android:src="@{model.pending ? @mipmap/pending: @mipmap/synced}" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

Voglio un'immagine se il pending è vero e un'altra immagine se in sospeso è falsa. Ma sta mostrando errore. Come posso ottenere questa funzionalità?

risposta

15

immagine Insieme come questo,

<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" /> 
0

Forse la vostra lettura here e ricorda che i vecchi sistemi non possono gestirlo

2

maggiori dettagli fare riferimento qui DetailsCaricamento delle immagini con il legame e Picasso dati

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); 
    } 
} 
} 
4

Accorrding a questo grande articolo: Loading images with Data Binding and Picasso

ci sono due modi per farlo:

  1. Utilizzando @BindingAdapter
  2. ObservableField & personalizzato Picasso target

In Sviluppatori Android riferimento Data Binding Guide, si dovrebbe trovare solo il primo.

Leggere entrambi gli articoli.

Ulteriori informazioni:

Speranza che aiuta.

+1

Ok fammi elaborare ... –

+0

@ piotrek1543, Sto cercando di caricare imageView utilizzando picasso in un oggetto all'interno di recyclerView utilizzando il databainding, apparentemente quando faccio scorrere verso l'alto e verso il basso le immagini si caricano di nuovo anche se erano caricato di nuovo un minuto, https://github.com/pankajnimgade/Tutorial101/tree/master/app/src/main/java/data/binding/list/activities/three –

+0

buon articolo ma, se si ottengono i dati da un server esterno per popolare l'imageUrl, nel momento in cui i dati arrivano loadImage (vista ImageView, String imageUrl) è già chiamato --- sembra che non ci sia un collegamento a 2 vie qui? – Mike6679

25

La Risposta: https://stackoverflow.com/a/36941125/703225

definiscono:

@BindingAdapter({"android:src"}) 
public static void setImageViewResource(ImageView imageView, int resource) { 
    imageView.setImageResource(resource); 
} 

uso:

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:scaleType="center" 
    android:src="@{viewModel.imageRes, [email protected]/guide_1}"/> 
11

Ho provato questo, e funziona per io (buildToolsVersion: 24.0.1):

<ImageView 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:layout_margin="8dp" 
    android:scaleType="centerInside" 
    app:imageResource="@{item.avatarResId}"/> 

basta usare app:imageResource per sostituire android:src, android:src="@{item.avatarResId}" non significa il resto funziona definiscono una consuetudine @BindAdapter("android:src") per esso.

ma utilizzare app:imageResource non ha bisogno di definire una @BindAdapter Inoltre, poiché l'ImageView ha un metodo chiamato setImageResource(), quando si utilizza app:imageResource, si chiamerà setImageResource() automaticamente.

0
<ImageView ... 
     app:svg="@{@drawable/ic_car_placeholder}" /> 

poi

@BindingAdapter({"app:svg"}) 
public static void setImageViewResource(ImageView imageView, Drawable resource) { 
    imageView.setBackgroundDrawable(resource); 
} 
0

Il problema è con tutti gli attributi che fanno sulla avere setter con lo stesso nome. per esempio. android: x non funzionerà se il metodo setX() non è presente in quella vista allo stesso modo se avessimo il metodo setSrc() su ImageView il tuo codice avrebbe funzionato senza adattatore di binding personalizzato

0

Puoi farlo senza fare nulla di programmatico se i tuoi dati il modello contiene l'ID della risorsa dell'immagine.

Esempio:

<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> 

Basta aggiungere la seguente riga al ImageView (non ero in grado di formattare il codice quando stavo aggiungendo lì):

android:src="@{ContextCompat.getDrawable(context,roomInfoItem.resId)}" 

dove resId contiene R.drawable.your_image_name

2

Se si desidera passare un argomento nel metodo come un @IdRes è possibile utilizzare

Problemi correlati