Установите для адаптера ListView из завышенного XML для печати PDF - недостающие элементы - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать PDF-файл из раздутого xml макета. В этом макете есть 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://stackoverflow.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"));

Вот родительский XML, включая ListView:

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

Вот XML для элементов:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/pdf_print_station_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        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 показывает, что 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. Код вызывается из задачи asyn c из-за вызова базы данных.

1 Ответ

0 голосов
/ 14 мая 2020

Проблема заключалась в расчете высоты и ширины.

Это нужно сделать ПОСЛЕ установки ArrayAdapter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...