Java 为什么我的RecyclerView更新了,而我没有';你不通知适配器吗?

Java 为什么我的RecyclerView更新了,而我没有';你不通知适配器吗?,java,android,android-recyclerview,Java,Android,Android Recyclerview,我很难理解为什么我的recyclerView只在setAdapter()之后添加数据而从不调用notifyDataSetChanged()时得到更新 同一类型: ->我在列表中添加了3个字符串 ->仅为第一个添加的(notifyItemInserted)通知适配器 结果:显示3个字符串 如果有人能帮助我理解,我将非常感谢他:) 我的代码: public class MainActivity extends AppCompatActivity { List<String> mList

我很难理解为什么我的recyclerView只在setAdapter()之后添加数据而从不调用notifyDataSetChanged()时得到更新

同一类型: ->我在列表中添加了3个字符串 ->仅为第一个添加的(notifyItemInserted)通知适配器

结果:显示3个字符串

如果有人能帮助我理解,我将非常感谢他:)

我的代码:

public class MainActivity extends AppCompatActivity {
List<String> mList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //Call before set adapter so it's normal if show when the adapter is set
    mList.add("Before set the adapter");

    RecyclerView recyclerView = findViewById(R.id.rcv);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    final Adapter mAdapter = new Adapter(mList);
    recyclerView.setAdapter(mAdapter);


    Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mList.add("Button add " +0);
            mAdapter.notifyItemInserted(mList.size()-1);

            //Again it's showing but never notify
            mList.add("Button add " +1);
            mList.add("Button add " +2);
        }
    });

    //Called after setAdapter and NEVER notify the adapter but it's still show the data
    addMoreData();

}


private void addMoreData() {
    for (int i = 0; i < 10; i++) {
        mList.add("addMoreData: " + i);
    }
}


class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
    class ViewHolder extends RecyclerView.ViewHolder {
        TextView nameTextView;

        ViewHolder(View itemView) {

            super(itemView);
            nameTextView = (TextView) itemView.findViewById(R.id.textview);
        }
    }

    @Override
    public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.raw, parent, false);
        return new Adapter.ViewHolder(view);
    }

    private List<String> mList;

    Adapter(List<String> list) {
        mList = list;
    }

    @Override
    public void onBindViewHolder(Adapter.ViewHolder holder, int position) {
        holder.nameTextView.setText(mList.get(position));

    }

    @Override
    public int getItemCount() {
        return mList.size();
    }
}
}
public类MainActivity扩展了AppCompatActivity{
List mList=new ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在设置适配器之前调用,以便在设置适配器时显示是正常的
mList.add(“设置适配器之前”);
RecyclerView RecyclerView=findViewById(R.id.rcv);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
最终适配器mAdapter=新适配器(mList);
recyclerView.setAdapter(mAdapter);
按钮按钮=findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mList.add(“按钮添加”+0);
mAdapter.notifyItemInserted(mList.size()-1);
//它再次显示,但从未通知
列表添加(“按钮添加”+1);
列表添加(“按钮添加”+2);
}
});
//在setAdapter之后调用,从不通知适配器,但它仍然显示数据
addMoreData();
}
私有void addMoreData(){
对于(int i=0;i<10;i++){
mList.add(“addMoreData:+i”);
}
}
类适配器扩展了RecyclerView.Adapter{
类ViewHolder扩展了RecyclerView.ViewHolder{
TextView名称TextView;
ViewHolder(视图项视图){
超级(项目视图);
nameTextView=(TextView)itemView.findViewById(R.id.TextView);
}
}
@凌驾
public Adapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.raw、parent、false);
返回新适配器。视图保持架(视图);
}
私人名单;
适配器(列表){
mList=列表;
}
@凌驾
public void onBindViewHolder(Adapter.ViewHolder,int位置){
holder.nameTextView.setText(mList.get(position));
}
@凌驾
public int getItemCount(){
返回mList.size();
}
}
}

您通常使用notify调用来保持当前显示的视图处于正确状态,但这并不阻止适配器将数据提供给其他RecyclerView组件

如果您的RecyclerView具有滚动功能,您可以非常清楚地看到它-如果您在没有通知的情况下更新列表,然后滚动到底部,您将获得新项目的布局


在您的情况下,您在末尾添加项目并仅为其通知-buy LayoutManager确定它仍然可以布局更多视图。您通常使用notify调用来保持当前显示的视图处于正确状态,这不会阻止适配器将数据提供给其他RecyclerView组件

如果您的RecyclerView具有滚动功能,您可以非常清楚地看到它-如果您在没有通知的情况下更新列表,然后滚动到底部,您将获得新项目的布局


在您的案例中,您在末尾添加项目并仅为其发出通知-buy LayoutManager确定它仍然可以如此布置更多视图。

我认为,由于
notifyDataSetChanged
的工作原理,这就是结果

一位谷歌工程师说

调用notifyDataSetChanged时,RecyclerView将使数据无效 但在下一个动画帧之前不会更新UI。这是怎么回事 android视图系统工作正常。小部件失效时(例如更改 其数据)它要求一个布局,这意味着它将被重新测量和 在下一个视图遍历中重新布局。这样做是为了我们能够 批处理所有更改,直到下一次更新屏幕

这意味着
nofiyDataSetChanged
等待UI线程。因此,代码中插入的
notifyItemInserted
的下面几行并不重要

    mList.add("Button add " +0);
    mAdapter.notifyItemInserted(mList.size()-1);

    //Again it's showing but never notify
    mList.add("Button add " +1);
    mList.add("Button add " +2);

我认为,由于notifydatasetchange的工作原理,这就是结果

一位谷歌工程师说

调用notifyDataSetChanged时,RecyclerView将使数据无效 但在下一个动画帧之前不会更新UI。这是怎么回事 android视图系统工作正常。小部件失效时(例如更改 其数据)它要求一个布局,这意味着它将被重新测量和 在下一个视图遍历中重新布局。这样做是为了我们能够 批处理所有更改,直到下一次更新屏幕

这意味着
nofiyDataSetChanged
等待UI线程。因此,代码中插入的
notifyItemInserted
的下面几行并不重要

    mList.add("Button add " +0);
    mAdapter.notifyItemInserted(mList.size()-1);

    //Again it's showing but never notify
    mList.add("Button add " +1);
    mList.add("Button add " +2);

每次数据更改时,您都必须调用notify。您的意思是,将数据添加到列表会自动反映在
recyclerview
中,而无需调用
notifyDataSetChanged()
?@向导“是”。@MikeM。如果我尝试放置
addMoreData(),也是一样的
onStart()
onResume()
中,这并不能解释为什么当我点击按钮时会显示3个字符串(并且只通知1个字符串)。是的,我最初没有看到你在那里提出的第二个问题,而且这需要比我之前评论的更长的解释,所以我删除了它。该注释仍然适用于
onCreate()
,不过,作为扩展,
onStart()
onResume()
。每次数据更改时,您都必须调用notify。您的意思是,将数据添加到列表会自动反映在
recyclerview
中,而无需调用
notifyDataSetChanged()
?@向导完全是。@MikeM。如果我尝试放置
addMoreData(),也是一样的