在notifyItemChanged调用之后,RecyclerView中的项目无法正确绑定

时间:2017-05-01 21:18:49

标签: android recycler-adapter android-databinding

我的RecyclerView显示如下所示的天数。

Screenshot

首先,一切都按预期工作(正确设置日期,颜色,缩写和透明度)。当我按下下面的一个圆圈时,居中日的数据应该改变。它确实如此,除了透明度设置为1(不透明),无论数据如何。如果您滚动一点直到视图(应该具有透明度)被回收然后返回,则再次正确设置透明度。

这是我的RecyclerView适配器:

public class RecyclerViewAdapterDays extends RecyclerView.Adapter<RecyclerViewAdapterDays.ViewHolder> {
    private final int[] month;
    private final int[] dates;
    private final boolean[] weekends;
    private final Shift[] shifts;
    private int default_background_color;

    public RecyclerViewAdapterDays(int[] month, int[] dates, Shift[] shifts, boolean[] weekends) {
        this.month = month;
        this.dates = dates;
        this.shifts = shifts;
        this.weekends = weekends;
    }

    @Override
    public RecyclerViewAdapterDays.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        DoubledotLayoutBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.doubledot_layout, parent, false);
        ViewHolder viewHolder = new ViewHolder(binding);
        default_background_color = parent.getContext().getResources().getColor(R.color.colorPrimaryDark);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        System.out.println("Binding " + position);
        System.out.println("Alpha " +  (weekends[position] ? 0.2f : 1f));
        holder.binding.setShift(shifts[month[position]]);
        holder.binding.setDate(String.valueOf(dates[position]));
        System.out.println("Date " +  (dates[position]));
        holder.binding.setDefaultColor(default_background_color);
        holder.binding.rootLayout.setAlpha(weekends[position] ? 0.2f : 1f);
        holder.binding.executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return month.length;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        final DoubledotLayoutBinding binding;

        public ViewHolder(DoubledotLayoutBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
    }
}

如果我运行应用程序并按下其中一个圆圈,这将改变轮班数组中的班次,然后调用notifyItemChanged。 (nether dates也会weekends会发生变化)我可以在日志中看到onBindViewHolder在正确位置被调用且weekends[position] ? 0.2f : 1f确实返回了0.2f。< / p>

那么为什么我的RecyclerView项目仍然不透明?

编辑:以下是日期的布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="shift"
            type="hexpoly.dienstplan.Shift" />

        <variable
            name="date"
            type="String" />

        <variable
            name="defaultColor"
            type="Integer" />
    </data>

    <android.support.constraint.ConstraintLayout
        android:id="@+id/root_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="@dimen/activity_edit_month_doubledot_padding_land"
        android:paddingRight="@dimen/activity_edit_month_doubledot_padding_land"
        android:paddingTop="8dp"
        android:paddingBottom="8dp">

        <ImageView
            android:layout_width="@dimen/activity_edit_month_doubledot_width"
            android:layout_height="80dp"
            android:src="@drawable/doubledot"
            android:tint="@{shift.color == 0 ? defaultColor : shift.color}"
            tools:ignore="ContentDescription" />

        <android.support.constraint.Guideline
            android:id="@+id/guideline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintGuide_percent="0.5" />

        <TextView
            android:id="@+id/tv_day"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{date, default = 12}"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/guideline"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/tv_shift"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="@{shift.short_name, default = F1}"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="@id/guideline"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>

</layout>

并且班次类传递给布局:

public class Shift
{
    public String short_name, name, start, end;
    public int color, id;
    public boolean priority = false;
    public boolean defaultShift = false;

    Shift() {}

}

0 个答案:

没有答案