Android recyclerview数据绑定屏幕大小的不同布局

时间:2016-11-08 07:45:17

标签: android data-binding android-recyclerview

我正在制作一个使用带有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

0 个答案:

没有答案
相关问题