Can/should RecyclerView.Adapter 可以访问 ViewHolders 吗?
Can/should RecyclerView.Adapter have access to the ViewHolders?
我在每个View
中有一个EditText
,在onViewRecycled(.)
中我用任何用户输入更新Adapter
中的项目。为了在滚动Views
离开和返回视图时维护信息。
但是,我意识到使用这个解决方案,检索已修改但未回收的信息有点麻烦。我通过将每个 ViewHolder
添加到 Adapter
中的单独列表(添加到 onCreateViewHolder(.)
中)解决了这个问题,因为我找不到更简单的方法来更新 Views
on屏幕。
有什么理由不这样做吗?让 Adapter
直接访问 ViewHolders
? IE。有没有更好的方法来调用所有 Views
当前存在的函数?
编辑:
public class AdapterRv extends Adapter<AdapterRv.MyViewHolder> {
private List<Item> items;
private List<MyViewHoders> viewHolders;
public AdapterRv(List<Item> inItems) {
...
viewHolders = new ArrayList<>();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private EditText text;
private Item item;
private MyViewHolder(View inView) {
...
}
public void bindItem(Item inItem) {
...
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup inParent, int inViewType) {
...
if (!viewHolders.contains(tmpHolder)) {
viewHolders.add(tmpHolder);
}
...
}
....
@Override
public void onViewRecycled(MyViewHolder inViewHolder) {
saveView(inViewHolder.item, inViewHolder.text.getText().toString());
}
private void saveViews() {
for (MyViewHolder tmpViewHolder : viewHolders) {
saveView(tmpViewHolder.item, tmpViewHolder.text.getText().toString());
}
}
private void saveView(Item inItem, String inNewText) {
if (inItem.getText().equals(inNewText)) {
return;
}
inItem.setText(inNewText);
}
public List<Item> fetchTexts() {
saveViews();
return items;
}
}
RecyclerView.Adapter
的目的只是创建ViewHolder
个实例并为它们提供数据,但是RecyclerView
本身请求持有者并管理它们。
顾名思义,ViewHolder
的目的是保存项目的视图层次结构,以便 Views
可以缓存并由 RecyclerView
重复使用。因此,适配器应该只创建正确的数据并将其绑定到持有者,建议不要在适配器内存储对持有者的任何引用,因为您只需要在 onBindViewHolder(ViewHolder holder, int position
方法中引用持有者,它是由 RecyclerView
提供。反之亦然,视图持有者不需要对适配器的引用,因此您的 MyViewHolder
应该标记为 static
.
如果你需要对recycler的视图进行操作,RecyclerView
里面有很多方法API,比如findViewHolderForLayoutPosition(int position)
、getChildViewHolder(View child)
等,你也可以设置侦听器以观察滚动、项目触摸、视图附加状态等变化。
See the documentation for the RecyclerView
因此,如果您需要访问和操作视图(即调用所有回收器视图上的函数),请通过 RecyclerView
而不是适配器,因为它是管理它们的回收器- 适配器只提供数据。
我在每个View
中有一个EditText
,在onViewRecycled(.)
中我用任何用户输入更新Adapter
中的项目。为了在滚动Views
离开和返回视图时维护信息。
但是,我意识到使用这个解决方案,检索已修改但未回收的信息有点麻烦。我通过将每个 ViewHolder
添加到 Adapter
中的单独列表(添加到 onCreateViewHolder(.)
中)解决了这个问题,因为我找不到更简单的方法来更新 Views
on屏幕。
有什么理由不这样做吗?让 Adapter
直接访问 ViewHolders
? IE。有没有更好的方法来调用所有 Views
当前存在的函数?
编辑:
public class AdapterRv extends Adapter<AdapterRv.MyViewHolder> {
private List<Item> items;
private List<MyViewHoders> viewHolders;
public AdapterRv(List<Item> inItems) {
...
viewHolders = new ArrayList<>();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private EditText text;
private Item item;
private MyViewHolder(View inView) {
...
}
public void bindItem(Item inItem) {
...
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup inParent, int inViewType) {
...
if (!viewHolders.contains(tmpHolder)) {
viewHolders.add(tmpHolder);
}
...
}
....
@Override
public void onViewRecycled(MyViewHolder inViewHolder) {
saveView(inViewHolder.item, inViewHolder.text.getText().toString());
}
private void saveViews() {
for (MyViewHolder tmpViewHolder : viewHolders) {
saveView(tmpViewHolder.item, tmpViewHolder.text.getText().toString());
}
}
private void saveView(Item inItem, String inNewText) {
if (inItem.getText().equals(inNewText)) {
return;
}
inItem.setText(inNewText);
}
public List<Item> fetchTexts() {
saveViews();
return items;
}
}
RecyclerView.Adapter
的目的只是创建ViewHolder
个实例并为它们提供数据,但是RecyclerView
本身请求持有者并管理它们。
顾名思义,ViewHolder
的目的是保存项目的视图层次结构,以便 Views
可以缓存并由 RecyclerView
重复使用。因此,适配器应该只创建正确的数据并将其绑定到持有者,建议不要在适配器内存储对持有者的任何引用,因为您只需要在 onBindViewHolder(ViewHolder holder, int position
方法中引用持有者,它是由 RecyclerView
提供。反之亦然,视图持有者不需要对适配器的引用,因此您的 MyViewHolder
应该标记为 static
.
如果你需要对recycler的视图进行操作,RecyclerView
里面有很多方法API,比如findViewHolderForLayoutPosition(int position)
、getChildViewHolder(View child)
等,你也可以设置侦听器以观察滚动、项目触摸、视图附加状态等变化。
See the documentation for the RecyclerView
因此,如果您需要访问和操作视图(即调用所有回收器视图上的函数),请通过 RecyclerView
而不是适配器,因为它是管理它们的回收器- 适配器只提供数据。