Java 为什么我的RecyclerView显示CardView项目的顺序不正确?
我有一个食物(类)对象的CardView回收视图。发生的一件奇怪的事情是,当我使用一个方法将一个新的食物对象添加到我正在使用的ArrayList中,并通知适配器已经添加了一个值时,卡会被添加到屏幕上,但它有一组不同的值 默认情况下,我使用2个占位符食物对象显示在屏幕上,按Add按钮应该添加一个名为“name”的新对象,但我得到了第一个占位符的另一个副本 当太多的卡片被添加到屏幕上时,上下滑动会改变卡片的顺序,突然,新的项目(具有正确的数据)出现 怎么了? 顺便说一句,应用程序没有崩溃 将新食品对象添加到名为“食品”的ArrayList的函数:Java 为什么我的RecyclerView显示CardView项目的顺序不正确?,java,android,android-studio,android-recyclerview,Java,Android,Android Studio,Android Recyclerview,我有一个食物(类)对象的CardView回收视图。发生的一件奇怪的事情是,当我使用一个方法将一个新的食物对象添加到我正在使用的ArrayList中,并通知适配器已经添加了一个值时,卡会被添加到屏幕上,但它有一组不同的值 默认情况下,我使用2个占位符食物对象显示在屏幕上,按Add按钮应该添加一个名为“name”的新对象,但我得到了第一个占位符的另一个副本 当太多的卡片被添加到屏幕上时,上下滑动会改变卡片的顺序,突然,新的项目(具有正确的数据)出现 怎么了? 顺便说一句,应用程序没有崩溃 将新食品对
显然,问题在于在ArrayList项“foods”上调用.add(Object)实际上会将新对象追加到列表的末尾,与此同时,Adapter.notifyItemInserted(0)使回收器视图认为位置0获得了新卡,而实际上是位置最后一个。 这使得错误的项目出现在RecyclerView上 因此,显而易见,修复方法是使用ArrayList.add(位置,对象)构造函数,而不是.add(对象),其中位置显示新元素插入的位置。 因此,正确的代码是:
如果您想将新对象插入到不同的位置,只需传递该位置以代替上面的0。您只需将
foodAdapter.notifyItemInserted(0)
更改为foodAdapter.notifyDataSetChanged()
或foodAdapter.notifyItemInserted(foods.size()-1)
使用notifyDatasetchanged而不是itemchange。您是否打算将项目插入列表中的第一个位置(索引0。即notifyItemInserted(0))?为了更好地帮助您,请提供与适配器设置和foods类相关的代码。是的,我的意图是每次添加内容时,它都应该放在页面顶部(如堆栈)。我是否也应该使用notifyDataSetChanged(除了notifyItemInserted?@Arc我是否遗漏了有关回收者视图的文档?@SohailSaha,你发现了,这与职位有关。
public void addFood(){
foods.add(new Food("Name",0,3,2)); //a constructor
foodAdapter.notifyItemInserted(0);
}
public void addFood(){
foods.add(0, new Food("Name", 0, 3, 2)); //a constructor
foodAdapter.notifyItemInserted(0);
}