gpt4 book ai didi

android - 如何使用 Picasso 设置 @BindingAdapter?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:42 27 4
gpt4 key购买 nike

我想使用绑定(bind)创建电影海报图像的 GridView 。

我的 View 模型看起来像这样:

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.

谁能解释一下代码的问题是什么,以及如何解决?

最佳答案

您可能不打算为 BindingAdapter 使用实例方法。

如果这样做,您必须提供 DataBindingComponent以便生成的 Binding 类知道要使用哪个实例。

您有两个选择——提供一个 DataBindingComponent 或将所需的上下文作为属性传递给静态绑定(bind)适配器方法。第二个更容易理解,所以我将从它开始:

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

然后在您的 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);
}

请注意,setImageUrl 现在是 static

或者,由于您的 Picasso 实例也在 ViewModel 上,您可以通过为 picasso 添加一个 getter 来传递该实例:

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

以及您的 ViewModel 中的方法:

public Picasso getPicasso() { return this.getPicasso; }

另一种方式意味着您实现了一个DataBindingComponent。当您创建实例 BindingAdapter 方法时,生成的接口(interface)将为您的类提供一个 getter。您需要创建一个类来实现该接口(interface):

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

然后在膨胀或绑定(bind)时传递实例:

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

关于android - 如何使用 Picasso 设置 @BindingAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41838167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com