0

問題ViewHolder意見閃光/閃爍OnBind

每次我打電話給我的人裏面OnBind()方法,它們內部的意見會閃爍或閃爍或者甚至消失。

我只是很迷茫,爲什麼,我已經嘗試了一些東西。

  1. 將它們更改爲null作爲背景或使它們全部爲純色。
  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> 

實例鏈接刪除

回答

0

RecyclerView有內建的動畫給它,使用DefaultItemAnimator。特別是當您撥打notifiyItemChanged()時,它會爲ViewHolder中的數據更改做一個淡入淡出的動畫。如果您想禁用此,你可以使用以下命令:

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

這將禁用該項目改變了動畫(您所看到的褪色)。

+0

非常感謝! @Alex Townsend。像魅力一樣工作。總是希望這將是一個簡單的解決方案。現在這個過度被告知的問題似乎毫無意義。再次感謝。 –