2017-01-24 6 views
4

바인딩을 사용하여 영화 포스터 이미지의 gridview를 만들고 싶습니다.피카소로 @BindingAdapter를 설정하는 방법은 무엇입니까?

내 뷰 모델은 다음과 같습니다

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> 

어댑터 :

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. 

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 메서드를 만들면 생성 된 인터페이스에 클래스에 대한 getter가 생깁니다.

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

}