调用MS SQL存储过程加载多列数据到ListView首行被覆盖如何解决
问题修复方案
你的核心问题是数据集合、适配器的初始化逻辑全部放在了遍历数据库结果的循环内部,每遍历一条数据就会创建新的空集合、新的适配器,重新给ListView绑定适配器,最终只会展示最后一条遍历到的数据,看起来像覆盖了首行。
修改逻辑如下:
- 遍历ResultSet之前先初始化存储Vagon数据的集合
- 遍历过程中只往已创建的集合中添加数据,不要在循环内做适配器初始化、绑定操作
- 所有数据加载完成后再初始化适配器,绑定到ListView上
修改后的fillVagonList方法代码:
public void fillVagonList () { ResultSet rs = null; PreparedStatement ps = null; try { ConnectToSql connectToSql = new ConnectToSql(); SqlConnect = connectToSql.connect(); if (SqlConnect != null) { String SPsql = "EXEC mobile3_GETCARLIST ?,?,?,?"; ps = SqlConnect.prepareStatement(SPsql); ps.setEscapeProcessing(true); ps.setQueryTimeout(1000); ps.setInt(1, LoginActivity.SesId); ps.setString(2, EquipmentWagon.deadend); ps.setString(3, EquipmentWagon.sectorName); ps.setInt(4, EquipmentWagon.operID); rs = ps.executeQuery(); vagonNumberList = new ArrayList<String>(); vagonNatList = new ArrayList<String>(); vagonLengthList = new ArrayList<String>(); // 遍历前先初始化数据集合 ArrayList<Vagon> vagonArrayList = new ArrayList<Vagon>(); while (rs.next()) { Vagon vagon = new Vagon(rs.getString(2),rs.getString(1),rs.getString(5)); // 循环内仅添加数据到集合 vagonArrayList.add(vagon); } // 数据全部加载完成后再初始化适配器、绑定ListView VagonAdapter adapter = new VagonAdapter(getContext(),vagonArrayList); lvVagonList.setAdapter(adapter); } else { ConnectionResult = "Check Connection"; } } catch (SQLException se) { System.out.println("Error al ejecutar SQL" + se.getMessage()); se.printStackTrace(); throw new IllegalArgumentException("Error al ejecutar SQL: " + se.getMessage()); } finally { try { if(rs != null) rs.close(); if(ps != null) ps.close(); if(SqlConnect != null) SqlConnect.close(); } catch (SQLException ex) { ex.printStackTrace(); } } }
额外优化点:
- 数据库查询属于耗时操作,不要放在主线程执行,建议放到子线程中执行,避免触发ANR
- finally块中关闭资源前增加非空判断,避免空指针异常
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

