gpt4 book ai didi

java - 在 ViewHolder 中保留列表项的引用是一种不好的做法吗

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:41 24 4
gpt4 key购买 nike

我通常使用一个界面来处理对列表项的点击,要么显示消息,要么采取行动

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));
}

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

最佳答案

是和否

  • 是:

将您的数据对象放在 View 持有者中并没有错。我以前甚至见过适配器有很多 ViewType,它们使用带有通用参数 T 的基本 ViewHolder 和将 View 绑定(bind)到数据的抽象方法,如下所示:

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

abstract void bindView(T t);
}

这是一个很好的模式,将 View 绑定(bind)隔离到 ViewHolder,而 Adapter 只是将此数据分发给正确的持有者。

  • 但是没有:

另一方面,我认为直接处理相同持有人内部的点击/点击事件是不好的做法,因为这不应该是 ViewHolder 的责任。

应用程序导航、生成网络调用或数据库插入是应该传递回顶层 View 层( Activity 或 fragment )或某些能够正确处理与 View 渲染隔离的逻辑的 Controller 。

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

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

并且实现该接口(interface)的类应该传递给将传递给 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);
}
}

希望对你有帮助。

关于java - 在 ViewHolder 中保留列表项的引用是一种不好的做法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45514525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com