我成功实施了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
解决了这个问题!
答案 0 :(得分:1)
即使您已经删除了设置对象数组的适配器部分,似乎您正在使用数据库的内容初始化对象数组,在reorder()中对对象数组进行排序,但是不显示任何代码,其中从数据库重新加载对象数组。您可以在notifyDataSetChanged()之前在适配器中执行此操作。