Aller au contenu principal

Meilleures bibliothèques PDF Android

Meilleures bibliothèques PDF Android cette année.

PDF signifie Portable Document Format. Il s'agit d'un format de fichier développé dans les années 1990 pour présenter des documents, y compris le formatage du texte et des images, d'une manière indépendante des logiciels d'application, du matériel et des systèmes d'exploitation.

PDF a été publié pour la première fois il y a 24 ans le 15 juin 1993 par Adobe, mais est maintenant une norme ouverte maintenue par l'Organisation internationale de normalisation (ISO).

Il existe de nombreuses applications de lecture PDF gratuites et commerciales pour les appareils Android. Cependant, en tant que développeurs, nous devrions créer nos propres petits lecteurs pdf que nous et nos amis pouvons peut-être utiliser.

Ce n'est pas aussi difficile qu'on pourrait le penser et plusieurs bibliothèques open source existent pour vous aider.

Dans cet article, nous examinerons certaines de ces bibliothèques et probablement des extraits de la façon de les utiliser.

Commençons.

1. AndroidPdfViewer

Il s'agit d'une bibliothèque open source pour l'affichage de documents PDF. Ces PDF sont rendus avec PdfiumAndroid.

AndroidPdfViewer est actuellement la bibliothèque Android PDF View la plus populaire. Il est maintenu par bartesk et il a publié différentes versions de la bibliothèque indépendamment.

Par exemple, beaucoup de gens utilisent encore AndroidPdfView, mais il existe un AndroidPdfViewV1 et [AndroidPdfViewV2] (https://github.com/barteksc/AndroidPdfViewerV2).

Cette bibliothèque prend en charge les animations, gestes, zoom et double tap.

L'utilisation de cette bibliothèque est facile, très facile.

Tout d'abord, il vous suffit de l'inclure dans votre build.gradle au niveau de l'application :

implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

Puis dans votre mise en page :

<com.github.barteksc.pdfviewer.PDFView
android_id="@+id/pdfView"
android_layout_width="match_parent"
android_layout_height="match_parent"/>

Ensuite, vous pouvez charger le pdf à partir de différentes sources :

pdfView.fromUri(Uri)
or
pdfView.fromFile(File)
or
pdfView.fromBytes(byte[])
or
pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams
or
pdfView.fromSource(DocumentSource)
or
pdfView.fromAsset(String)
.pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default
.enableSwipe(true) // allows to block changing pages using swipe
.swipeHorizontal(false)
.enableDoubletap(true)
.defaultPage(0)
// allows to draw something on the current page, usually visible in the middle of the screen
.onDraw(onDrawListener)
// allows to draw something on all pages, separately for every page. Called only for visible pages
.onDrawAll(onDrawListener)
.onLoad(onLoadCompleteListener) // called after document is loaded and starts to be rendered
.onPageChange(onPageChangeListener)
.onPageScroll(onPageScrollListener)
.onError(onErrorListener)
.onPageError(onPageErrorListener)
.onRender(onRenderListener) // called after document is rendered for the first time
// called on single tap, return true if handled, false to toggle scroll handle visibility
.onTap(onTapListener)
.enableAnnotationRendering(false) // render annotations (such as comments, colors or forms)
.password(null)
.scrollHandle(null)
.enableAntialiasing(true) // improve rendering a little bit on low-res screens
// spacing between pages in dp. To define spacing color, set view background
.spacing(0)
.invalidPageColor(Color.WHITE) // color of page that is invalid and cannot be loaded
.load();

Exemple

Voici un exemple

@EActivity(R.layout.activity_main)
@OptionsMenu(R.menu.options)
public class PDFViewActivity extends AppCompatActivity implements OnPageChangeListener, OnLoadCompleteListener,
OnPageErrorListener {

private static final String TAG = PDFViewActivity.class.getSimpleName();

private final static int REQUEST_CODE = 42;
public static final int PERMISSION_CODE = 42042;

public static final String SAMPLE_FILE = "sample.pdf";
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";

@ViewById
PDFView pdfView;

@NonConfigurationInstance
Uri uri;

@NonConfigurationInstance
Integer pageNumber = 0;

String pdfFileName;

@OptionsItem(R.id.pickFile)
void pickFile() {
int permissionCheck = ContextCompat.checkSelfPermission(this,
READ_EXTERNAL_STORAGE);

if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
new String[]{READ_EXTERNAL_STORAGE},
PERMISSION_CODE
);

return;
}

launchPicker();
}

void launchPicker() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/pdf");
try {
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
//alert user that file manager not working
Toast.makeText(this, R.string.toast_pick_file_error, Toast.LENGTH_SHORT).show();
}
}

@AfterViews
void afterViews() {
pdfView.setBackgroundColor(Color.LTGRAY);
if (uri != null) {
displayFromUri(uri);
} else {
displayFromAsset(SAMPLE_FILE);
}
setTitle(pdfFileName);
}

private void displayFromAsset(String assetFileName) {
pdfFileName = assetFileName;

pdfView.fromAsset(SAMPLE_FILE)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.spacing(10) // in dp
.onPageError(this)
.pageFitPolicy(FitPolicy.BOTH)
.load();
}

private void displayFromUri(Uri uri) {
pdfFileName = getFileName(uri);

pdfView.fromUri(uri)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.spacing(10) // in dp
.onPageError(this)
.load();
}

@OnActivityResult(REQUEST_CODE)
public void onResult(int resultCode, Intent intent) {
if (resultCode == RESULT_OK) {
uri = intent.getData();
displayFromUri(uri);
}
}

@Override
public void onPageChanged(int page, int pageCount) {
pageNumber = page;
setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
}

public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
if (result == null) {
result = uri.getLastPathSegment();
}
return result;
}

@Override
public void loadComplete(int nbPages) {
PdfDocument.Meta meta = pdfView.getDocumentMeta();
Log.e(TAG, "title = " + meta.getTitle());
Log.e(TAG, "author = " + meta.getAuthor());
Log.e(TAG, "subject = " + meta.getSubject());
Log.e(TAG, "keywords = " + meta.getKeywords());
Log.e(TAG, "creator = " + meta.getCreator());
Log.e(TAG, "producer = " + meta.getProducer());
Log.e(TAG, "creationDate = " + meta.getCreationDate());
Log.e(TAG, "modDate = " + meta.getModDate());

printBookmarksTree(pdfView.getTableOfContents(), "-");

}

public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
for (PdfDocument.Bookmark b : tree) {

Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

if (b.hasChildren()) {
printBookmarksTree(b.getChildren(), sep + "-");
}
}
}

/**
* Listener for response to user permission request
*
* @param requestCode Check that permission request code matches
* @param permissions Permissions that requested
* @param grantResults Whether permissions granted
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
if (requestCode == PERMISSION_CODE) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
launchPicker();
}
}
}

@Override
public void onPageError(int page, Throwable t) {
Log.e(TAG, "Cannot load page " + page);
}
}

Référence

NonLin
1.Parcourir Exemple
2.Lire la suite
3.Téléchargement direct

2. PDFAndroid

Le même auteur d'AndroidPdfViewer, bartesk a dérivé PdfiumAndroid à partir de son dépôt d'origine et a maintenu et ajouté quelques documentation également.

Le PdfiumAndroid original n'a pas été maintenu.

Ainsi, la version fourchue contient de la documentation et est activement maintenue.

Il l'a forké pour l'utiliser avec le populaire AndroidPdfViewer.

Cependant, vous pouvez également l'utiliser indépendamment.

Vous devez d'abord l'ajouter en tant que dépendance :

implementation 'com.github.barteksc:pdfium-android:1.8.2'

Alors voici un exemple simple :

void openPdf() {
ImageView iv = (ImageView) findViewById(R.id.imageView);
ParcelFileDescriptor fd = ...;
int pageNum = 0;
PdfiumCore pdfiumCore = new PdfiumCore(context);
try {
PdfDocument pdfDocument = pdfiumCore.newDocument(fd);

pdfiumCore.openPage(pdfDocument, pageNum);

int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum);
int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum);

// ARGB_8888 - best quality, high memory usage, higher possibility of OutOfMemoryError
// RGB_565 - little worse quality, twice less memory usage
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.RGB_565);
pdfiumCore.renderPageBitmap(pdfDocument, bitmap, pageNum, 0, 0,
width, height);
//if you need to render annotations and form fields, you can use
//the same method above adding 'true' as last param

iv.setImageBitmap(bitmap);

printInfo(pdfiumCore, pdfDocument);

pdfiumCore.closeDocument(pdfDocument); // important!
} catch(IOException ex) {
ex.printStackTrace();
}
}

public void printInfo(PdfiumCore core, PdfDocument doc) {
PdfDocument.Meta meta = core.getDocumentMeta(doc);
Log.e(TAG, "title = " + meta.getTitle());
Log.e(TAG, "author = " + meta.getAuthor());
Log.e(TAG, "subject = " + meta.getSubject());
Log.e(TAG, "keywords = " + meta.getKeywords());
Log.e(TAG, "creator = " + meta.getCreator());
Log.e(TAG, "producer = " + meta.getProducer());
Log.e(TAG, "creationDate = " + meta.getCreationDate());
Log.e(TAG, "modDate = " + meta.getModDate());

printBookmarksTree(core.getTableOfContents(doc), "-");

}

public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
for (PdfDocument.Bookmark b : tree) {

Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));

if (b.hasChildren()) {
printBookmarksTree(b.getChildren(), sep + "-");
}
}
}
VoirTélécharger
VoirTéléchargement direct

3. PdfBox-Android

PdfBox-Android est un portage de la bibliothèque PdfBox d'Apache pour être utilisable sur Android. La plupart des fonctionnalités de la bibliothèque parente doivent déjà être implémentées dans PdfBox-Android.

PdfBox-Android nécessite l'API Android 19 et plus pour une fonctionnalité complète.

PdfBox-Android est encore une autre bibliothèque nous permettant de rendre des documents PDF. Il a été écrit par Tom Roush et compte plusieurs contributeurs.

Le code principal du projet PdfBox-Android est sous licence Apache 2.0, disponible ici.

Cette bibliothèque existe depuis plus de 4 ans mais est toujours mise à jour régulièrement.

Installation de PdfBox-Android

Voici comment installer PdfBox-Android.

Accédez à votre build.gradle au niveau de l'application et ajoutez la déclaration d'implémentation :

dependencies {
implementation 'com.tom-roush:pdfbox-android:1.8.10.3'
}

Vous pouvez vérifier la dernière version ici.

Si vous utilisez Maven, alors :

<dependency>
<groupId>com.tom_roush</groupId>
<artifactId>pdfbox-android</artifactId>
<version>1.8.10.0</version>
<type>pom</type>
</dependency>

Avant d'effectuer des appels à PDFBox, il est fortement recommandé d'initialiser le chargeur de ressources de la bibliothèque. Ajoutez la ligne suivante avant d'appeler les méthodes PDFBox :

PDFBoxResourceLoader.init(getApplicationContext());

Exemple

Voici un exemple:

MainActivity.java

public class MainActivity extends Activity {
File root;
AssetManager assetManager;
Bitmap pageImage;
TextView tv;

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

@Override
protected void onStart() {
super.onStart();
setup();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

/**
* Initializes variables used for convenience
*/
private void setup() {
// Enable Android asset loading
PDFBoxResourceLoader.init(getApplicationContext());
// Find the root of the external storage.

root = getApplicationContext().getCacheDir();
assetManager = getAssets();
tv = (TextView) findViewById(R.id.statusTextView);
}

/**
* Creates a new PDF from scratch and saves it to a file
*/
public void createPdf(View v) {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

// Create a new font object selecting one of the PDF base fonts
PDFont font = PDType1Font.HELVETICA;
// Or a custom font
// try
// {
// // Replace MyFontFile with the path to the asset font you'd like to use.
// // Or use LiberationSans "com/tom_roush/pdfbox/resources/ttf/LiberationSans-Regular.ttf"
// font = PDType0Font.load(document, assetManager.open("MyFontFile.TTF"));
// }
// catch (IOException e)
// {
// Log.e("PdfBox-Android-Sample", "Could not load font", e);
// }

PDPageContentStream contentStream;

try {
// Define a content stream for adding to the PDF
contentStream = new PDPageContentStream(document, page);

// Write Hello World in blue text
contentStream.beginText();
contentStream.setNonStrokingColor(15, 38, 192);
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello World");
contentStream.endText();

// Load in the images
InputStream in = assetManager.open("falcon.jpg");
InputStream alpha = assetManager.open("trans.png");

// Draw a green rectangle
contentStream.addRect(5, 500, 100, 100);
contentStream.setNonStrokingColor(0, 255, 125);
contentStream.fill();

// Draw the falcon base image
PDImageXObject ximage = JPEGFactory.createFromStream(document, in);
contentStream.drawImage(ximage, 20, 20);

// Draw the red overlay image
Bitmap alphaImage = BitmapFactory.decodeStream(alpha);
PDImageXObject alphaXimage = LosslessFactory.createFromImage(document, alphaImage);
contentStream.drawImage(alphaXimage, 20, 20 );

// Make sure that the content stream is closed:
contentStream.close();

// Save the final pdf document to a file
String path = root.getAbsolutePath() + "/Created.pdf";
document.save(path);
document.close();
tv.setText("Successfully wrote PDF to " + path);

} catch (IOException e) {
Log.e("PdfBox-Android-Sample", "Exception thrown while creating PDF", e);
}
}

/**
* Loads an existing PDF and renders it to a Bitmap
*/
public void renderFile(View v) {
// Render the page and save it to an image file
try {
// Load in an already created PDF
PDDocument document = PDDocument.load(assetManager.open("Created.pdf"));
// Create a renderer for the document
PDFRenderer renderer = new PDFRenderer(document);
// Render the image to an RGB Bitmap
pageImage = renderer.renderImage(0, 1, ImageType.RGB);

// Save the render result to an image
String path = root.getAbsolutePath() + "/render.jpg";
File renderFile = new File(path);
FileOutputStream fileOut = new FileOutputStream(renderFile);
pageImage.compress(Bitmap.CompressFormat.JPEG, 100, fileOut);
fileOut.close();
tv.setText("Successfully rendered image to " + path);
// Optional: display the render result on screen
displayRenderedImage();
}
catch (IOException e)
{
Log.e("PdfBox-Android-Sample", "Exception thrown while rendering file", e);
}
}

/**
* Fills in a PDF form and saves the result
*/
public void fillForm(View v) {
try {
// Load the document and get the AcroForm
PDDocument document = PDDocument.load(assetManager.open("FormTest.pdf"));
PDDocumentCatalog docCatalog = document.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();

// Fill the text field
PDTextField field = (PDTextField) acroForm.getField("TextField");
field.setValue("Filled Text Field");
// Optional: don't allow this field to be edited
field.setReadOnly(true);

PDField checkbox = acroForm.getField("Checkbox");
((PDCheckBox) checkbox).check();

PDField radio = acroForm.getField("Radio");
((PDRadioButton)radio).setValue("Second");

PDField listbox = acroForm.getField("ListBox");
List<Integer> listValues = new ArrayList<>();
listValues.add(1);
listValues.add(2);
((PDListBox) listbox).setSelectedOptionsIndex(listValues);

PDField dropdown = acroForm.getField("Dropdown");
((PDComboBox) dropdown).setValue("Hello");

String path = root.getAbsolutePath() + "/FilledForm.pdf";
tv.setText("Saved filled form to " + path);
document.save(path);
document.close();
} catch (IOException e) {
Log.e("PdfBox-Android-Sample", "Exception thrown while filling form fields", e);
}
}

/**
* Strips the text from a PDF and displays the text on screen
*/
public void stripText(View v) {
String parsedText = null;
PDDocument document = null;
try {
document = PDDocument.load(assetManager.open("Hello.pdf"));
} catch(IOException e) {
Log.e("PdfBox-Android-Sample", "Exception thrown while loading document to strip", e);
}

try {
PDFTextStripper pdfStripper = new PDFTextStripper();
pdfStripper.setStartPage(0);
pdfStripper.setEndPage(1);
parsedText = "Parsed text: " + pdfStripper.getText(document);
}
catch (IOException e)
{
Log.e("PdfBox-Android-Sample", "Exception thrown while stripping text", e);
} finally {
try {
if (document != null) document.close();
}
catch (IOException e)
{
Log.e("PdfBox-Android-Sample", "Exception thrown while closing document", e);
}
}
tv.setText(parsedText);
}

/**
* Creates a simple pdf and encrypts it
*/
public void createEncryptedPdf(View v)
{
String path = root.getAbsolutePath() + "/crypt.pdf";

int keyLength = 128; // 128 bit is the highest currently supported

// Limit permissions of those without the password
AccessPermission ap = new AccessPermission();
ap.setCanPrint(false);

// Sets the owner password and user password
StandardProtectionPolicy spp = new StandardProtectionPolicy("12345", "hi", ap);

// Setups up the encryption parameters
spp.setEncryptionKeyLength(keyLength);
spp.setPermissions(ap);
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.addProvider(provider);

PDFont font = PDType1Font.HELVETICA;
PDDocument document = new PDDocument();
PDPage page = new PDPage();

document.addPage(page);

try
{
PDPageContentStream contentStream = new PDPageContentStream(document, page);

// Write Hello World in blue text
contentStream.beginText();
contentStream.setNonStrokingColor(15, 38, 192);
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello World");
contentStream.endText();
contentStream.close();

// Save the final pdf document to a file
document.protect(spp); // Apply the protections to the PDF
document.save(path);
document.close();
tv.setText("Successfully wrote PDF to " + path);

}
catch (IOException e)
{
Log.e("PdfBox-Android-Sample", "Exception thrown while creating PDF for encryption", e);
}
}

/**
* Helper method for drawing the result of renderFile() on screen
*/
private void displayRenderedImage() {
new Thread() {
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
ImageView imageView = (ImageView) findViewById(R.id.renderedImageView);
imageView.setImageBitmap(pageImage);
}
});
}
}.start();
}
}

Référence

Obtenez PdfBox-Android ci-dessous :

NonLocalisationLien
1.GitHubExemple
2.GitHubTéléchargement direct
3.GitHubParcourir

4. PdfViewPager

Widget Android pouvant afficher des documents PDF stockés sur une carte SD, liés en tant qu'actifs ou téléchargés à partir d'une URL distante.

Ce widget peut afficher des documents PDF dans vos activités ou fragments.

Remarque importante : PDFViewPager utilise la classe PdfRenderer, quifonctionne uniquement sur API 21 ou supérieur. Voir Document officiel pour plus de détails.

Voici la démo :

PDFViewpager

Étape 1 : Installez-le

Installez-le en ajoutant la déclaration d'implémentation suivante dans votre fichier build.gradle au niveau de l'application :

implementation 'es.voghdev.pdfviewpager:library:1.1.2'

### Étape 2 : Étape Ajouter à la mise en page

PDFViewPager peut être ajouté à une page de manière déclarative ou impérative. Pour l'ajouter de manière déclarative, ajoutez ce qui suit à votre mise en page :

<es.voghdev.pdfviewpager.library.PDFViewPager
android:id="@+id/pdfViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

Étape 3 : Écrire le code

Charger des PDF à partir du dossier d'actifs

Si votre fichier PDF se trouve dans le dossier des ressources, copiez-le dans le répertoire de cache.

CopyAsset copyAsset = new CopyAssetThreadImpl(context, new Handler());
copyAsset.copy(asset, new File(getCacheDir(), "sample.pdf").getAbsolutePath(

Vous pouvez ensuite le charger comme suit :

<es.voghdev.pdfviewpager.library.PDFViewPager
android:id="@+id/pdfViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:assetFileName="sample.pdf"/>

ou comme ceci :

pdfViewPager = new PDFViewPager(this, "sample.pdf");

Libérez ensuite les ressources en fermant close() comme ceci :

@Override
protected void onDestroy() {
super.onDestroy();

((PDFPagerAdapter) pdfViewPager.getAdapter()).close();
}

Charger des PDF à partir de la carte SD

Si vos fichiers PDF se trouvent sur la carte SD, créez un objet PDFViewPager, en transmettant l'emplacement du fichier sur votre carte SD

PDFViewPager pdfViewPager = new PDFViewPager(context, getPdfPathOnSDCard());

protected String getPdfPathOnSDCard() {
File f = new File(getExternalFilesDir("pdf"), "adobe.pdf");
return f.getAbsolutePath();
}

Libérez ensuite les ressources occupées :

    @Override
protected void onDestroy() {
super.onDestroy();

((PDFPagerAdapter) pdfViewPager.getAdapter()).close();
}

Comment charger des fichiers PDF à partir de sources distantes

Commencez par ajouter les autorisations suivantes dans votre manifeste Android :

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Faites ensuite en sorte que votre activité ou votre fragment implémente DownloadFile.Listener :

public class RemotePDFActivity extends AppCompatActivity implements DownloadFile.Listener {

Créez ensuite un objet RemotePDFViewPager :

String url = "http://www.cals.uidaho.edu/edComm/curricula/CustRel_curriculum/content/sample.pdf";

RemotePDFViewPager remotePDFViewPager =
new RemotePDFViewPager(context, url, this);

Gérez ensuite les événements :

@Override
public void onSuccess(String url, String destinationPath) {
// That's the positive case. PDF Download went fine

adapter = new PDFPagerAdapter(this, "AdobeXMLFormsSamples.pdf");
remotePDFViewPager.setAdapter(adapter);
setContentView(remotePDFViewPager);
}

@Override
public void onFailure(Exception e) {
// This will be called if download fails
}

@Override
public void onProgressUpdate(int progress, int total) {
// You will get download progress here
// Always on UI Thread so feel free to update your views here
}

Et bien sûr fermez l'adaptateur :

@Override
protected void onDestroy() {
super.onDestroy();

adapter.close();
}

Trouvez des exemples complets ci-dessous.

Référence

NonLien
1.Parcourir Exemples
2.Lire plus
3.Suivre auteur de la bibliothèque