Android开发:BufferedReader读txt无法加载至ListView问题求助
问题排查与修复
几个关键问题点
- 适配器逻辑完全搞反:你在循环里每读一行就新建一次适配器、设置一次列表,而且是先设置适配器再往集合里加数据——此时适配器绑定的是空集合,后续添加数据适配器无法感知,列表自然没有内容。
- 代码存在语法冗余:末尾一堆多余的
});,要么导致编译报错,要么执行时异常,你说没报错大概率是复制代码时的遗漏问题。 - 权限未处理:Android 6.0+读取外部存储需要动态申请权限,没有权限会静默读取失败,不会抛出异常。
修复后的完整代码
//String family = familyinput.getText().toString(); //ArrayAdapter<String> famadapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, addFamily); public static void writeTextToFile(final String filename, final String data) { File file = new File(filename); try { FileOutputStream stream = new FileOutputStream(file, true); stream.write(data.getBytes()); stream.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button familybutton; EditText familyinput; ArrayList<String> addFamily = new ArrayList<>(); ListView show; familybutton = findViewById(R.id.button); familyinput = findViewById(R.id.inputsiteFamilie); show = findViewById(R.id.listView); //Intent intent = new Intent(this, SecondActivity.class); // Android 6.0+ 必须动态申请读存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); } else { loadDataToList(addFamily, show); } // 按钮点击写入逻辑(补全遗漏部分) familybutton.setOnClickListener(v -> { String family = familyinput.getText().toString(); if (!TextUtils.isEmpty(family)) { String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/family.txt"; writeTextToFile(filePath, family + "\n"); // 加换行符,避免内容挤在一行 // 写入后直接更新列表 addFamily.add(family); ((ArrayAdapter)show.getAdapter()).notifyDataSetChanged(); } }); } // 权限申请回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { ArrayList<String> addFamily = new ArrayList<>(); ListView show = findViewById(R.id.listView); loadDataToList(addFamily, show); } else { Toast.makeText(this, "需要读取存储权限才能显示数据", Toast.LENGTH_SHORT).show(); } } } // 封装读取文件+更新列表的逻辑 private void loadDataToList(ArrayList<String> addFamily, ListView show) { try { String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/family.txt"; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "CP1252"), 100); String line; // 先把所有数据读进集合 while ((line = br.readLine()) != null) { addFamily.add(line); } br.close(); // 数据读完后再创建适配器,仅创建一次 ArrayAdapter<String> famadapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, addFamily); show.setAdapter(famadapter); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "读取文件失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
额外提醒
- 写入文件时必须添加
\n换行符,否则所有内容会连成一行,读取时只能拿到一条数据。 - Android Q及以后版本建议使用
getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)获取文件路径,无需申请权限即可读写应用私有文件。 - 权限申请逻辑必须添加,否则高版本系统会直接读取失败且无报错提示。
内容的提问来源于stack exchange,提问作者PhilOLink
相关产品推荐
相关产品推荐

