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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:43:19