我有一个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背景的文本颜色等。 数据绑定应该在哪里完成?在适配器或父片段中?任何示例都将非常有用。 谢谢。
答案 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>