Android RecyclerView.Adapter是否可以/应该访问ViewHolder?

Android RecyclerView.Adapter是否可以/应该访问ViewHolder?,android,android-recyclerview,android-view,android-adapter,Android,Android Recyclerview,Android View,Android Adapter,我在每个视图中都有一个EditText,在onViewRecycled(.)中,我用任何用户输入更新适配器中的项目。用于在视图中滚动视图时维护信息 然而,我意识到,使用此解决方案检索已修改但未回收的信息有点麻烦。我通过将每个ViewHolder添加到Adapter(在onCreateViewHolder(.)中添加)中的一个单独列表来解决这个问题,因为我找不到更简单的方法来更新屏幕上的视图 是否有任何理由不这样做;让适配器直接访问视窗夹?也就是说,是否有更好的方法在当前存在的所有视图上调用函数

我在每个
视图中都有一个
EditText
,在
onViewRecycled(.)
中,我用任何用户输入更新
适配器中的项目。用于在视图中滚动
视图时维护信息

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

是否有任何理由不这样做;让
适配器
直接访问
视窗夹
?也就是说,是否有更好的方法在当前存在的所有
视图上调用函数

编辑:

公共类AdapterRv扩展适配器{
私人清单项目;
私人名单持有人;
公共适配器(列表初始项){
...
viewHolders=newarraylist();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
私人编辑文本;
私人物品;
私有MyViewHolder(查看查看){
...
}
公共无效bindItem(Item inItem){
...
}
}
@凌驾
public MyViewHolder onCreateViewHolder(ViewGroup inParent,int inViewType){
...
如果(!viewHolders.contains(tmpHolder)){
viewHolders.add(tmpHolder);
}
...
}
....
@凌驾
ViewRecycled上的公共无效(MyViewHolder inViewHolder){
saveView(inViewHolder.item、inViewHolder.text.getText().toString());
}
私有void saveViews(){
用于(MyViewHolder tmpViewHolder:ViewHolder){
saveView(tmpViewHolder.item、tmpViewHolder.text.getText().toString());
}
}
私有void saveView(Item inItem,newtext中的字符串){
if(inItem.getText().equals(inNewText)){
回来
}
inItem.setText(inNewText);
}
公共列表获取文本(){
保存视图();
退货项目;
}
}

RecyclerView.Adapter
的目的只是创建
ViewHolder
实例并向其提供数据,但请求和管理持有者的是
RecyclerView
本身

顾名思义,
ViewHolder
的用途是保存项目的视图层次结构,以便
视图可以被
回收视图
缓存和重用。因此,适配器应该只创建正确的数据并将其绑定到持有者,建议不要在适配器内存储对持有者的任何引用,因为您只需要在
onBindViewHolder中引用对持有者的引用(ViewHolder holder,int position
方法,由
RecyclerView
提供。反之亦然,ViewHolder不需要适配器的引用,因此您的
MyViewHolder
应标记为
static

如果您需要在recycler的视图上进行操作,
RecyclerView
的API中有很多方法,例如
FindViewWholder for LayoutPosition(int position)
getChildViewHolder(View child)
等。您还可以设置侦听器以观察滚动、项目触摸、视图附加状态等更改。


因此,如果您需要访问和操作视图(即对所有recycler的视图调用函数),请通过
RecyclerView
而不是适配器进行操作,因为管理视图的是recycler,适配器只提供数据。

您能添加一些代码吗,因此它是自解释的,您只需调用nmAdapter.notifyDataSetChanged();或者,正如@ParthAnjaria所说,共享一些代码有多种方式通知RecyclerView“刷新”这是viewsDone,代码补充。@cricket_007这些方式是什么?我不确定你想展示什么,但我非常怀疑你是否需要自己保留ViewHolder对象列表。我认为RecyclerView是在幕后自己做的
顾名思义,ViewHolder的用途是保存项目的视图层次结构,以便RecyclerView可以缓存和重用视图。“
这是由android.support.v7.widget.RecyclerView.Recyclerer完成的,ViewHolder和视图重用是两件不同的事情,ViewHolder的目的是方便子视图查找,因此您不需要
findViewById
内部
onBindViewHolder
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;
    }
}