diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/LoadingViewHolder.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/LoadingViewHolder.kt new file mode 100644 index 0000000..180e47f --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/LoadingViewHolder.kt @@ -0,0 +1,19 @@ +package com.outsmart.os_arturito.Components.ListComponent + +import android.support.v7.widget.RecyclerView +import android.view.View +import android.view.ViewGroup + +class LoadingViewHolder(itemView: View) : OSAdapter.OSViewHolder(itemView) { + + override fun bindView(position: Int) { + setLayoutParameterToMatchParent() + } + + private fun setLayoutParameterToMatchParent() { + val layoutParameter = RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT) + itemView.layoutParams = layoutParameter + } +} \ No newline at end of file diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapter.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapter.kt new file mode 100644 index 0000000..7958b80 --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapter.kt @@ -0,0 +1,157 @@ +package com.outsmart.os_arturito.Components.ListComponent + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.outsmart.os_arturito.R + +abstract class OSAdapter( + private var isInitialLoading: Boolean = true +) : RecyclerView.Adapter() { + + val dataList: MutableList = mutableListOf() + private var placeHolderText = "" + private var paginationListener: GenericAdapterListener? = null + private var isPlaceholder = false + private var hasMoreItems = false + private val loadMoreLayout = R.layout.component_load_more + private val loadingLayout = R.layout.component_loading + + init { + setupInitialLoading() + } + + private fun setupInitialLoading() { + if (isInitialLoading) { + notifyDataSetChanged() + } + } + + fun setDataToAdapterAndNotifyChanges(dataList: List) { + clearDataAndCheckIfListIsEmpty(dataList) + notifyDataSetChanged() + } + + fun setHasMoreItems(hasMoreItems: Boolean) { + this.hasMoreItems = hasMoreItems + } + + private fun clearDataAndCheckIfListIsEmpty(dataList: List) { + removeInitialLoading() + this.dataList.clear() + checkIfListIsNotEmpty(dataList) + } + + private fun removeInitialLoading() { + isInitialLoading = false + } + + private fun checkIfListIsNotEmpty(dataList: List) { + if (dataList.isNotEmpty()) { + setNewDataAndRemovePlaceHolder(dataList) + } else { + addPlaceHolder() + } + } + + private fun setNewDataAndRemovePlaceHolder(dataList: List) { + this.dataList.addAll(dataList) + isPlaceholder = false + } + + private fun addPlaceHolder() { + isPlaceholder = true + } + + fun setPlaceHolderText(placeHolderText: String) { + this.placeHolderText = placeHolderText + } + + fun setPaginationListener(paginationListener: GenericAdapterListener) { + this.paginationListener = paginationListener + } + + override fun getItemCount(): Int { + return if (isPlaceholderOrInitialLoadingSet()) { + OSAdapterConstants.PLACEHOLDER_COUNT + } else { + getListSize() + } + } + + private fun isPlaceholderOrInitialLoadingSet(): Boolean { + return isPlaceholder && placeHolderText.isNotBlank() || isInitialLoading + } + + private fun getListSize(): Int { + return if (hasMoreItems) { + dataList.size.plus(1) + } else { + dataList.size + } + } + + override fun getItemViewType(position: Int): Int { + return when { + isPlaceholderSet() -> OSAdapterConstants.PLACEHOLDER + isInitialLoading -> OSAdapterConstants.INITIAL_LOADING + checkForMoreItems(position) -> OSAdapterConstants.PAGE_LOADING + else -> setViewTypes(position) + } + } + + private fun checkForMoreItems(position: Int): Boolean { + return position == dataList.size + } + + private fun isPlaceholderSet(): Boolean { + return isPlaceholder && placeHolderText.isNotBlank() + } + + abstract fun setViewTypes(position: Int): Int + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OSViewHolder { + return when (viewType) { + OSAdapterConstants.PLACEHOLDER -> getPlaceholderViewHolder(parent) + OSAdapterConstants.PAGE_LOADING -> getLoadMoreViewHolder(parent) + OSAdapterConstants.INITIAL_LOADING -> getInitialLoadingViewHolder(parent) + else -> getViewHolder(parent, viewType) + } + } + + private fun getInitialLoadingViewHolder(parent: ViewGroup): OSViewHolder { + return LoadingViewHolder(getInflatedLayout(parent, R.layout.component_loading)) + } + + private fun getLoadMoreViewHolder(parent: ViewGroup): OSViewHolder { + return PageLoadingViewHolder(getInflatedLayout(parent, loadMoreLayout)) + } + + private fun getInflatedLayout(parent: ViewGroup, layout: Int): View { + return LayoutInflater.from(parent.context).inflate(layout, parent, false) + } + + abstract fun getViewHolder(parent: ViewGroup, viewType: Int): OSViewHolder + + private fun getPlaceholderViewHolder(parent: ViewGroup): OSViewHolder { + return PlaceholderViewHolder( + itemView = PlaceholderView(context = parent.context), + placeholderText = placeHolderText) + } + + override fun onBindViewHolder(holder: OSViewHolder, position: Int) { + holder.bindView(position) + paginateOnLastBind(position) + } + + private fun paginateOnLastBind(position: Int) { + if (position == dataList.lastIndex) { + paginationListener?.paginate() + } + } + + abstract class OSViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + abstract fun bindView(position: Int) + } +} \ No newline at end of file diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapterConstants.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapterConstants.kt new file mode 100644 index 0000000..0e56fd3 --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/OSAdapterConstants.kt @@ -0,0 +1,9 @@ +package com.outsmart.os_arturito.Components.ListComponent + +object OSAdapterConstants { + + const val PLACEHOLDER = 1000 + const val PAGE_LOADING = 1001 + const val INITIAL_LOADING = 1002 + const val PLACEHOLDER_COUNT = 1 +} \ No newline at end of file diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PageLoadingViewHolder.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PageLoadingViewHolder.kt new file mode 100644 index 0000000..66ab61b --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PageLoadingViewHolder.kt @@ -0,0 +1,10 @@ +package com.outsmart.os_arturito.Components.ListComponent + +import android.view.View + +class PageLoadingViewHolder(itemView: View) : OSAdapter.OSViewHolder(itemView) { + + override fun bindView(position: Int) { + //no bind is needed, this is a visual holder + } +} \ No newline at end of file diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderView.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderView.kt new file mode 100644 index 0000000..4debf88 --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderView.kt @@ -0,0 +1,21 @@ +package com.outsmart.os_arturito.Components.ListComponent + +import android.content.Context +import android.support.constraint.ConstraintLayout +import android.util.AttributeSet +import android.view.LayoutInflater +import com.outsmart.os_arturito.R +import kotlinx.android.synthetic.main.component_list_placeholder.view.* + +class PlaceholderView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + init { + LayoutInflater.from(context).inflate(R.layout.component_list_placeholder, this) + } + + fun setText(placeholderText: String) { + listPlaceholderText.text = placeholderText + } +} \ No newline at end of file diff --git a/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderViewHolder.kt b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderViewHolder.kt new file mode 100644 index 0000000..cee4d9b --- /dev/null +++ b/os-arturito/src/main/java/com/outsmart/os_arturito/Components/ListComponent/PlaceholderViewHolder.kt @@ -0,0 +1,23 @@ +package com.outsmart.os_arturito.Components.ListComponent + +import android.support.v7.widget.RecyclerView +import android.view.View +import android.view.ViewGroup + +class PlaceholderViewHolder( + itemView: View, + private val placeholderText: String) : OSAdapter.OSViewHolder(itemView) { + + override fun bindView(position: Int) { + (itemView as PlaceholderView).setText(placeholderText) + setLayoutParametersToMatchParent(itemView) + } + + private fun setLayoutParametersToMatchParent(itemView: PlaceholderView) { + val layoutParameter = RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT) + itemView.layoutParams = layoutParameter + } + +} \ No newline at end of file diff --git a/os-arturito/src/main/res/layout/component_list_placeholder.xml b/os-arturito/src/main/res/layout/component_list_placeholder.xml new file mode 100644 index 0000000..56b86f2 --- /dev/null +++ b/os-arturito/src/main/res/layout/component_list_placeholder.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/os-arturito/src/main/res/layout/component_load_more.xml b/os-arturito/src/main/res/layout/component_load_more.xml new file mode 100644 index 0000000..638a2d1 --- /dev/null +++ b/os-arturito/src/main/res/layout/component_load_more.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/os-arturito/src/main/res/layout/component_loading.xml b/os-arturito/src/main/res/layout/component_loading.xml new file mode 100644 index 0000000..6328dd4 --- /dev/null +++ b/os-arturito/src/main/res/layout/component_loading.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file