Skip to content

Instantly share code, notes, and snippets.

@TimoPtr
Created November 25, 2018 11:14
Show Gist options
  • Save TimoPtr/f6715c648c9a59bd6a573f3228663e51 to your computer and use it in GitHub Desktop.
Save TimoPtr/f6715c648c9a59bd6a573f3228663e51 to your computer and use it in GitHub Desktop.
PdfAdapter to display a pdf into a list view with some gesture support like zoom
import android.graphics.Bitmap
import android.graphics.pdf.PdfRenderer
import androidx.recyclerview.widget.RecyclerView
import android.util.Log
import android.view.ViewGroup
import com.davemorrissey.labs.subscaleview.ImageSource
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
/**
* Created by timothynibeaudeau on 25/11/2018.
*
* Work with com.davemorrissey.labs:subsampling-scale-image-view:3.10.0
* https://github.com/davemorrissey/subsampling-scale-image-view
*/
class PdfAdapter(private val pdfRenderer: PdfRenderer) : RecyclerView.Adapter<PdfAdapter.ViewHolder>() {
private val TAG = PdfAdapter::class.java.simpleName
private val count = pdfRenderer.pageCount
private val bitmapGenerated = HashMap<Int, Bitmap>(pdfRenderer.pageCount)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = SubsamplingScaleImageView(parent.context)
view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
return ViewHolder(view)
}
override fun getItemCount(): Int = count
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(createBitmap(position))
}
private fun createBitmap(index: Int): Bitmap {
var bitmap = bitmapGenerated[index]
if (bitmap == null) {
Log.d(TAG, "create a new Bitmap for page $index")
val page = pdfRenderer.openPage(index)
bitmap = Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888)
bitmap?.let {
page.render(it, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
}
page.close()
}
return bitmap!!
}
class ViewHolder(private val view: SubsamplingScaleImageView) : RecyclerView.ViewHolder(view) {
fun bind(bitmap: Bitmap) {
view.setImage(ImageSource.bitmap(bitmap))
view.isZoomEnabled = true
}
}
}
@TimoPtr
Copy link
Author

TimoPtr commented Nov 25, 2018

bitmap!! can create a nullptr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment