You need to enable JavaScript to run this app. 安卓开发:如何修改代码实现点击按钮逐行输出CSV而非仅显示末行
优惠活动
大模型
产品
解决方案
定价
更多

安卓开发:如何修改代码实现点击按钮逐行输出CSV而非仅显示末行

问题核心根因

你现有代码每次点击按钮时,都会重新打开CSV输入流、从零开始遍历所有行,循环过程中反复对TextView执行set操作,最终界面上自然只会保留遍历结束时最后一行的内容;同时因为没有维护读取位置的状态,每次点击都重复执行全量读文件的逻辑,既没有逐行推进的效果,还容易造成IO资源泄漏。

具体修改方案
  • 调整全局变量结构,替换原来的临时流定义
    • 移除原来点击事件中临时创建的InputStream声明,新增两个全局状态变量:
      • List<String[]>类型的列表,用于一次性存储所有CSV行的拆分结果(可兼容你原来定义的String[]类型数组的使用场景)
      • int类型的位置标记,用于记录当前需要展示的行索引位置
  • 把全量读取CSV的逻辑从点击事件中挪出,只在页面初始化阶段执行一次
    • 在onCreate完成控件绑定后,一次性打开raw目录下的dating资源,逐行读取所有内容,按逗号拆分后存入提前声明的全局列表,读取完成后及时关闭输入流和BufferedReader,避免资源占用
    • 如果CSV存在不需要展示的表头行,可以在这一步读取时直接跳过
  • 改造按钮点击的触发逻辑
    • 每次点击时,先判断当前位置标记是否已经超出列表总长度:如果已经读完所有行,可根据需求选择重置标记回到第一行循环展示,或者提示用户已到文件末尾
    • 取出列表中对应索引的行数据,按你原本的需求拼接指定位置的字段,设置到TextView上
    • 完成当前行展示后,将位置标记自增1,为下一次点击读取下一行做准备
参考代码片段

全局声明部分:

// 全局状态定义
private List<String[]> parsedCsvLines = new ArrayList<>();
private int currentDisplayIndex = 0;
private TextView contentDisplayTv;
private Button nextLineBtn;

onCreate中的初始化逻辑:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 绑定控件
    contentDisplayTv = findViewById(R.id.tv_content);
    nextLineBtn = findViewById(R.id.btn_next_line);

    // 仅执行一次的CSV全量读取
    try {
        InputStream rawStream = getResources().openRawResource(R.raw.dating);
        BufferedReader csvReader = new BufferedReader(new InputStreamReader(rawStream));
        String row;
        // 跳过CSV表头(如有需要)
        csvReader.readLine();
        while ((row = csvReader.readLine()) != null) {
            String[] fields = row.split(",");
            parsedCsvLines.add(fields);
        }
        // 关闭资源
        csvReader.close();
        rawStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // 绑定点击事件
    nextLineBtn.setOnClickListener(v -> showNextCsvLine());
}

点击触发的逐行展示逻辑:

private void showNextCsvLine() {
    // 读完所有行后的处理
    if (currentDisplayIndex >= parsedCsvLines.size()) {
        currentDisplayIndex = 0; // 回到第一行循环读取
    }
    // 获取当前行数据并展示
    String[] currentRow = parsedCsvLines.get(currentDisplayIndex);
    String displayText = currentRow[0] + " | " + currentRow[1]; // 按需求拼接指定字段
    contentDisplayTv.setText(displayText);
    // 移动到下一行位置
    currentDisplayIndex++;
}

注意:不要在点击事件中反复打开输入流读取文件,这种方式不仅效率低,还容易因为流未及时关闭触发应用内存泄漏、IO操作卡顿的问题。

内容的提问来源于stack exchange,提问作者Trifon Danov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 09:06:03