Android - ListView在数据重新排序后未更新

时间:2015-09-21 20:50:00

标签: android android-listview custom-adapter

我成功实施了ListActivity ContextMenu,其中MenuItem@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; ... } :“向上移动”和“向下移动”。单击时,代码会在两个对象之间交换列order_id。

MainActivity.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);
        }
      });
  }
}

CustomAdapter.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);
  }
}

Command.java

datasource.moveCommandUp(command)

我可以看到datasource.moveCommandDown(command)@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; ... } 效果很好,因为如果我关闭并重启我的应用,则会对列表进行排序并正确交换这两个对象。

问题是我需要重启应用才能显示效果,点击“上移”或“下移”后不会发生任何变化。

有什么问题?

在Christian回答后编辑

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

MainActivity.java

public class CustomAdapter extends ArrayAdapter<Command>{

  ArrayList<Command> objects;

  ...

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

CustomAdapter.java

final Command command = adapter.getItem(position);

编辑2

使用

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

intead of

 For Each row As DataGridViewRow In DataGridView1.Rows
            If row.Cells(15).Value = True Then
                MsgBox(row.Cells(0).Value.ToString)
            End If
        Next

解决了这个问题!

1 个答案:

答案 0 :(得分:1)

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