You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 23:45:07