Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的RecyclerView显示CardView项目的顺序不正确?_Java_Android_Android Studio_Android Recyclerview - Fatal编程技术网

Java 为什么我的RecyclerView显示CardView项目的顺序不正确?

Java 为什么我的RecyclerView显示CardView项目的顺序不正确?,java,android,android-studio,android-recyclerview,Java,Android,Android Studio,Android Recyclerview,我有一个食物(类)对象的CardView回收视图。发生的一件奇怪的事情是,当我使用一个方法将一个新的食物对象添加到我正在使用的ArrayList中,并通知适配器已经添加了一个值时,卡会被添加到屏幕上,但它有一组不同的值 默认情况下,我使用2个占位符食物对象显示在屏幕上,按Add按钮应该添加一个名为“name”的新对象,但我得到了第一个占位符的另一个副本 当太多的卡片被添加到屏幕上时,上下滑动会改变卡片的顺序,突然,新的项目(具有正确的数据)出现 怎么了? 顺便说一句,应用程序没有崩溃 将新食品对

我有一个食物(类)对象的CardView回收视图。发生的一件奇怪的事情是,当我使用一个方法将一个新的食物对象添加到我正在使用的ArrayList中,并通知适配器已经添加了一个值时,卡会被添加到屏幕上,但它有一组不同的值

默认情况下,我使用2个占位符食物对象显示在屏幕上,按Add按钮应该添加一个名为“name”的新对象,但我得到了第一个占位符的另一个副本

当太多的卡片被添加到屏幕上时,上下滑动会改变卡片的顺序,突然,新的项目(具有正确的数据)出现

怎么了? 顺便说一句,应用程序没有崩溃

将新食品对象添加到名为“食品”的ArrayList的函数:


显然,问题在于在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);
}