在一个带有Listener的ViewHolder的View中,如何修改它代表的数据呢?
In a ViewHolder's View with a Listener, how to modify the data it represents?
我有一个 ViewHolder,其中包含一个 SeekBar。 SeekBar 有一个监听器,它是在 onCreateViewHolder
调用期间添加的。
由于 onBindViewHolder
方法用于配置 ViewHolder 持有的 View,那么 Listener 如何对 ViewHolder 的 View 表示的新数据集进行操作?
是否可以向ViewHolder 添加一个Object 类型的成员变量,其中包含对数据集的引用,以便Listener 可以在SeekBar 更改期间获取此对象并修改数据集中的变量?或者这是一个反模式?
然后,该成员变量引用的数据集对象将在每个 onBindViewHolder
上换出,以便 "point" 到当前表示的数据集。
如果您使用的是 RecyclerView.ViewHolder
,那么您确实了解通常的 ViewHolder 模式的 getView()
方法在这里被 2 种方法取代:onCreateViewHolder()
和 onBindViewHolder()
。方法onCreateViewHolder()
代表创建VH或从标签中获取,onBindViewHolder()
代表用相应的数据填充VH的视图。理解这一点,你应该设置监听器的唯一地方是 onBindViewHolder()
方法。
如果您的问题是关于每次触发 onBindViewHolder()
时创建一个 Listener
- 这不是一个好主意。您最好创建一个侦听器实例作为 (adapter) class 字段并使用它。通常我会为目标 View
的标签设置一些东西,而这个 "something" 是我在监听器中需要的对象。
private final View.OnClickListener onCancelClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
final SwipeLayout swipeLayout = (SwipeLayout) v.getParent().getParent();
swipeLayout.close();
}
};
和 getView()
或 onBindViewHolder()
的边:
viewHolder.btnSwipeMenuCancel.setTag(swipeLayout);
viewHolder.btnSwipeMenuCancel.setOnClickListener(onCancelClick);
使用标签:
viewHolder.btnSwipeMenuReply.setTag(message);
viewHolder.btnSwipeMenuReply.setOnClickListener(onReplyToAuthorClick);
private final View.OnClickListener onReplyToAuthorClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
final Message message = (Message) v.getTag();
activity.replyToMessageAuthor(message);
}
};
我有一个 ViewHolder,其中包含一个 SeekBar。 SeekBar 有一个监听器,它是在 onCreateViewHolder
调用期间添加的。
由于 onBindViewHolder
方法用于配置 ViewHolder 持有的 View,那么 Listener 如何对 ViewHolder 的 View 表示的新数据集进行操作?
是否可以向ViewHolder 添加一个Object 类型的成员变量,其中包含对数据集的引用,以便Listener 可以在SeekBar 更改期间获取此对象并修改数据集中的变量?或者这是一个反模式?
然后,该成员变量引用的数据集对象将在每个 onBindViewHolder
上换出,以便 "point" 到当前表示的数据集。
如果您使用的是 RecyclerView.ViewHolder
,那么您确实了解通常的 ViewHolder 模式的 getView()
方法在这里被 2 种方法取代:onCreateViewHolder()
和 onBindViewHolder()
。方法onCreateViewHolder()
代表创建VH或从标签中获取,onBindViewHolder()
代表用相应的数据填充VH的视图。理解这一点,你应该设置监听器的唯一地方是 onBindViewHolder()
方法。
如果您的问题是关于每次触发 onBindViewHolder()
时创建一个 Listener
- 这不是一个好主意。您最好创建一个侦听器实例作为 (adapter) class 字段并使用它。通常我会为目标 View
的标签设置一些东西,而这个 "something" 是我在监听器中需要的对象。
private final View.OnClickListener onCancelClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
final SwipeLayout swipeLayout = (SwipeLayout) v.getParent().getParent();
swipeLayout.close();
}
};
和 getView()
或 onBindViewHolder()
的边:
viewHolder.btnSwipeMenuCancel.setTag(swipeLayout);
viewHolder.btnSwipeMenuCancel.setOnClickListener(onCancelClick);
使用标签:
viewHolder.btnSwipeMenuReply.setTag(message);
viewHolder.btnSwipeMenuReply.setOnClickListener(onReplyToAuthorClick);
private final View.OnClickListener onReplyToAuthorClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
final Message message = (Message) v.getTag();
activity.replyToMessageAuthor(message);
}
};