安卓开发:如何修改代码实现点击按钮逐行输出CSV而非仅显示末行
问题核心根因
你现有代码每次点击按钮时,都会重新打开CSV输入流、从零开始遍历所有行,循环过程中反复对TextView执行set操作,最终界面上自然只会保留遍历结束时最后一行的内容;同时因为没有维护读取位置的状态,每次点击都重复执行全量读文件的逻辑,既没有逐行推进的效果,还容易造成IO资源泄漏。
具体修改方案
- 调整全局变量结构,替换原来的临时流定义
- 移除原来点击事件中临时创建的InputStream声明,新增两个全局状态变量:
List<String[]>类型的列表,用于一次性存储所有CSV行的拆分结果(可兼容你原来定义的String[]类型数组的使用场景)int类型的位置标记,用于记录当前需要展示的行索引位置
- 移除原来点击事件中临时创建的InputStream声明,新增两个全局状态变量:
- 把全量读取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
相关产品推荐
相关产品推荐

