Guest User

Untitled

a guest
Nov 23rd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. class CarNewsAdapter(
  2. private val context: Context,
  3. private val dateTimeFormatter: DateTimeFormatter,
  4. private val recycler: RecyclerView,
  5. private val callback: Callback,
  6. private val onLoadMoreListener: OnLoadMoreListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
  7. private val imageRoundedTransformation = RoundedCornersTransformation(context, 8, 0)
  8. private var isLoading = false
  9. private var visibleThreshold = THRESHOLD_LIMIT
  10. private var lastVisibleItem = 0
  11. private var totalItemCount = 0
  12. private var layoutManager = recycler.layoutManager as LinearLayoutManager
  13. private var scrollListener: RecyclerView.OnScrollListener = object : RecyclerView.OnScrollListener() {
  14. override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
  15. super.onScrolled(recyclerView, dx, dy)
  16. totalItemCount = layoutManager.itemCount
  17. lastVisibleItem = layoutManager.findLastVisibleItemPosition()
  18. if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
  19. onLoadMoreListener.onLoadMore()
  20. isLoading = true
  21. }
  22. }
  23. }
  24.  
  25. init {
  26. recycler.addOnScrollListener(scrollListener)
  27. }
  28.  
  29. interface Callback {
  30. fun onItemClick(item: CarNewsViewItem)
  31. }
  32.  
  33. class ItemViewHolder(view: View, adapter: CarNewsAdapter) : RecyclerView.ViewHolder(view) {
  34. init {
  35. view.setOnClickListener {
  36. adapter.callback.onItemClick(it?.tag as CarNewsViewItem)
  37. }
  38. }
  39. }
  40.  
  41. class ProgressViewHolder(view: View) : RecyclerView.ViewHolder(view)
  42.  
  43. private val items: MutableList<CarNewsViewItem?> = arrayListOf()
  44.  
  45. fun clear() {
  46. items.clear()
  47. }
  48.  
  49. fun addItems(items: List<CarNewsViewItem?>) {
  50. val ind = itemCount
  51. if (ind > 0) {
  52. removeItem(ind - 1)
  53. notifyItemRemoved(ind - 1)
  54. }
  55. if (items.isNotEmpty()) {
  56. this.items.addAll(items)
  57. notifyItemRangeInserted(itemCount, items.size)
  58. addProgressItem()
  59. notifyItemInserted(itemCount)
  60. } else {
  61. recycler.removeOnScrollListener(scrollListener)
  62. }
  63. setLoaded()
  64. }
  65.  
  66. fun addProgressItem() {
  67. this.items.add(null)
  68. }
  69.  
  70. fun getItem(position: Int): CarNewsViewItem? {
  71. if (position < items.size) {
  72. return items[position]
  73. }
  74. return null
  75. }
  76.  
  77. fun removeItem(position: Int) {
  78. if (position < items.size) {
  79. items.removeAt(position)
  80. }
  81. }
  82.  
  83. private fun setLoaded() {
  84. isLoading = false
  85. }
  86.  
  87. override fun getItemViewType(position: Int): Int {
  88. return if (items[position] != null) VIEW_TYPE_ITEM else VIEW_TYPE_LOADING
  89. }
  90.  
  91. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder? {
  92. if (viewType == VIEW_TYPE_ITEM) {
  93. val view = LayoutInflater.from(context).inflate(R.layout.list_item_car_news, parent, false)
  94. return ItemViewHolder(view, this)
  95. } else if (viewType == VIEW_TYPE_LOADING) {
  96. val view = LayoutInflater.from(context).inflate(R.layout.list_item_progress, parent, false)
  97. return ProgressViewHolder(view)
  98. }
  99.  
  100. return null
  101. }
  102.  
  103. override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
  104. when (holder) {
  105. is ItemViewHolder -> {
  106. val item = items[position]
  107. with(holder.itemView) {
  108. item?.let {
  109. tag = it
  110. title.text = it.title
  111. date.text = dateTimeFormatter.formatDate(it.date)
  112. Glide.with(context)
  113. .load(it.image)
  114. .fitCenter()
  115. .centerCrop()
  116. .bitmapTransform(imageRoundedTransformation)
  117. .into(image)
  118. }
  119. }
  120. }
  121.  
  122. is ProgressViewHolder -> {
  123. holder.itemView.progress.isIndeterminate = true
  124. }
  125. }
  126. }
  127.  
  128. override fun getItemCount(): Int {
  129. return items.size
  130. }
  131.  
  132. }
  133.  
  134. private const val VIEW_TYPE_ITEM = 0
  135. private const val VIEW_TYPE_LOADING = 1
  136. private const val THRESHOLD_LIMIT = 5
Add Comment
Please, Sign In to add comment