hushed_voice
hushed_voice

Reputation: 3608

Change Item style of Recyclerview with Data Binding

I have a recyclerview and i want to change the style of each item of the recyclerview with databinding dynamically.

This is my Recyclerview item layout

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

I want to change the style of each item in this layout,like the text color of the textview background of the layout etc. Where should the databinding be done? In adapter or in the parent fragment?Any example will be very helpful. Thank you.

Upvotes: 1

Views: 1863

Answers (1)

S Haque
S Haque

Reputation: 7281

Model Class:

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;
    }
}

However, I won't recommend to create a model class only for color. You can add this Color object in your Activity View Model class.

Adapter:

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>

Upvotes: 1

Related Questions