出现的问题描述:
在我的数据库中有数据,利用adapter与数据库关联,再利用adapter和listview关联从而显示,我添加里增加数据和修改数据的 方法一切正常,但是在写入删除数据(长按删除,点击修改)的方法后出现了bug。第一次可以删除对应数据,之后的修改和删除均出现故障,如修改数据无法对应所选数据,或无法删除对应数据。
问题出现的原因:
经过几天的逐步排除,首先排除了list.remove()方法的执行失败,之后排除了数据库database.delete()方法执行失败没有删除对应数据的问题。之后又排除了adapter.notifysetdatachange()方法的执行失败,我利用了重新关联数据库数据和adapter的关系仍然没有解决此问题故而排除。最后发现原因:数据库的排序方式和适配器不同。
举个例子:我数据库中添加了 A B C D四条数据,其_id是1 2 3 4.在我使用遍历方法创建adapter的时候,适配器中 A B C D四条数据的position是 0 1 2 3.在listview.setonclicklistener()方法中获得的positon指的是adapter中数据的位置,使用list.remove方法删除listview中的数据,然后使用adapter.notifysetdatachange方法刷新适配器。这时会出现问题。假如我用了database.dlete方法删除了数据库中的B数据,则list.view中显示A C D,数据库中数据是A _ C D,_id 为1 2 3 4.注意B数据删除后_id为2的地方有一个空数据,其余C D的_id并不会自动减1.适配器中数据为 A C D position为0 1 2.若此时有新的操作,例如修改C ,我通过position获得的位置在我原来看来等于数据库中_id-1,现在删除C操作获得的position为1而数据库中C数据的_id为3,无法对应,此时运用database.updata的修改的数据将会是原来的B数据位置的_id=2的数据。这就出现了问题。
解决方法
在适配器遍历数据进入list时,直接将_id信息写入list,然后用list.get方法直接获取_id 然后执行delete方法就可以准确的实行。我一开始不用是因为我没有将_id信息写进去,没办法获取id然后直接只用position来代替。
for (Event event : events) {
HashMap<String, String> map = new HashMap<>();
map.put("_id", String.valueOf(event._id));
map.put("content", event.content);
list.add(map);
}//向list中写入数据
.