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

求助:如何将ListView中的条码数据保存为PDF文件

解决Android中ListView条目保存为PDF的问题

现有代码的核心问题

  • 空指针异常:定义了btnok变量,但初始化时仅创建了临时变量b,未将其赋值给btnok,直接调用btnok.setOnClickListener会触发空指针崩溃。
  • 逻辑偏差:当前代码是将ListView条目以对象流形式写入barcodes.txt文件,完全未实现PDF生成逻辑。
  • 文件存储问题:直接使用文件名保存会触发权限错误(Android 6.0+需动态存储权限),且默认路径可能不可写。
  • 冗余数据读取:无需从ListView逐个读取条目,直接使用绑定的barcodelist集合即可获取所有条码数据。

解决方案步骤

1. 修复按钮初始化问题

将按钮初始化代码修正为:

btnok = findViewById(R.id.btnok);
btnok.setOnClickListener(new View.OnClickListener() {
    // 点击逻辑
});

2. 添加PDF生成依赖

在app/build.gradle的dependencies块中添加iText 7依赖(Android环境下常用的PDF处理库):

implementation 'com.itextpdf:itext7-core:7.2.5'
implementation 'com.itextpdf:layout:7.2.5'

3. 处理存储路径(推荐无权限方案)

使用应用私有外部存储目录保存PDF,无需申请动态权限:

// 获取应用私有文档目录
File pdfFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "barcodes.pdf");

4. 编写PDF生成逻辑

替换btnok点击事件中的原有代码为以下PDF生成逻辑:

btnok.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (barcodelist.isEmpty()) {
            Toast.makeText(MainActivity.this, "没有条码数据可保存", Toast.LENGTH_SHORT).show();
            return;
        }

        File pdfFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "barcodes.pdf");

        try {
            // 初始化PDF文档
            PdfWriter writer = new PdfWriter(pdfFile);
            PdfDocument pdfDoc = new PdfDocument(writer);
            Document document = new Document(pdfDoc);

            // 添加标题
            document.add(new Paragraph("条码列表").setFontSize(16).setBold().setMarginBottom(10));

            // 遍历条码列表,逐个添加到PDF
            for (String barcode : barcodelist) {
                document.add(new Paragraph(barcode).setFontSize(12).setMarginBottom(5));
            }

            // 关闭文档
            document.close();
            Toast.makeText(MainActivity.this, "PDF已保存至:" + pdfFile.getAbsolutePath(), Toast.LENGTH_LONG).show();

        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "保存PDF失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
});

5. 优化数据读取

删除从ListView读取条目的冗余代码,直接使用barcodelist集合(你的ArrayAdapter已绑定该集合)。

完整修改后的核心代码片段

@SuppressWarnings("ALL")
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button scanBtn, btnok;
    TextView messageFormat, ragham;
    ArrayList<String> barcodelist = new ArrayList<>();
    HashSet<String> hashSet = new HashSet<String>();
    ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化控件
        scanBtn = findViewById(R.id.btnscann);
        btnok = findViewById(R.id.btnok);
        ListView list1 = findViewById(R.id.list1);

        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, barcodelist);
        list1.setAdapter(adapter);

        scanBtn.setOnClickListener(this);

        btnok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (barcodelist.isEmpty()) {
                    Toast.makeText(MainActivity.this, "没有条码数据可保存", Toast.LENGTH_SHORT).show();
                    return;
                }

                File pdfFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "barcodes.pdf");

                try {
                    PdfWriter writer = new PdfWriter(pdfFile);
                    PdfDocument pdfDoc = new PdfDocument(writer);
                    Document document = new Document(pdfDoc);

                    document.add(new Paragraph("条码列表").setFontSize(16).setBold().setMarginBottom(10));

                    for (String barcode : barcodelist) {
                        document.add(new Paragraph(barcode).setFontSize(12).setMarginBottom(5));
                    }

                    document.close();
                    Toast.makeText(MainActivity.this, "PDF已保存:" + pdfFile.getAbsolutePath(), Toast.LENGTH_LONG).show();

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    // 实现scanBtn的点击逻辑(你的条码扫描代码)
    @Override
    public void onClick(View v) {
        // 扫描完成后将条码添加到barcodelist并更新ListView
        // 示例:barcodelist.add("扫描到的条码"); adapter.notifyDataSetChanged();
    }
}

注意事项

  • 确保条码扫描逻辑正确将数据添加到barcodelist,并调用adapter.notifyDataSetChanged()更新ListView。
  • 若需保存到公共目录(如Downloads),需处理Android 6.0+的动态权限申请,Android 13+需适配READ_MEDIA_IMAGES等权限。
  • 可根据Android SDK版本调整iText 7的依赖版本,确保兼容性。

内容的提问来源于stack exchange,提问作者MR loo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:45:56