2015-11-24 30 views
5

Więc używam to popularne wiążących fragment kodu, aby załadować obraz do ImageView przedmiotów lista danych przez przechodzącą w URL:Jak uzyskać dostęp do zmiennej instancji wewnątrz elementu BindingAdapter podczas korzystania z powiązania danych Androida?

<ImageView 
     android:layout_width="match_parent" 
     android:layout_height="150dp"" 
     app:imageUrl="@{movie.imageUrl}" 
     /> 

The Binding Adapter:

class Movie{ 
    boolean isLoaded; 

    @BindingAdapter({"bind:imageUrl"}) 
     public static void loadImage(final ImageView view, String imageUrl) { 

      Picasso.with(view.getContext()) 
       .load(imageUrl) 
       .into(view, new Callback.EmptyCallback() { 
       @Override public void onSuccess() { 
        //set isLoaded to true for the listview item 
        // but cannot access boolean isLoaded as it is non static. 
       }); 
    } 

Gdybym po prostu uczynić BindingAdapter niestatyczny następnie wyrzuca błąd:

java.lang.IllegalStateException: Required DataBindingComponent is null  in class MovieTileBinding. A BindingAdapter in  com.example.moviesapp.Pojos.Results is not static and requires an object to  use, retrieved from the DataBindingComponent. If you don't use an inflation method taking a DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all BindingAdapter methods static. 
+1

Ta wielka blogpost pokaże u, jak używać non-static BindingAdapter https://realm.io/news/data-binding-android-boyar-mount/ . –

+0

Sprawdź rozwiązanie tego duplikatu pytania: http://stackoverflow.com/a/38216344/1650674 – tir38

Odpowiedz

1

Umieść cały film instace pośrednictwem niestandardowego adaptera biding:

<ImageView 
     android:layout_width="match_parent" 
     android:layout_height="150dp"" 
     app:movie="@{movie}" 
     /> 

The Binding Adapter:

class Movie{ 
boolean isLoaded; 

@BindingAdapter({"movie"}) 
    public static void loadImage(final ImageView view, final Movie movie) { 
     if(movie != null && moview.getImageUrl() != null){ 
      Picasso.with(view.getContext()) 
      .load(movie.getImageUrl()) 
      .into(view, new Callback.EmptyCallback() { 
      @Override public void onSuccess() { 
       image.setLoaded(true); 
      }); 
    } 
}