我应该在哪里取消绑定ViewHolder中的ButterKnife 8.xx?

Bal*_*rva 27 android android-layout butterknife android-viewholder android-recyclerview

我有一个使用ButterKnife注释的RecycleView.ViewHolder类.

我的代码也应该在这个ViewHolder类中unbind()吗?

public class AView extends RecyclerView.ViewHolder
{
    @BindView(R.id.a_text_view) TextView aText;

    public AView(final View view)
    {
        super(view);
        ButterKnife.bind(this, view); // It returns an Unbinder, but where should I call its unbind()?
    }
}
Run Code Online (Sandbox Code Playgroud)

文档(http://jakewharton.github.io/butterknife/)没有讨论这个问题.

Tim*_*eed 43

根据Butterknife的作者Jake Wharton的说法,unbind()只需要Fragments.在问题跟踪器上查看此评论:

https://github.com/JakeWharton/butterknife/issues/879

问:在RecyclerView,我们如何解开ViewHolder

答:你不需要.只Fragments需要在onDestroyView().

原因在于

[ ViewHolders]不会超过相关视图.一个Fragment.

换句话说,因为a FragmentViews被销毁之后可能继续存在,所以你需要.unbind()从a 调用Fragment以释放对它的引用Views(并允许回收相关的内存).

使用a ViewHolder,持有者的生命周期与Views它所拥有的相同.换句话说,它ViewHolder和它的同时Views被破坏,因此你需要手动清除它们之间永远不会有从一个到另一个的延迟引用.


pio*_*543 11

这是一个解释WHEN和WHY使用unbind()方法:

绑定重置

碎片具有与活动不同的视图生命周期.绑定片段时onCreateView,将视图设置为null onDestroyView.Unbinder当你打电话bind给你时,Butter Knife会返回一个实例.unbind在适当的生命周期回调中调用其方法.

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(R.id.button2) Button button2;
  private Unbinder unbinder;

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    unbinder = ButterKnife.bind(this, view);
    // TODO Use fields...
    return view;
  }

  @Override public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }
}
Run Code Online (Sandbox Code Playgroud)

来自:http://jakewharton.github.io/butterknife/#reset

所以你根本不需要unbind任何视图ViewHolder.

希望它会有所帮助