ViewHolder 视图 flash/blink OnBind

ViewHolder views flash/blink OnBind

问题

每次我在 holder 中调用 OnBind() 方法时,它们中的视图会闪烁或闪烁甚至可能会消失。

我完全不知道为什么,我已经尝试了很多方法。

  1. 将它们更改为空背景或全部为纯色。
  2. 确保任何时候都没有丢失任何东西。
  3. 删除了所有动画。
  4. 问Google一千次,一千种方法。
  5. 在此处搜索。

想法

我一直认为我最终必须尝试用动画和样式隐藏它。将其视为绑定的副作用。

显然,这是一个更大项目的一部分。所以我仍然必须做所有的动画,这就是为什么我还没有为此做的原因。我想我只是问一下,看看是否有人可以在此期间帮助找到另一种解决方案。

任何帮助、提示或建议都将非常有用。希望代码链接有效并且可以为每个人构建。

谢谢,
乔恩

代码

我不确定我需要在此处添加多少代码,所以我先从小的开始。如果要添加更多内容,请告诉我,我会的。但是我把它全部放在 Github 和 Dropbox(示例 Apk 和 Zip)上。
链接在底部。

HeaderHolder.java

public class HeaderHolder extends BaseHolder {
    @Bind(R.id.header_title_text)
    TextView _titleTextView;
    @Bind(R.id.header_status_image)
    ImageView _statusImageView;
    @BindDrawable(R.drawable.ic_selected)
    Drawable _statusSelected;
    @BindDrawable(R.drawable.ic_non_selected)
    Drawable _statusNonselected;

    private Header _header;

    public HeaderHolder(View root, HolderCallBacks callbacks) {
        super(null, root, callbacks);
    }

    @Override
    public void OnBind(Base model) {
        this._header = (Header) model;
        String n = model._name();
        this._titleTextView.setText(n);
        this._statusImageView.setImageDrawable(this._header._iconset()._selected()
            ? this._statusSelected : this._statusNonselected);
    }

    @OnClick(R.id.header_item_wrapper)
    public void _headerClick(View view) {
        this._callbacks.OnHolderClick(view, this._header);
    }
}

IconsetHolder.java

public class IconsetHolder extends BaseHolder {
    @Bind(R.id.iconset_icon_recycler)
    RecyclerView _iconsRecycler;

    private AdapterCallBacks _adapterCallbacks;

    public IconsetHolder(Context context, View root, AdapterCallBacks callbacks) {
        super(context, root, null);
        this._adapterCallbacks = callbacks;
    }

    @Override
    public void OnBind(Base model) {
        Iconset i = (Iconset) model;
        this._iconsRecycler.setLayoutManager(new GridLayoutManager(
                this._context, i._span(), GridLayoutManager.HORIZONTAL, false));
        this._iconsRecycler.setAdapter(new ModelsAdapter(i._icons(), this._adapterCallbacks));
    }
}

item_header.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/header_item_wrapper"
android:layout_width="wrap_content"
android:layout_height="56dip"
android:background="#595959"
tools:context=".views.adapters.holders.HeaderHolder">

    <TextView
        android:id="@+id/header_title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="16dp"
        android:textColor="#fff8f8f8"
        android:gravity="center_vertical"
        android:text="ICONSET"
        android:textSize="24sp"
        android:layout_centerVertical="true" />

    <ImageView
        android:id="@+id/header_status_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="12dp"
        android:gravity="center_vertical"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />
</RelativeLayout>

item_iconset.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/iconset_item_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
tools:context=".views.adapters.holders.IconsetHolder">

<android.support.v7.widget.RecyclerView
    android:id="@+id/iconset_icon_recycler"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:background="#595959"
    android:layout_marginBottom="16dp"
    />
</RelativeLayout>

示例链接已删除

RecyclerView 使用 DefaultItemAnimator 有一些内置动画。具体来说,当您调用 notifiyItemChanged() 时,它会为 ViewHolder 中的数据更改执行淡入淡出动画。如果您想禁用它,您可以使用以下命令:

RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); // your recycler view here
if (animator instanceof DefaultItemAnimator) {
    ((DefaultItemAnimator) animator).setSupportsChangeAnimations(false);
}

这将禁用项目更改动画(您看到的淡入淡出)。