从膨胀的 XML 将适配器设置为 ListView 以打印 PDF - 缺少项目

Posted

技术标签:

【中文标题】从膨胀的 XML 将适配器设置为 ListView 以打印 PDF - 缺少项目【英文标题】:Set Adapter to ListView from inflated XML for printing PDF - missing items 【发布时间】:2020-08-23 19:08:12 【问题描述】:

我正在尝试从膨胀的 xml 布局创建 PDF。在这个布局中有一个 ListView,我想用项目填充它,然后将所有内容打印到 PDF。

代码如下:

List<PersonData> personDataList = getListfromDataBase();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.pdf_print_container, null);

//Start new PDF-Document
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(595, 842, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);

//https://***.com/questions/43699638/android-create-and-print-pdf-from-layout-view
int measureWidth = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getWidth(), View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getHeight(), View.MeasureSpec.EXACTLY);
view.measure(measureWidth, measuredHeight);
view.layout(0, 0, page.getCanvas().getWidth(), page.getCanvas().getHeight());

//get the ListView where to add the items
ListView listView = view.findViewById(R.id.pdf_listview_for_items);

//Create the Adapter
PdfArrayAdapter pdfArrayAdapter = new PdfArrayAdapter(view.getContext(), personDataList);

//set the adapter to the listView
listView.setAdapter(pdfArrayAdapter);

//Draw the view to the pdf page, and write it
view.draw(page.getCanvas());
document.finishPage(page);
document.writeTo(new FileOutputStream(filePath + ".pdf"));

这是包含 ListView 的父 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">
    <TextView
        android:id="@+id/textView11"
        android:layout_
        android:layout_
        android:text="Page Headline and some more Information"/>
    <ListView
        android:id="@+id/pdf_listview_for_items"
        android:layout_
        android:layout_
        android:orientation="vertical" />
</LinearLayout>

这里是项目的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>
    <TextView
        android:id="@+id/pdf_print_station_one"
        android:layout_
        android:layout_
        android:text="TextView" />
   <!-- and some more text views-->
</LinearLayout>

还有 ArrayAdapter:

public class PdfArrayAdapter extends ArrayAdapter 
public PdfArrayAdapter(Context context, List <PersonData> personDataList) 
    super(context, 0, personDataList);


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
    if (convertView == null) 
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.pdf_print_item, parent, false);
    
    PersonData personData = (PersonData) getItem(position);
    TextView stationone = convertView.findViewById(R.id.pdf_print_station_one);
    stationone.setText(personData.getStationonetime());
    //And some more TextViews
    return convertView;

我得到一个 A4 页面,其标题文本包括空的 ListView(通过更改背景颜色进行检查)但没有项目。调试 ArrayAdapter 显示设置 Adapter 后未调用 getView()。

将 ListView 更改为 LinearLayout 并添加以下项目:

LinearLayout linearlayout = view.findViewById(R.id.pdf_linerlayout_for_items);
for (int i = 0; i < pdfArrayAdapter.getCount(); i++) 
                    linearlayout.addView(pdfArrayAdapter.getView(i, null, linearlayout));
                

导致调用 getView 但不会更改 pdf 中的任何内容。由于数据库调用,代码是从异步任务中调用的。

【问题讨论】:

【参考方案1】:

问题是高度和宽度的计算。

需要设置 ArrayAdapter 之后完成。

【讨论】:

以上是关于从膨胀的 XML 将适配器设置为 ListView 以打印 PDF - 缺少项目的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义适配器绕过 ListView 的 onListItemClick()

尝试从 parse.com 获取数据(文本),然后提供给基本适配器,然后将此适配器设置为 listview

Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

如何根据其在 onCreateViewHolder 方法中的位置在 RecyclerView 中膨胀不同的布局

ListView 根本不显示

在 Android 中以编程方式创建带有自定义列表项的 ListView - 没有 xml 列表项布局