我通常使用界面来处理列表项的点击,以显示消息或采取行动
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));
}
所以我的问题是"这被认为是一种不好的做法?"
答案 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);
}
}
我希望它有所帮助。