使用数据绑定更改Recyclerview的项目样式

时间:2017-04-21 05:48:43

标签: android xml android-recyclerview android-databinding

我有一个recyclerview,我想动态地通过数据绑定更改recyclerview的每个项目的样式。

这是我的Recyclerview项目布局

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/channel_priority_item_height"
        android:background="@drawable/channel_item_bg"
        android:paddingStart="@dimen/channel_priority_header_left_pad"
        android:paddingEnd="@dimen/channel_priority_item_right_pad">
        <ImageView
            android:id="@+id/preference_channel_image"
            android:src="@drawable/empty_channel_drawable"
            android:layout_width="@dimen/channels_item_width"
            android:layout_height="@dimen/channels_item_height"
            android:layout_centerVertical="true"
            android:layout_alignParentStart="true"
            android:layout_marginEnd="@dimen/channel_item_margin_end"/>
        <RelativeLayout
            android:id="@+id/preference_channel_switch_holder"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_centerVertical="true"
            android:layout_alignParentEnd="true">
            <ImageView
                android:id="@+id/preference_channel_switch"
                android:layout_width="@dimen/channels_preference_switch_size"
                android:layout_height="@dimen/channels_preference_switch_size"
                android:layout_centerInParent="true"
                android:padding="@dimen/switch_padding"
                android:src="@drawable/switch_selected_bg"
                android:background="@drawable/circle_button_bg" />
        </RelativeLayout>
        <LinearLayout
            android:orientation="vertical"
            android:layout_toEndOf="@+id/preference_channel_image"
            android:layout_toStartOf="@+id/preference_channel_switch_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true">
            <TextView
                android:text="Some Header"
                android:id="@+id/channel_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/preference_channel_primary"
                android:textColor="@color/white"
                android:fontFamily="sans-serif"/>
            <TextView
                android:text="Some Description"
                android:id="@+id/channel_description"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="@dimen/preference_channel_secondary"
                android:textColor="@color/white_50"
                android:fontFamily="sans-serif"/>
        </LinearLayout>
    </RelativeLayout>

我想在此布局中更改每个项目的样式,例如布局的textview背景的文本颜色等。 数据绑定应该在哪里完成?在适配器或父片段中?任何示例都将非常有用。 谢谢。

1 个答案:

答案 0 :(得分:1)

模特课程:

public class ColorObject extends BaseObservable {

    int color = Color.BLACK;

    public void setColor(int color) {
        if (this.color==color) return;
        this.color = color;
        notifyPropertyChanged(BR.color);
    }

    @Bindable
    public int getColor() {
        return color;
    }
}

但是,我不建议仅为颜色创建模型类。您可以在Activity View Model类中添加此Color对象。

<强>适配器:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {

    private ColorObject colorObject;

    public ListAdapter(Context context){
        colorObject = new ColorObject();

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ItemListBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_list, parent, false);
        return new ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(colorObject);
    }

    @Override
    public int getItemCount() {
        return 5;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public ItemListBinding itemListBinding;
        public ViewHolder(ItemListBinding itemBinding) {
            super(itemBinding.getRoot());
            itemListBinding = itemBinding;
        }

        public void bind(ColorObject item) {
            itemListBinding.setTextColor(item);
            itemListBinding.executePendingBindings();
        }
    }
}

item_list.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="textColor"
            type="com.example.ColorObject"/>
    </data>

    <android.support.constraint.ConstraintLayout xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:padding="@dimen/activity_horizontal_margin"
            android:id="@+id/text"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textColor="@{textColor.color}"
            android:background="@color/colorPrimaryDark"
            android:text="sjhfjsgjfhgjfhs"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>
</layout>