ViewHolder查看flash / blink OnBind

时间:2016-03-14 19:33:15

标签: java android android-layout android-recyclerview android-viewholder

问题

每次我在持有者中调用OnBind()方法时,其中的视图都会闪烁或闪烁,甚至可能会消失。

我很遗憾为什么,我已经尝试了很多东西。

  1. 将它们更改为将null作为背景或使它们都是纯色。
  2. 确保任何事情都没有消失。
  3. 删除了所有动画。
  4. 问过Google一千次,一千种方式。
  5. 在此搜索。
  6. 思考

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

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

    任何帮助,提示或建议都会很棒。希望代码链接起作用并且能够为每个人构建。

    谢谢,
    乔恩。

    代码

    我不确定我需要在这里添加多少代码,所以我一开始会变小。如果有更多应该添加,请告诉我,我会。不过我把它全部放在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>
    

    已删除示例链接

1 个答案:

答案 0 :(得分:0)

RecyclerView使用DefaultItemAnimator为其制作了一些内置动画。特别是当您致电notifiyItemChanged()时,它会为ViewHolder中的数据更改执行淡入淡出动画。如果您想禁用此功能,可以使用以下内容:

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

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