Gab*_*orH 4 android picasso android-databinding
我想用绑定创建一个电影海报图像的网格视图.
我的viewmodel看起来像这样:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
布局:
<?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>
Run Code Online (Sandbox Code Playgroud)
适配器:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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.
Run Code Online (Sandbox Code Playgroud)
我尝试改变我的实现就像这个stackoverflow帖子建议,我得到了相同的错误消息.
有人可以解释代码的问题,以及如何解决它?
您可能不打算使用实例方法BindingAdapter.
如果这样做,则必须提供DataBindingComponent,以便生成的Binding类知道要使用的实例.
您有两个选项 - 提供DataBindingComponent或只是将所需的上下文作为属性传递给静态绑定适配器方法.第二个更容易理解,所以我将从那开始:
<?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>
Run Code Online (Sandbox Code Playgroud)
然后在你的BindingAdapter中:
@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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,setImageUrl现在是static.
或者,由于您的Picasso实例也在ViewModel上,您可以通过为毕加索添加一个getter来传递实例:
<ImageView
app:imageUrl="@{pmvm.imageUrl}"
app:picasso="@{pmvm.picasso}"
... />
Run Code Online (Sandbox Code Playgroud)
和ViewModel中的方法:
public Picasso getPicasso() { return this.getPicasso; }
Run Code Online (Sandbox Code Playgroud)
另一种方式意味着你实现了DataBindingComponent.当您创建实例BindingAdapter方法时,生成的接口将为您的类提供一个getter.您需要创建一个类来实现该接口:
public class MyDataBindingComponent implements DataBindingComponent {
public PopularMoviesViewModel getPopularMoviesViewModel() {
return whateverIDoToCreateOrGetThisBindingAdapterInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在膨胀或绑定时传递实例:
PopularMoviesBinding popularMoviesBinding =
DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
R.layout.popular_movies_gridview_row, parent,false,
new MyDataBindingComponent());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |