在ViewHolder中保存列表项的引用是不好的做法

时间:2017-08-04 19:52:46

标签: java android android-viewholder

我通常使用界面来处理列表项的点击,以显示消息或采取行动

public interface ItemClickListener {
void onItemClicked(int adapterPosition);
}

@OnClick(R.id.seat_btn)
protected void click() {
    if (mItemClickListener != null)
        mItemClickListener.onItemClicked(getAdapterPosition());
}

然而,有时在ViewHolder中保存对象的引用并使用每个onBindViewHolder调用更新它并处理ViewHolder中的所有操作和更改有时会更容易

Seat mSeat;
@OnClick(R.id.seat_btn)
protected void click() {
   seatView.setText(String.value(mSeat.getCount()+1));
}

所以我的问题是"这被认为是一种不好的做法?"

1 个答案:

答案 0 :(得分:3)

是和否。

  • 是:

将您的数据对象放在视图持有者中是没有错的。我以前见过适配器,有许多ViewTypes使用带有通用参数T的基本ViewHolder和一个将视图绑定到数据的抽象方法,如下所示:

abstract BaseHolder<T> extends ViewHolder {
   .... constructor...
   private T t;

   abstract void bindView(T t);
}

这是一个很好的模式,将视图绑定隔离到ViewHolder,而Adapter只是将这些数据分发给权利持有者。

  • 但不是:

另一方面,直接处理那些同样持有者中的点击/点击事件我认为是不好的做法,因为它不应该是ViewHolder的责任。

应用程序导航,生成网络调用或数据库插入应该传递回顶层视图层(活动或片段)或某些可以正确处理与视图渲染隔离的逻辑的控制器。

通常在这些情况下,您将创建一个OnEventHappened接口,例如:

public interface onEventHappen {
    void onLikeTapped(MyData data);
}

并且应该将实现该接口的类传递给将传递给ViewHolder的适配器。 ViewHolder实现基本的View.OnClickListener,并将带有关联数据的事件传递给负责处理该事件的对象。像这样:

MyHolder extends ViewHolder implements View.OnClickListener {

     private final EventListener listener;
     private MyData data; // this will be set by adapter or "bind" like explained above

     public MyHolder(View itemView, EventListener listener) {
         super(itemView);
         itemView.findVieById(R.id.button).setOnClickListener(this);
         this.listener = listener;
     }

     @Override public void onClick(View view) {
        listener.onEvent(data);
     }
}

我希望它有所帮助。