Can/should RecyclerView.Adapter 可以访问 ViewHolders 吗?

Can/should RecyclerView.Adapter have access to the ViewHolders?

我在每个View中有一个EditText,在onViewRecycled(.)中我用任何用户输入更新Adapter中的项目。为了在滚动Views离开和返回视图时维护信息。

但是,我意识到使用这个解决方案,检索已修改但未回收的信息有点麻烦。我通过将每个 ViewHolder 添加到 Adapter 中的单独列表(添加到 onCreateViewHolder(.) 中)解决了这个问题,因为我找不到更简单的方法来更新 Viewson屏幕。

有什么理由不这样做吗?让 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 而不是适配器,因为它是管理它们的回收器- 适配器只提供数据。