2017-04-21 4 views
0

Ich habe eine recyclerview und ich möchte den Stil jedes Artikels der Recyclerview mit Databinding dynamisch ändern.Artikelstil der Recyclerview mit Datenbindung ändern

Das ist mein Recyclerview Artikel 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> 

ich den Stil von jedes Element in diesem Layout, wie die Textfarbe des Textview Hintergrund des Layouts usw. Wo sollte die Datenbindung ändern möchten getan werden? Im Adapter oder im Elternfragment: Jedes Beispiel ist sehr hilfreich. Danke.

Antwort

1

Model-Klasse:

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

Allerdings werde ich nicht eine Modellklasse zu erstellen, die nur für Farbe empfehlen. Sie können dieses Color Objekt in Ihrer Activity View Model-Klasse hinzufügen.

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