【问题标题】:Why is my RecyclerView showing Incorrect order of CardView items?为什么我的 RecyclerView 显示 CardView 项目的顺序不正确?
【发布时间】:2020-04-05 19:01:09
【问题描述】:

我有一个食品(类)对象的 CardViews 的 RecyclerView。正在发生的一件奇怪的事情是,当我使用一种方法将新的 Food 对象添加到我正在使用的 ArrayList 并通知适配器已添加了一个值时,卡被添加到屏幕上,但它有一组不同的值。

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

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

怎么了? 顺便说一句,该应用不会崩溃。

将新的 Food 对象添加到名为“foods”的 ArrayList 的功能:

public void addFood(){
   foods.add(new Food("Name",0,3,2)); //a constructor
foodAdapter.notifyItemInserted(0);
}

【问题讨论】:

  • 使用 notifyDatasetchanged 代替 itemchange。
  • 您是否打算将项目插入列表中的第一个位置(索引 0 即 notifyItemInserted(0))?为了更好地帮助您,请提供与适配器设置和食品类相关的代码。
  • 是的,我的意图是每次我添加一些东西时,它都应该放在页面的顶部(就像一个堆栈)。我也应该使用 notifyDataSetChanged(除了 notifyItemInserted 吗?)
  • @Arc 我是否遗漏了文档中有关 Recycler 视图的内容?
  • @SohailSaha,你明白了,这与职位有关。 ??????

标签: java android android-studio android-recyclerview


【解决方案1】:

显然,问题是在 ArrayList 项 'foods' 上调用 .add(Object) 实际上将新对象附加到列表的末尾,同时,Adapter.notifyItemInserted(0) 使 Recycler 视图认为位置 0拿到了新卡,而实际上是位置最后。 这使得 RecyclerView 中显示了错误的项目。

因此,很明显,解决方法是使用 ArrayList.add(position,object) 构造函数而不是 .add(object),其中 position 显示新元素的插入位置。

所以,正确的代码是:

public void addFood(){
   foods.add(0, new Food("Name", 0, 3, 2)); //a constructor
   foodAdapter.notifyItemInserted(0);
}

如果您希望将新对象插入到不同的位置,只需传递该位置来代替上面的 0。

【讨论】:

    【解决方案2】:

    您只需将foodAdapter.notifyItemInserted(0) 更改为foodAdapter.notifyDataSetChanged() 或foodAdapter.notifyItemInserted(foods.size() - 1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多