2017-01-24 4 views
4

バインディングを使用してムービーポスター画像のグリッドビューを作成したいと考えています。私は次のエラーを取得するピカソで@BindingAdapterをセットアップするには?

public class PopularMoviesAdapter extends RecyclerView.Adapter<PopularMoviesAdapter.BindingHolder> { 

    private List<Movie> movies; 
    private Context context; 

    public PopularMoviesAdapter(List<Movie> movies, Context context) { 
     this.movies = movies; 
     this.context = context; 
    } 

    public void add(Movie movie){ 
     movies.add(movie); 
    } 

    @Override 
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     PopularMoviesBinding popularMoviesBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), 
       R.layout.popular_movies_gridview_row, parent,false); 
     return new BindingHolder(popularMoviesBinding); 
    } 

    @Override 
    public void onBindViewHolder(PopularMoviesAdapter.BindingHolder holder, int position) { 
     PopularMoviesBinding popularMoviesBinding = holder.popularMoviesBinding; 
     popularMoviesBinding.setPmvm(new PopularMoviesViewModel(movies.get(position), context)); 
    } 

    @Override 
    public int getItemCount() { 
     return movies.size(); 
    } 

    public class BindingHolder extends RecyclerView.ViewHolder{ 

     private PopularMoviesBinding popularMoviesBinding; 

     public BindingHolder(PopularMoviesBinding popularMoviesBinding) { 
      super(popularMoviesBinding.getRoot()); 
      this.popularMoviesBinding = popularMoviesBinding; 
     } 
} 
} 

java.lang.IllegalStateException: Required DataBindingComponent is null in class PopularMoviesBinding.A BindingAdapter in modelviews.PopularMoviesViewModel is not static and requires an object to use, retrieved from the DataBindingComponent. 

public class PopularMoviesViewModel extends BaseObservable { 

    Movie movie; 
    Context context; 

    MovieServiceComponent movieServiceComponent = DaggerMovieServiceComponent.builder() 
      .contextModule(new ContextModule(context)) 
      .build(); 

    Picasso getPicasso = movieServiceComponent.getPicasso(); 

    public PopularMoviesViewModel(Movie movie, Context context) { 
     this.movie = movie; 
     this.context = context; 
    } 

    @Bindable 
    public String getImageUrl(){ 
     return movie.posterPath(); 
    } 

    @Bindable 
    public String getTitle(){ 
     return movie.originalTitle(); 
    } 

    @BindingAdapter({"imageUrl"}) 
    public void setImageUrl(ImageView view, String poserPath){ 
     getPicasso.with(view.getContext()).load("http://image.tmdb.org/t/p/w185"+ poserPath).into(view); 

    } 

} 

レイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data class="PopularMoviesBinding"> 
    <variable 
     name="pmvm" 
     type="com.hartyandi.oviesm.modelviews.PopularMoviesViewModel"></variable> 

    </data> 

    <LinearLayout 


     android:id="@+id/row" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FFFFFF" 
     android:paddingBottom="0dp" 
     android:paddingTop="5dp" 
     android:paddingRight="2.5dp" 
     android:paddingLeft="5dp" 
     android:orientation="vertical"> 

     <ImageView 
      app:imageUrl="@{pmvm.imageUrl}" 
      android:id="@+id/popular_movies_grid_image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="0dp" 
      android:adjustViewBounds="true" 
      android:elevation="20dp"> 

     </ImageView> 

     <TextView 
      android:id="@+id/popular_movies_grid_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{pmvm.title}" 
      android:textColor="#000000" 
      android:textSize="12sp" 
      android:background="#FFFFFF" 
      > 
     </TextView> 

    </LinearLayout> 
</layout> 

はアダプタ

私のviewmodelはそのように見えます

I tried to change my implementation just like this stackoverflow post suggestと同じエラーメッセージが表示されます。

I also used the following code as example.

誰かがコードの問題は、どのようにそれを解決するために何を説明してもらえますか?

答えて

6

おそらく、BindingAdapterのインスタンスメソッドを使用するつもりはありませんでした。

この場合、生成するBindingクラスが使用するインスタンスを知るように、DataBindingComponentを指定する必要があります。

DataBindingComponentを指定するか、必要なコンテキストを属性として静的バインディングアダプタメソッドに渡すだけです。第二は理解し少し簡単ですので、私はそれで始めましょう:あなたのBindingAdapterで次に

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <data class="PopularMoviesBinding"> 
     <variable name="pmvm" 
      type="com.hartyandi.oviesm.modelviews.PopularMoviesViewModel"/> 
     <variable name="picasso" type="com.whatever.Picasso"/> 
    </data> 
    <!-- ... --> 
    <ImageView 
     app:imageUrl="@{pmvm.imageUrl}" 
     app:picasso="@{picasso}" 
     ... /> 
    </ImageView> 
</layout> 

:setImageUrlは今staticであることを

@BindingAdapter({"imageUrl", "picasso"}) 
public static void setImageUrl(ImageView view, String poserPath, Picasso picasso){ 
    picasso.with(view.getContext()).load("http://image.tmdb.org/t/p/w185"+ poserPath).into(view); 
} 

注意。あなたのViewModelで

<ImageView 
    app:imageUrl="@{pmvm.imageUrl}" 
    app:picasso="@{pmvm.picasso}" 
    ... /> 

と方法:

public Picasso getPicasso() { return this.getPicasso; } 
あなたのピカソのインスタンスがViewModelににもありますので、

あるいは、あなただけのピカソのためにゲッターを追加することで、インスタンスを渡すことができます

他の方法は、DataBindingComponentを実装することを意味します。インスタンスBindingAdapterメソッドを作成すると、生成されたインターフェイスにはクラスのゲッターが作成されます。あなたは、そのインターフェイスを実装するクラスを作成する必要があります:

public class MyDataBindingComponent implements DataBindingComponent { 
    public PopularMoviesViewModel getPopularMoviesViewModel() { 
     return whateverIDoToCreateOrGetThisBindingAdapterInstance(); 
    } 
} 

あなたが膨らままたはバインドするとき、あなたはインスタンスを渡す:

PopularMoviesBinding popularMoviesBinding = 
    DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), 
     R.layout.popular_movies_gridview_row, parent,false, 
     new MyDataBindingComponent()); 
0

だけ(setImageUrlを作る)方法静的このコードのようにする

@BindingAdapter({"imageUrl"}) 
public void setImageUrl(ImageView view, String poserPath){ 
    getPicasso.with(view.getContext()).load("http://image.tmdb.org/t/p/w185"+ 
    poserPath).into(view); 

} 
関連する問題