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