├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── kotlin │ └── erikjhordanrey │ │ └── github │ │ └── io │ │ ├── data │ │ └── DataProvider.kt │ │ ├── domain │ │ ├── News.kt │ │ └── Trending.kt │ │ └── ui │ │ ├── HomeActivity.kt │ │ └── adapter │ │ ├── NewsAdapter.kt │ │ ├── NewsDiffCallback.kt │ │ ├── NewsViewHolder.kt │ │ ├── TopicsHeaderAdapter.kt │ │ ├── TopicsHeaderViewHolder.kt │ │ ├── TrendingAdapter.kt │ │ ├── TrendingDiffCallback.kt │ │ ├── TrendingViewHolder.kt │ │ └── TrendingViewTypeViewHolder.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_home.xml │ ├── item_news.xml │ ├── item_topics_header.xml │ ├── item_trending.xml │ └── item_trending_view_type.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── art └── Screenshot.png ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | .idea 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RecyclerView-ConcatAdapter 2 | 3 | The main goal is to practice [RecyclerView ConcatAdapter](https://developer.android.com/jetpack/androidx/releases/recyclerview#version_120_2) 4 | a new RecyclerView Adapter that can combine multiple adapters linearly. 5 | 6 | Read more about [Concatenate adapters sequentially with ConcatAdapter](https://medium.com/androiddevelopers/merge-adapters-sequentially-with-mergeadapter-294d2942127a) by Florina Muntenescu. 7 | 8 | ## Sample 9 | 10 | **LinearLayoutManager (Vertical)** 11 | 12 | 13 | 14 | ```xml 15 | 16 | 20 | 21 | ``` 22 | 23 | 24 | Try adding horizontal orientation `android:orientation="horizontal"` to GridLayoutManager or LinearLayoutManager. 25 | 26 | Do you want to contribute? 27 | -------------------------- 28 | Feel free to report or add any useful feature, I will be glad to improve it with your help. 29 | 30 | Developed By 31 | ------------ 32 | 33 | * Erik Jhordan Rey - 34 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 29 7 | buildToolsVersion "29.0.3" 8 | 9 | defaultConfig { 10 | applicationId "erikjhordanrey.github.io" 11 | minSdkVersion 21 12 | targetSdkVersion 29 13 | versionCode 1 14 | versionName "1.0" 15 | } 16 | 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | 24 | buildFeatures { 25 | viewBinding = true 26 | } 27 | 28 | sourceSets { 29 | main.java.srcDirs += 'src/main/kotlin' 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 35 | implementation 'androidx.appcompat:appcompat:1.3.0' 36 | implementation 'androidx.core:core-ktx:1.5.0' 37 | implementation 'com.google.android.material:material:1.3.0' 38 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 39 | implementation 'androidx.recyclerview:recyclerview:1.2.0' 40 | } 41 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/data/DataProvider.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.data 2 | 3 | import erikjhordanrey.github.io.domain.News 4 | import erikjhordanrey.github.io.domain.Trending 5 | import java.util.Random 6 | import java.util.Timer 7 | import java.util.TimerTask 8 | 9 | import java.util.concurrent.TimeUnit 10 | 11 | private const val PERIOD_SECONDS: Long = 2 12 | private const val MIN_INDEX = 0 13 | 14 | private val timer = Timer() 15 | private val random = Random() 16 | private val period = TimeUnit.SECONDS.toMillis(PERIOD_SECONDS) 17 | 18 | internal fun newsReceiver(onNewsList: ((List) -> Unit)) { 19 | timer.schedule(object : TimerTask() { 20 | override fun run() { 21 | val newsList = createNewsList() 22 | var randomMax = random.nextInt(newsList.size) 23 | 24 | when (randomMax) { 25 | MIN_INDEX -> { 26 | randomMax += 1 27 | } 28 | } 29 | onNewsList.invoke(newsList.subList(MIN_INDEX, randomMax)) 30 | } 31 | }, period, period) 32 | } 33 | 34 | fun createTrendingList() = mutableListOf().apply { 35 | for (i in 1..5) { 36 | add(Trending(i.toString(), "Trending $i", "${i * 1000} views")) 37 | } 38 | } 39 | 40 | fun createNewsList() = mutableListOf().apply { 41 | for (i in 1..10) { 42 | add(News("News $i", "Music · Yesterday")) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/domain/News.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.domain 2 | 3 | data class News(val title: String, val dateCategory: String) 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/domain/Trending.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.domain 2 | 3 | data class Trending(val id: String, val title: String, val viewsCounter: String) 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/HomeActivity.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import androidx.recyclerview.widget.ConcatAdapter 6 | import com.google.android.material.snackbar.Snackbar 7 | import erikjhordanrey.github.io.data.createNewsList 8 | import erikjhordanrey.github.io.data.createTrendingList 9 | import erikjhordanrey.github.io.data.newsReceiver 10 | import erikjhordanrey.github.io.databinding.ActivityHomeBinding 11 | import erikjhordanrey.github.io.ui.adapter.TopicsHeaderAdapter 12 | import erikjhordanrey.github.io.ui.adapter.NewsAdapter 13 | import erikjhordanrey.github.io.ui.adapter.TrendingAdapter 14 | 15 | class HomeActivity : AppCompatActivity() { 16 | 17 | private val topicsHeaderAdapter by lazy { TopicsHeaderAdapter() } 18 | private val trendingAdapter by lazy { TrendingAdapter() } 19 | private val newsAdapter by lazy { NewsAdapter() } 20 | 21 | private lateinit var binding: ActivityHomeBinding 22 | 23 | override fun onCreate(savedInstanceState: Bundle?) { 24 | super.onCreate(savedInstanceState) 25 | binding = ActivityHomeBinding.inflate(layoutInflater) 26 | setContentView(binding.root) 27 | initToolbar() 28 | initRecyclerView() 29 | initNewsReceiver() 30 | } 31 | 32 | private fun initToolbar() { 33 | setSupportActionBar(binding.toolbar) 34 | } 35 | 36 | private fun initRecyclerView() { 37 | val concatAdapter = ConcatAdapter(createTopicsHeaderAdapter(), createTrendingAdapter(), createNewsAdapter()) 38 | binding.recyclerView.adapter = concatAdapter 39 | } 40 | 41 | private fun createTopicsHeaderAdapter() = topicsHeaderAdapter.apply { 42 | onTopicsHeaderListener = { showSnackbar(it) } 43 | } 44 | 45 | private fun createTrendingAdapter() = trendingAdapter.apply { 46 | submitList(createTrendingList()) 47 | onTrendingListener = { showSnackbar(it.title) } 48 | onSeeMoreListener = { showSnackbar(it) } 49 | } 50 | 51 | private fun createNewsAdapter() = newsAdapter.apply { 52 | submitList(createNewsList()) 53 | onNewsListener = { showSnackbar(it.title) } 54 | } 55 | 56 | private fun initNewsReceiver() { 57 | newsReceiver { newsAdapter.submitList(it) } 58 | } 59 | 60 | private fun showSnackbar(message: String) = Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show() 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/NewsAdapter.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.ListAdapter 6 | import erikjhordanrey.github.io.databinding.ItemNewsBinding 7 | import erikjhordanrey.github.io.domain.News 8 | 9 | class NewsAdapter : ListAdapter(NewsDiffCallback()) { 10 | 11 | var onNewsListener: ((News) -> Unit)? = null 12 | 13 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 14 | NewsViewHolder(ItemNewsBinding.inflate(LayoutInflater.from(parent.context), parent, false), onNewsListener) 15 | 16 | override fun onBindViewHolder(holder: NewsViewHolder, position: Int) { 17 | val news = getItem(position) 18 | holder.bind(news) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/NewsDiffCallback.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import erikjhordanrey.github.io.domain.News 5 | 6 | class NewsDiffCallback : DiffUtil.ItemCallback() { 7 | 8 | override fun areItemsTheSame(oldItem: News, newItem: News) = 9 | oldItem.title == newItem.title && oldItem.dateCategory == newItem.dateCategory 10 | 11 | override fun areContentsTheSame(oldItem: News, newItem: News) = oldItem == newItem 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/NewsViewHolder.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import erikjhordanrey.github.io.databinding.ItemNewsBinding 5 | import erikjhordanrey.github.io.domain.News 6 | 7 | class NewsViewHolder(private val binding: ItemNewsBinding, 8 | private val onNewsListener: ((News) -> Unit)?) : RecyclerView.ViewHolder(binding.root) { 9 | 10 | fun bind(news: News) = news.run { 11 | binding.dateCategoryTextView.text = dateCategory 12 | binding.titleTextView.text = title 13 | itemView.setOnClickListener { onNewsListener?.invoke(this) } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TopicsHeaderAdapter.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.RecyclerView 6 | import erikjhordanrey.github.io.databinding.ItemTopicsHeaderBinding 7 | 8 | class TopicsHeaderAdapter : RecyclerView.Adapter() { 9 | 10 | var onTopicsHeaderListener: ((String) -> Unit)? = null 11 | 12 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = 13 | TopicsHeaderViewHolder(ItemTopicsHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false), 14 | onTopicsHeaderListener) 15 | 16 | override fun onBindViewHolder(holderTopics: TopicsHeaderViewHolder, position: Int) { 17 | holderTopics.bind() 18 | } 19 | 20 | override fun getItemCount() = HEADER 21 | 22 | companion object { 23 | private const val HEADER = 1 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TopicsHeaderViewHolder.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import erikjhordanrey.github.io.R 5 | import erikjhordanrey.github.io.databinding.ItemTopicsHeaderBinding 6 | 7 | class TopicsHeaderViewHolder(private val binding: ItemTopicsHeaderBinding, private val onTopicsHeaderListener: ((String) -> Unit)?) : RecyclerView.ViewHolder(binding.root) { 8 | 9 | fun bind() = itemView.run { 10 | val headerTitle = context.getString(R.string.header_text) 11 | binding.titleTextView.text = headerTitle 12 | setOnClickListener { onTopicsHeaderListener?.invoke(headerTitle) } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TrendingAdapter.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import android.view.LayoutInflater 4 | import android.view.ViewGroup 5 | import androidx.recyclerview.widget.ListAdapter 6 | import androidx.recyclerview.widget.RecyclerView 7 | import erikjhordanrey.github.io.databinding.ItemTrendingBinding 8 | import erikjhordanrey.github.io.databinding.ItemTrendingViewTypeBinding 9 | import erikjhordanrey.github.io.domain.Trending 10 | 11 | class TrendingAdapter : ListAdapter(TrendingDiffCallback()) { 12 | 13 | var onTrendingListener: ((Trending) -> Unit)? = null 14 | var onSeeMoreListener: ((String) -> Unit)? = null 15 | 16 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = LayoutInflater.from(parent.context).run { 17 | return@run when (viewType) { 18 | ITEM_TRENDING_TYPE -> TrendingViewHolder(ItemTrendingBinding.inflate(this, parent, false), onTrendingListener) 19 | ITEM_SEE_MORE_TYPE -> TrendingViewTypeViewHolder(ItemTrendingViewTypeBinding.inflate(this, parent, false), onSeeMoreListener) 20 | else -> throw IllegalArgumentException("Unsupported view type: $viewType") 21 | } 22 | } 23 | 24 | override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 25 | when (holder.itemViewType) { 26 | ITEM_TRENDING_POSITION -> bindTrending(holder, getItem(position)) 27 | else -> bindSeeMore(holder) 28 | } 29 | } 30 | 31 | override fun getItemViewType(position: Int) = if (position == itemCount - 1) ITEM_SEE_MORE_TYPE else ITEM_TRENDING_TYPE 32 | 33 | private fun bindTrending(holder: RecyclerView.ViewHolder, trending: Trending) = (holder as TrendingViewHolder).bind(trending) 34 | 35 | private fun bindSeeMore(holder: RecyclerView.ViewHolder) = (holder as TrendingViewTypeViewHolder).bind() 36 | 37 | companion object { 38 | 39 | private const val ITEM_TRENDING_TYPE = -1 40 | private const val ITEM_SEE_MORE_TYPE = -2 41 | 42 | private const val ITEM_TRENDING_POSITION = 1 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TrendingDiffCallback.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import erikjhordanrey.github.io.domain.Trending 5 | 6 | class TrendingDiffCallback : DiffUtil.ItemCallback() { 7 | 8 | override fun areItemsTheSame(oldItem: Trending, newItem: Trending) = 9 | oldItem.id == newItem.id && oldItem.title == newItem.title && oldItem.viewsCounter == newItem.viewsCounter 10 | 11 | override fun areContentsTheSame(oldItem: Trending, newItem: Trending) = oldItem == newItem 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TrendingViewHolder.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import erikjhordanrey.github.io.databinding.ItemTrendingBinding 5 | import erikjhordanrey.github.io.domain.Trending 6 | 7 | class TrendingViewHolder(private val binding: ItemTrendingBinding, 8 | private val onTrendingListener: ((Trending) -> Unit)? = null) : RecyclerView.ViewHolder(binding.root) { 9 | 10 | fun bind(trending: Trending) = trending.run { 11 | binding.idTextView.text = id 12 | binding.titleTextView.text = title 13 | binding.viewsTextView.text = viewsCounter 14 | itemView.setOnClickListener { onTrendingListener?.invoke(this) } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/kotlin/erikjhordanrey/github/io/ui/adapter/TrendingViewTypeViewHolder.kt: -------------------------------------------------------------------------------- 1 | package erikjhordanrey.github.io.ui.adapter 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import erikjhordanrey.github.io.databinding.ItemTrendingViewTypeBinding 5 | 6 | class TrendingViewTypeViewHolder(private val binding: ItemTrendingViewTypeBinding, private val onSeeMoreListener: ((String) -> Unit)?) : 7 | RecyclerView.ViewHolder(binding.root) { 8 | 9 | fun bind() { 10 | itemView.setOnClickListener { onSeeMoreListener?.invoke(binding.titleTextView.text.toString()) } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 23 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_news.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_topics_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_trending.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 28 | 29 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_trending_view_type.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikjhordan-rey/RecyclerView-ConcatAdapter/f5f666f680488839f82d8dea60af11ca2cb4a869/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #263238 4 | #000a12 5 | #03DAC5 6 | 7 | #ff5c8d 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12sp 4 | 14sp 5 | 16sp 6 | 7 | 8 | 0dp 9 | 8dp 10 | 16dp 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | RecyclerView-ConcatAdapter 3 | Topics Header 4 | Trending ViewType 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 13 | 14 |