我正在制作一个使用带有recyclerview的数据绑定库的应用程序。我面临的问题是如何在旋转屏幕时使用不同的布局。通常,没有数据绑定,我通常做的是为文件夹layout-land中的recyclerview的单个项创建第二个布局(具有相同的名称),但是通过数据绑定,我在构建项目时获得了错误(不生成布局的相应数据绑定类)。 有没有办法在这种情况下使用数据绑定? 感谢
修改这是项目布局:
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fresco="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.eloquentbit.moovist.viewmodel.ItemMovieViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="12dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="150dp"
fresco:actualImageScaleType="centerCrop"
fresco:roundedCornerRadius="2dp"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
app:imageUrl="@{viewModel.posterImageUrl}"
/>
<TextView
android:id="@+id/text_original_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image"
android:layout_toEndOf="@id/image"
android:layout_alignTop="@id/image"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:text="@{viewModel.originalTitle}"
android:textStyle="bold"
android:textColor="@color/black"
android:textSize="16sp"
tools:text="Doctor Strange"
/>
<TextView
android:id="@+id/text_overview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/text_original_title"
android:layout_alignStart="@id/text_original_title"
android:layout_alignLeft="@id/text_original_title"
android:layout_marginTop="@dimen/activity_vertical_margin_half"
android:paddingRight="@dimen/activity_horizontal_margin"
android:lineSpacingExtra="5dp"
android:textColor="@color/grey"
android:text="@{viewModel.overview}"
tools:text="Overview"
/>
</RelativeLayout>
</layout>
编辑2 这是github回购:Moovist
编辑3 我尝试更好地解释问题:当我在layout-land文件夹中创建第二个布局时,使用相同的纵向布局名称(item_movie.xml),我获得了编译任务期间出现错误消息:
error: cannot find symbol method getViewModel()
并且未创建相应的数据绑定类(ItemMovieBinding)。
getViewModel 是我的RecyclerView适配器类中的一个方法:
package com.eloquentbit.moovist.adapter;
import android.databinding.DataBindingUtil;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import com.eloquentbit.moovist.R;
import com.eloquentbit.moovist.databinding.ItemMovieBinding;
import com.eloquentbit.moovist.model.Movie;
import com.eloquentbit.moovist.viewmodel.ItemMovieViewModel;
import java.util.Collections;
import java.util.List;
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.MovieViewHolder> {
private List<Movie> movies;
public MovieAdapter() {
this.movies = Collections.emptyList();
}
public void setMovies(List<Movie> movies) {
this.movies = movies;
}
@Override
public MovieViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemMovieBinding binding = DataBindingUtil.inflate(
LayoutInflater.from(parent.getContext()),
R.layout.item_movie,
parent,
false);
return new MovieViewHolder(binding);
}
@Override
public void onBindViewHolder(MovieAdapter.MovieViewHolder holder, int position) {
holder.bindMovie(movies.get(position));
}
@Override
public int getItemCount() {
return movies.size();
}
public class MovieViewHolder extends RecyclerView.ViewHolder {
final ItemMovieBinding binding;
public MovieViewHolder(ItemMovieBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
void bindMovie(Movie movie) {
if (binding.getViewModel() == null) {
binding.setViewModel(new ItemMovieViewModel(itemView.getContext(), movie));
} else {
binding.getViewModel().setMovie(movie);
}
}
}
}
编辑4 :我发现这实际上是一个错误;使用android gradle插件的2.3-alpha1版本我可以使用这两个布局没有任何问题。有关详细信息,请参阅:Issue 199344