Android - 数据重新排序后 ListView 不更新

Posted

技术标签:

【中文标题】Android - 数据重新排序后 ListView 不更新【英文标题】:Android - ListView not updating after data reordering 【发布时间】:2015-12-18 16:34:46 【问题描述】:

我成功实现了我的ListActivity 和一个ContextMenu 和两个MenuItems:“上移”和“下移”。单击代码时,会在两个对象之间交换列 order_id。

MainActivity.java

@Override
public boolean onContextItemSelected(MenuItem item) 
  ...

  case CONTEXT_MENU_MOVE_UP:
    datasource.moveCommandUp(command);
    adapter.reOrder();
    adapter.notifyDataSetChanged();
    break;

  case CONTEXT_MENU_MOVE_DOWN:
    datasource.moveCommandDown(command);
    adapter.reOrder();
    adapter.notifyDataSetChanged();
    break;

  ...

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<Command>

  ArrayList<Command> objects;

  ...

  public void reOrder() 
    Collections.sort(objects, new Comparator<Command>() 
      public int compare(Command c1, Command c2) 
          return c1.compareTo(c2);
        
      );
  

Command.java

public class Command  implements Comparable<Command> 
  public long id;
  public String name;
  public Long order_id;

  @Override
  public int compareTo(Command c) 
    return this.order_id.compareTo(c.order_id);
  

我可以看到 datasource.moveCommandUp(command)datasource.moveCommandDown(command) 运行良好,因为如果我关闭并重新启动我的应用程序,则列表是有序的并且两个对象正确交换。

问题是我需要重新启动应用程序才能显示效果,点击“上移”或“下移”后没有任何变化。

怎么了?

在克里斯蒂安回答后编辑

我没有更新适配器的对象。我没有使用排序,而是调用 getAllCommands(),这为我提供了新顺序的数组(重新启动时排序项目的原因),然后我用新的对象重置对象。现在列表视图更新但如果我点击一个项目..我仍然得到前一个项目,即它触发前一个项目提供的操作。怎么了?

MainActivity.java

@Override
public boolean onContextItemSelected(MenuItem item) 
  ...

case CONTEXT_MENU_MOVE_UP:
  datasource.moveCommandUp(command);

  values = datasource.getAllCommands();
  adapter.setObjects(values);
  break;

case CONTEXT_MENU_MOVE_DOWN:
  datasource.moveCommandDown(command);

  values = datasource.getAllCommands();
  adapter.setObjects(values);
  break;

  ...

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<Command>

  ArrayList<Command> objects;

  ...

  public void setObjects(ArrayList<Command> newObjects) 
    objects = newObjects;
    notifyDataSetChanged();
  

编辑 2

使用

final Command command = adapter.getItem(position);

而不是

final Command command = (Command) getListAdapter().getItem(position);

解决了问题!

【问题讨论】:

【参考方案1】:

即使您删除了设置对象数组的适配器部分,您似乎正在使用数据库的内容初始化对象数组,在 reorder() 中您对对象数组进行排序,但您这样做了不显示任何代码,其中对象数组是从数据库重新加载的。您可以在 notifyDataSetChanged() 之前在适配器中执行此操作。

【讨论】:

切入正题。我在没有从数据库重新加载更新的 order_ids 的情况下对数组进行排序。现在我从我的数据库中重新加载对象,更新和排序,然后重置我的适配器的对象和列表视图更新。但是当点击一个项目时,它会触发前者的动作 你应该发布你的完整代码,否则无法猜测 你是对的。与此同时,我设法通过使用getListAdapter().getItem(position); 而不是adapter.getItem(position); 解决了这个问题。

以上是关于Android - 数据重新排序后 ListView 不更新的主要内容,如果未能解决你的问题,请参考以下文章

Android——ViewHolder的作用与用法

mysql-重新排序修改排序值-删除数据后排序字段序号断层,重新根据顺序设置连续性的排序值

有界数据更改后重新排序 WPF DataGrid

在 Material-Table 中重新排序后是不是可以获得当前页面数据?

TableView 中的重新排序行将在数据刷新后重置为默认值

在asp.net mvc中删除数据成功后重新排序自动编号列JQuery Datatable