diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5edb4ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..851bf1e Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..99202cc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..1eeeb7b --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.android4dev.recyclerview" + minSdkVersion 16 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:28.0.0-rc01' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'com.android.support:recyclerview-v7:28.0.0-rc01' + implementation 'com.github.bumptech.glide:glide:4.7.1' + implementation 'com.android.support:design:28.0.0-rc01' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/android4dev/recyclerview/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/android4dev/recyclerview/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..1d74685 --- /dev/null +++ b/app/src/androidTest/java/com/android4dev/recyclerview/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.android4dev.recyclerview + +import android.support.test.InstrumentationRegistry +import android.support.test.runner.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getTargetContext() + assertEquals("com.android4dev.recyclerview", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8d3072f --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/HomeActivity.kt b/app/src/main/java/com/android4dev/recyclerview/HomeActivity.kt new file mode 100644 index 0000000..a4968c2 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/HomeActivity.kt @@ -0,0 +1,52 @@ +package com.android4dev.recyclerview + +import android.content.Intent +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.view.View +import com.android4dev.recyclerview.R.id.* +import com.android4dev.recyclerview.base.BaseActivity +import kotlinx.android.synthetic.main.activity_home.* + +class HomeActivity : BaseActivity(), View.OnClickListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_home) + initView() + } + + private fun initView() { + buttonSimpleRecyclerView.setOnClickListener(this) + buttonGridRecyclerView.setOnClickListener(this) + buttonViewTypeRecyclerView.setOnClickListener(this) + buttonStaggeredRecyclerView.setOnClickListener(this) + buttonLoadMoreRecyclerView.setOnClickListener(this) + } + + override fun onClick(clickView: View?) { + val intent: Intent + when (clickView!!.id) { + R.id.buttonSimpleRecyclerView -> { + intent = Intent(this@HomeActivity, RecyclerViewLinearLayoutActivity::class.java) + startActivity(intent) + } + R.id.buttonGridRecyclerView -> { + intent = Intent(this@HomeActivity, RecyclerViewGridLayoutActivity::class.java) + startActivity(intent) + } + R.id.buttonViewTypeRecyclerView -> { + intent = Intent(this@HomeActivity, RecyclerViewHeaderFooterActivity::class.java) + startActivity(intent) + } + R.id.buttonStaggeredRecyclerView -> { + intent = Intent(this@HomeActivity, RecyclerViewStaggeredGridActivity::class.java) + startActivity(intent) + } + R.id.buttonLoadMoreRecyclerView -> { + intent = Intent(this@HomeActivity, RecyclerViewLoadMoreDataActivity::class.java) + startActivity(intent) + } + } + } +} diff --git a/app/src/main/java/com/android4dev/recyclerview/RecyclerViewGridLayoutActivity.kt b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewGridLayoutActivity.kt new file mode 100644 index 0000000..6ec39c3 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewGridLayoutActivity.kt @@ -0,0 +1,56 @@ +package com.android4dev.recyclerview + +import android.os.Bundle +import android.support.v7.widget.GridLayoutManager +import com.android4dev.recyclerview.adapter.MovieListGridRecyclerAdapter +import com.android4dev.recyclerview.base.BaseActivity +import com.android4dev.recyclerview.model.MovieModel +import com.android4dev.recyclerview.recyclerview_helper.GridItemDecoration +import kotlinx.android.synthetic.main.activity_main.* + +class RecyclerViewGridLayoutActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + initView() + } + + private fun initView() { + recyclerViewMovies.layoutManager = GridLayoutManager(this,2) + + //This will for default android divider + recyclerViewMovies.addItemDecoration(GridItemDecoration(10, 2)) + + val movieListAdapter = MovieListGridRecyclerAdapter() + recyclerViewMovies.adapter = movieListAdapter + movieListAdapter.setMovieList(generateDummyData()) + } + + private fun generateDummyData(): List { + val listOfMovie = mutableListOf() + + var movieModel = MovieModel(1, "Avengers", 500, "16 Feb 2018", R.drawable.ic_avengers) + listOfMovie.add(movieModel) + + movieModel = MovieModel(2, "Avengers: Age of Ultron", 400, "17 March 2018", R.drawable.ic_avengers_2) + listOfMovie.add(movieModel) + + movieModel = MovieModel(3, "Iron Man 3", 550, "17 April 2018", R.drawable.ic_ironman_3) + listOfMovie.add(movieModel) + + movieModel = MovieModel(4, "Avengers: Infinity War", 1500, "15 Jan 2018", R.drawable.ic_avenger_five) + listOfMovie.add(movieModel) + + movieModel = MovieModel(5, "Thor: Ragnarok", 200, "17 March 2018", R.drawable.ic_thor) + listOfMovie.add(movieModel) + + movieModel = MovieModel(6, "Black Panther", 250, "17 May 2018", R.drawable.ic_panther) + listOfMovie.add(movieModel) + + movieModel = MovieModel(7, "Logan", 320, "17 Dec 2018", R.drawable.ic_logan) + listOfMovie.add(movieModel) + + return listOfMovie + } +} diff --git a/app/src/main/java/com/android4dev/recyclerview/RecyclerViewHeaderFooterActivity.kt b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewHeaderFooterActivity.kt new file mode 100644 index 0000000..5674e2f --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewHeaderFooterActivity.kt @@ -0,0 +1,61 @@ +package com.android4dev.recyclerview + +import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import com.android4dev.recyclerview.adapter.MovieListAdapter +import com.android4dev.recyclerview.adapter.MovieListHeaderAdapter +import com.android4dev.recyclerview.base.BaseActivity +import com.android4dev.recyclerview.model.MovieModel +import com.android4dev.recyclerview.recyclerview_helper.DividerItemDecoration +import com.android4dev.recyclerview.recyclerview_helper.VerticalSpaceItemDecoration +import kotlinx.android.synthetic.main.activity_main.* + +class RecyclerViewHeaderFooterActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + initView() + } + + private fun initView() { + recyclerViewMovies.layoutManager = LinearLayoutManager(this) + recyclerViewMovies.addItemDecoration(VerticalSpaceItemDecoration(48)) + + //This will for default android divider + recyclerViewMovies.addItemDecoration(DividerItemDecoration(this)) + + //This will for custom divider +// recyclerViewMovies.addItemDecoration(DividerItemDecoration(this, R.drawable.drawable_divider_view)) + val movieListAdapter = MovieListHeaderAdapter() + recyclerViewMovies.adapter = movieListAdapter + movieListAdapter.setMovieList(generateDummyData()) + } + + private fun generateDummyData(): List { + val listOfMovie = mutableListOf() + + var movieModel = MovieModel(1, "Avengers", 500, "16 Feb 2018", R.drawable.ic_avengers) + listOfMovie.add(movieModel) + + movieModel = MovieModel(2, "Avengers: Age of Ultron", 400, "17 March 2018", R.drawable.ic_avengers_2) + listOfMovie.add(movieModel) + + movieModel = MovieModel(3, "Iron Man 3", 550, "17 April 2018", R.drawable.ic_ironman_3) + listOfMovie.add(movieModel) + + movieModel = MovieModel(4, "Avengers: Infinity War", 1500, "15 Jan 2018", R.drawable.ic_avenger_five) + listOfMovie.add(movieModel) + + movieModel = MovieModel(5, "Thor: Ragnarok", 200, "17 March 2018", R.drawable.ic_thor) + listOfMovie.add(movieModel) + + movieModel = MovieModel(6, "Black Panther", 250, "17 May 2018", R.drawable.ic_panther) + listOfMovie.add(movieModel) + + movieModel = MovieModel(7, "Logan", 320, "17 Dec 2018", R.drawable.ic_logan) + listOfMovie.add(movieModel) + + return listOfMovie + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLinearLayoutActivity.kt b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLinearLayoutActivity.kt new file mode 100644 index 0000000..ffa0423 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLinearLayoutActivity.kt @@ -0,0 +1,63 @@ +package com.android4dev.recyclerview + +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import com.android4dev.recyclerview.R.id.recyclerViewMovies +import com.android4dev.recyclerview.adapter.MovieListAdapter +import com.android4dev.recyclerview.adapter.MovieListViewHolder +import com.android4dev.recyclerview.base.BaseActivity +import com.android4dev.recyclerview.model.MovieModel +import com.android4dev.recyclerview.recyclerview_helper.DividerItemDecoration +import com.android4dev.recyclerview.recyclerview_helper.VerticalSpaceItemDecoration +import kotlinx.android.synthetic.main.activity_main.* + +class RecyclerViewLinearLayoutActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + initView() + } + + private fun initView() { + recyclerViewMovies.layoutManager = LinearLayoutManager(this) + recyclerViewMovies.addItemDecoration(VerticalSpaceItemDecoration(48)) + + //This will for default android divider + recyclerViewMovies.addItemDecoration(DividerItemDecoration(this)) + + //This will for custom divider +// recyclerViewMovies.addItemDecoration(DividerItemDecoration(this, R.drawable.drawable_divider_view)) + val movieListAdapter = MovieListAdapter() + recyclerViewMovies.adapter = movieListAdapter + movieListAdapter.setMovieList(generateDummyData()) + } + + private fun generateDummyData(): List { + val listOfMovie = mutableListOf() + + var movieModel = MovieModel(1, "Avengers", 500, "16 Feb 2018", R.drawable.ic_avengers) + listOfMovie.add(movieModel) + + movieModel = MovieModel(2, "Avengers: Age of Ultron", 400, "17 March 2018", R.drawable.ic_avengers_2) + listOfMovie.add(movieModel) + + movieModel = MovieModel(3, "Iron Man 3", 550, "17 April 2018", R.drawable.ic_ironman_3) + listOfMovie.add(movieModel) + + movieModel = MovieModel(4, "Avengers: Infinity War", 1500, "15 Jan 2018", R.drawable.ic_avenger_five) + listOfMovie.add(movieModel) + + movieModel = MovieModel(5, "Thor: Ragnarok", 200, "17 March 2018", R.drawable.ic_thor) + listOfMovie.add(movieModel) + + movieModel = MovieModel(6, "Black Panther", 250, "17 May 2018", R.drawable.ic_panther) + listOfMovie.add(movieModel) + + movieModel = MovieModel(7, "Logan", 320, "17 Dec 2018", R.drawable.ic_logan) + listOfMovie.add(movieModel) + + return listOfMovie + } +} diff --git a/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLoadMoreDataActivity.kt b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLoadMoreDataActivity.kt new file mode 100644 index 0000000..9e471ba --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewLoadMoreDataActivity.kt @@ -0,0 +1,76 @@ +package com.android4dev.recyclerview + +import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import com.android4dev.recyclerview.adapter.MovieListAdapter +import com.android4dev.recyclerview.base.BaseActivity +import com.android4dev.recyclerview.model.MovieModel +import com.android4dev.recyclerview.recyclerview_helper.DividerItemDecoration +import com.android4dev.recyclerview.recyclerview_helper.VerticalSpaceItemDecoration +import kotlinx.android.synthetic.main.activity_main.* + +class RecyclerViewLoadMoreDataActivity : BaseActivity() { + private var loading = false + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + initView() + } + + private fun initView() { + recyclerViewMovies.layoutManager = LinearLayoutManager(this) + recyclerViewMovies.addItemDecoration(VerticalSpaceItemDecoration(48)) + + //This will for custom divider + recyclerViewMovies.addItemDecoration(DividerItemDecoration(this, R.drawable.drawable_divider_view)) + + val movieListAdapter = MovieListAdapter() + recyclerViewMovies.adapter = movieListAdapter + movieListAdapter.setMovieList(generateDummyData()) + + recyclerViewMovies.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val linearLayoutManager = recyclerView + .layoutManager as LinearLayoutManager? + + if (!loading && linearLayoutManager!!.itemCount <= linearLayoutManager.findLastVisibleItemPosition() + 2) { + loading = true + movieListAdapter.addMoreData(generateDummyData()) + } + } + + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + } + }) + } + + private fun generateDummyData(): List { + val listOfMovie = mutableListOf() + + var movieModel = MovieModel(1, "Avengers", 500, "16 Feb 2018", R.drawable.ic_avengers) + listOfMovie.add(movieModel) + + movieModel = MovieModel(2, "Avengers: Age of Ultron", 400, "17 March 2018", R.drawable.ic_avengers_2) + listOfMovie.add(movieModel) + + movieModel = MovieModel(3, "Iron Man 3", 550, "17 April 2018", R.drawable.ic_ironman_3) + listOfMovie.add(movieModel) + + movieModel = MovieModel(4, "Avengers: Infinity War", 1500, "15 Jan 2018", R.drawable.ic_avenger_five) + listOfMovie.add(movieModel) + + movieModel = MovieModel(5, "Thor: Ragnarok", 200, "17 March 2018", R.drawable.ic_thor) + listOfMovie.add(movieModel) + + movieModel = MovieModel(6, "Black Panther", 250, "17 May 2018", R.drawable.ic_panther) + listOfMovie.add(movieModel) + + movieModel = MovieModel(7, "Logan", 320, "17 Dec 2018", R.drawable.ic_logan) + listOfMovie.add(movieModel) + loading = false + return listOfMovie + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/RecyclerViewStaggeredGridActivity.kt b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewStaggeredGridActivity.kt new file mode 100644 index 0000000..105e538 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/RecyclerViewStaggeredGridActivity.kt @@ -0,0 +1,60 @@ +package com.android4dev.recyclerview + +import android.os.Bundle +import android.os.PersistableBundle +import android.support.v7.widget.GridLayoutManager +import android.support.v7.widget.StaggeredGridLayoutManager +import com.android4dev.recyclerview.adapter.MovieListGridRecyclerAdapter +import com.android4dev.recyclerview.adapter.MovieListStaggeredAdapter +import com.android4dev.recyclerview.base.BaseActivity +import com.android4dev.recyclerview.model.MovieModel +import com.android4dev.recyclerview.recyclerview_helper.GridItemDecoration +import com.android4dev.recyclerview.recyclerview_helper.VerticalSpaceItemDecoration +import kotlinx.android.synthetic.main.activity_main.* + +class RecyclerViewStaggeredGridActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + initView() + } + + + private fun initView() { + recyclerViewMovies.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) + //This will for default android divider + recyclerViewMovies.addItemDecoration(GridItemDecoration(10, 2)) + + val movieListAdapter = MovieListStaggeredAdapter() + recyclerViewMovies.adapter = movieListAdapter + movieListAdapter.setMovieList(generateDummyData()) + } + + private fun generateDummyData(): List { + val listOfMovie = mutableListOf() + + var movieModel = MovieModel(1, "Avengers", 500, "16 Feb 2018", R.drawable.ic_avengers) + listOfMovie.add(movieModel) + + movieModel = MovieModel(2, "Avengers: Age of Ultron", 400, "17 March 2018", R.drawable.ic_avengers_2) + listOfMovie.add(movieModel) + + movieModel = MovieModel(3, "Iron Man 3", 550, "17 April 2018", R.drawable.ic_ironman_3) + listOfMovie.add(movieModel) + + movieModel = MovieModel(4, "Avengers: Infinity War", 1500, "15 Jan 2018", R.drawable.ic_avenger_five) + listOfMovie.add(movieModel) + + movieModel = MovieModel(5, "Thor: Ragnarok", 200, "17 March 2018", R.drawable.ic_thor) + listOfMovie.add(movieModel) + + movieModel = MovieModel(6, "Black Panther", 250, "17 May 2018", R.drawable.ic_panther) + listOfMovie.add(movieModel) + + movieModel = MovieModel(7, "Logan", 320, "17 Dec 2018", R.drawable.ic_logan) + listOfMovie.add(movieModel) + + return listOfMovie + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/FooterViewHolder.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/FooterViewHolder.kt new file mode 100644 index 0000000..66ab9c1 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/FooterViewHolder.kt @@ -0,0 +1,11 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.View +import kotlinx.android.synthetic.main.list_item_recycler_header.view.* + +class FooterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bindView() { + itemView.textHeader.textHeader.text = "Footer Section" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/HeaderViewHolder.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/HeaderViewHolder.kt new file mode 100644 index 0000000..fb35f4f --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/HeaderViewHolder.kt @@ -0,0 +1,11 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.View +import kotlinx.android.synthetic.main.list_item_recycler_header.view.* + +class HeaderViewHolder(itemView:View):RecyclerView.ViewHolder(itemView) { + fun bindView(){ + itemView.textHeader.text="Header Section" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListAdapter.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListAdapter.kt new file mode 100644 index 0000000..b43fe24 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListAdapter.kt @@ -0,0 +1,32 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import com.android4dev.recyclerview.R +import com.android4dev.recyclerview.model.MovieModel + +class MovieListAdapter : RecyclerView.Adapter() { + + private var listOfMovies = mutableListOf() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return MovieListViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_movie, parent, false)) + } + + override fun getItemCount(): Int = listOfMovies.size + + override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) { + val movieViewHolder = viewHolder as MovieListViewHolder + movieViewHolder.bindView(listOfMovies[position]) + } + + fun setMovieList(listOfMovies: List) { + this.listOfMovies = listOfMovies.toMutableList() + notifyDataSetChanged() + } + + fun addMoreData(listOfMovies: List) { + this.listOfMovies.addAll(listOfMovies) + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListGridRecyclerAdapter.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListGridRecyclerAdapter.kt new file mode 100644 index 0000000..ce73575 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListGridRecyclerAdapter.kt @@ -0,0 +1,26 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import com.android4dev.recyclerview.R +import com.android4dev.recyclerview.model.MovieModel + +class MovieListGridRecyclerAdapter:RecyclerView.Adapter() { + private var listOfMovies = listOf() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return MovieListViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_grid_movie, parent, false)) + } + + override fun getItemCount(): Int = listOfMovies.size + + override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) { + val movieViewHolder = viewHolder as MovieListViewHolder + movieViewHolder.bindView(listOfMovies[position]) + } + + fun setMovieList(listOfMovies: List) { + this.listOfMovies = listOfMovies + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListHeaderAdapter.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListHeaderAdapter.kt new file mode 100644 index 0000000..acc8873 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListHeaderAdapter.kt @@ -0,0 +1,66 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import com.android4dev.recyclerview.R +import com.android4dev.recyclerview.model.MovieModel + +class MovieListHeaderAdapter : RecyclerView.Adapter() { + private var listOfMovies = listOf() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + CellType.HEADER.ordinal -> HeaderViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_recycler_header, parent, false)) + CellType.CONTENT.ordinal -> MovieListViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_movie, parent, false)) + CellType.FOOTER.ordinal -> FooterViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_recycler_header, parent, false)) + else -> MovieListViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_movie, parent, false)) + } + } + + + override fun getItemCount(): Int = listOfMovies.size + 2 + //add 2 size in itemcount because we are going to add header and footer cell in list + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (getItemViewType(position)) { + CellType.HEADER.ordinal -> { + val headerViewHolder = holder as HeaderViewHolder + headerViewHolder.bindView() + } + CellType.CONTENT.ordinal -> { + val headerViewHolder = holder as MovieListViewHolder + headerViewHolder.bindView(listOfMovies[position - 1]) + } + CellType.FOOTER.ordinal -> { + val footerViewHolder = holder as FooterViewHolder + footerViewHolder.bindView() + } + } + } + + + /*** + * This method will return cell type base on position + */ + override fun getItemViewType(position: Int): Int { + return when (position) { + 0 -> CellType.HEADER.ordinal + listOfMovies.size + 1 -> CellType.FOOTER.ordinal + else -> CellType.CONTENT.ordinal + } + } + + /*** + * Enum class for recyclerview Cell type + */ + enum class CellType(viewType: Int) { + HEADER(0), + FOOTER(1), + CONTENT(2) + } + + fun setMovieList(listOfMovies: List) { + this.listOfMovies = listOfMovies + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredAdapter.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredAdapter.kt new file mode 100644 index 0000000..b029c79 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredAdapter.kt @@ -0,0 +1,26 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import com.android4dev.recyclerview.R +import com.android4dev.recyclerview.model.MovieModel + +class MovieListStaggeredAdapter : RecyclerView.Adapter() { + private var listOfMovies = listOf() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return MovieListStaggeredViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item_grid_movie, parent, false)) + } + + override fun getItemCount(): Int = listOfMovies.size + + override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) { + val movieViewHolder = viewHolder as MovieListStaggeredViewHolder + movieViewHolder.bindView(listOfMovies[position]) + } + + fun setMovieList(listOfMovies: List) { + this.listOfMovies = listOfMovies + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredViewHolder.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredViewHolder.kt new file mode 100644 index 0000000..b7dec23 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListStaggeredViewHolder.kt @@ -0,0 +1,23 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.View +import com.android4dev.recyclerview.model.MovieModel +import com.bumptech.glide.Glide +import kotlinx.android.synthetic.main.list_item_movie.view.* +import java.util.* + +class MovieListStaggeredViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val mRandom = Random() + fun bindView(movieModel: MovieModel) { + itemView.textMovieTitle.text = movieModel.movieTitle + itemView.textMovieViews.text = "Views: " + movieModel.movieViews + itemView.textReleaseDate.text = "Release Date: " + movieModel.releaseDate + itemView.imageMovie.layoutParams.height = getRandomIntInRange(250, 150) + Glide.with(itemView.context).load(movieModel.moviePicture!!).into(itemView.imageMovie) + } + + private fun getRandomIntInRange(max: Int, min: Int): Int { + return mRandom.nextInt(max - min + min) + min + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListViewHolder.kt b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListViewHolder.kt new file mode 100644 index 0000000..7fb72e7 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/adapter/MovieListViewHolder.kt @@ -0,0 +1,19 @@ +package com.android4dev.recyclerview.adapter + +import android.support.v7.widget.RecyclerView +import android.view.View +import com.android4dev.recyclerview.model.MovieModel +import com.bumptech.glide.Glide +import kotlinx.android.synthetic.main.list_item_movie.view.* +import java.util.* + +class MovieListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + fun bindView(movieModel: MovieModel) { + itemView.textMovieTitle.text = movieModel.movieTitle + itemView.textMovieViews.text = "Views: " + movieModel.movieViews + itemView.textReleaseDate.text = "Release Date: " + movieModel.releaseDate + + Glide.with(itemView.context).load(movieModel.moviePicture!!).into(itemView.imageMovie) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/base/BaseActivity.kt b/app/src/main/java/com/android4dev/recyclerview/base/BaseActivity.kt new file mode 100644 index 0000000..1a4f939 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/base/BaseActivity.kt @@ -0,0 +1,6 @@ +package com.android4dev.recyclerview.base + +import android.support.v7.app.AppCompatActivity + +open class BaseActivity: AppCompatActivity() { +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/model/MovieModel.kt b/app/src/main/java/com/android4dev/recyclerview/model/MovieModel.kt new file mode 100644 index 0000000..f884daf --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/model/MovieModel.kt @@ -0,0 +1,11 @@ +package com.android4dev.recyclerview.model + +import android.graphics.drawable.Drawable + +data class MovieModel(var movieId: Int, + var movieTitle: String, + var movieViews: Int, + var releaseDate: String, + var moviePicture: Int?) { + constructor() : this(0, "", 0, "", null) +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/DividerItemDecoration.kt b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/DividerItemDecoration.kt new file mode 100644 index 0000000..cf66456 --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/DividerItemDecoration.kt @@ -0,0 +1,51 @@ +package com.android4dev.recyclerview.recyclerview_helper + +import android.content.Context +import android.support.v7.widget.RecyclerView +import android.support.v4.content.ContextCompat +import android.content.res.TypedArray +import android.graphics.Canvas +import android.graphics.drawable.Drawable + +/*** + * Made by Lokesh Desai (Android4Dev) + */ +class DividerItemDecoration +/** + * Default divider will be used + */(context: Context) : RecyclerView.ItemDecoration() { + private val ATTRS = intArrayOf(android.R.attr.listDivider) + + private var divider: Drawable? = null + + init { + val styledAttributes = context.obtainStyledAttributes(ATTRS) + divider = styledAttributes.getDrawable(0) + styledAttributes.recycle() + } + + /** + * Custom divider will be used + */ + constructor(context: Context, resId: Int) : this(context) { + divider = ContextCompat.getDrawable(context, resId) + } + + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + val left = parent.paddingLeft + val right = parent.width - parent.paddingRight + + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + + val params = child.layoutParams as RecyclerView.LayoutParams + + val top = child.bottom + params.bottomMargin + val bottom = top + divider!!.intrinsicHeight + + divider!!.setBounds(left, top, right, bottom) + divider!!.draw(c) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/GridItemDecoration.kt b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/GridItemDecoration.kt new file mode 100644 index 0000000..7f9a91f --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/GridItemDecoration.kt @@ -0,0 +1,52 @@ +package com.android4dev.recyclerview.recyclerview_helper + +import android.graphics.Rect +import android.support.v7.widget.RecyclerView +import android.view.View + +/*** + * Made by Lokesh Desai (Android4Dev) + */ +class GridItemDecoration(gridSpacingPx: Int, gridSize: Int) : RecyclerView.ItemDecoration() { + private var mSizeGridSpacingPx: Int = gridSpacingPx + private var mGridSize: Int = gridSize + + private var mNeedLeftSpacing = false + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + val frameWidth = ((parent.width - mSizeGridSpacingPx.toFloat() * (mGridSize - 1)) / mGridSize).toInt() + val padding = parent.width / mGridSize - frameWidth + val itemPosition = (view.getLayoutParams() as RecyclerView.LayoutParams).viewAdapterPosition + if (itemPosition < mGridSize) { + outRect.top = 0 + } else { + outRect.top = mSizeGridSpacingPx + } + if (itemPosition % mGridSize == 0) { + outRect.left = 0 + outRect.right = padding + mNeedLeftSpacing = true + } else if ((itemPosition + 1) % mGridSize == 0) { + mNeedLeftSpacing = false + outRect.right = 0 + outRect.left = padding + } else if (mNeedLeftSpacing) { + mNeedLeftSpacing = false + outRect.left = mSizeGridSpacingPx - padding + if ((itemPosition + 2) % mGridSize == 0) { + outRect.right = mSizeGridSpacingPx - padding + } else { + outRect.right = mSizeGridSpacingPx / 2 + } + } else if ((itemPosition + 2) % mGridSize == 0) { + mNeedLeftSpacing = false + outRect.left = mSizeGridSpacingPx / 2 + outRect.right = mSizeGridSpacingPx - padding + } else { + mNeedLeftSpacing = false + outRect.left = mSizeGridSpacingPx / 2 + outRect.right = mSizeGridSpacingPx / 2 + } + outRect.bottom = 0 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/VerticalSpaceItemDecoration.kt b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/VerticalSpaceItemDecoration.kt new file mode 100644 index 0000000..d6af9fd --- /dev/null +++ b/app/src/main/java/com/android4dev/recyclerview/recyclerview_helper/VerticalSpaceItemDecoration.kt @@ -0,0 +1,16 @@ +package com.android4dev.recyclerview.recyclerview_helper + +import android.graphics.Rect +import android.support.v7.widget.RecyclerView +import android.view.View + +/*** + * Made by Lokesh Desai (Android4Dev) + */ +class VerticalSpaceItemDecoration(private val verticalSpaceHeight: Int) : RecyclerView.ItemDecoration() { + + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, + state: RecyclerView.State) { + outRect.bottom = verticalSpaceHeight + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/drawable_divider_view.xml b/app/src/main/res/drawable/drawable_divider_view.xml new file mode 100644 index 0000000..a412ad5 --- /dev/null +++ b/app/src/main/res/drawable/drawable_divider_view.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_avenger_five.jpg b/app/src/main/res/drawable/ic_avenger_five.jpg new file mode 100644 index 0000000..fba7c99 Binary files /dev/null and b/app/src/main/res/drawable/ic_avenger_five.jpg differ diff --git a/app/src/main/res/drawable/ic_avengers.jpg b/app/src/main/res/drawable/ic_avengers.jpg new file mode 100644 index 0000000..5a69d55 Binary files /dev/null and b/app/src/main/res/drawable/ic_avengers.jpg differ diff --git a/app/src/main/res/drawable/ic_avengers_2.jpeg b/app/src/main/res/drawable/ic_avengers_2.jpeg new file mode 100644 index 0000000..0ef1409 Binary files /dev/null and b/app/src/main/res/drawable/ic_avengers_2.jpeg differ diff --git a/app/src/main/res/drawable/ic_ironman_3.jpg b/app/src/main/res/drawable/ic_ironman_3.jpg new file mode 100644 index 0000000..bda2d82 Binary files /dev/null and b/app/src/main/res/drawable/ic_ironman_3.jpg differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..d5fccc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_logan.jpg b/app/src/main/res/drawable/ic_logan.jpg new file mode 100644 index 0000000..0594ce8 Binary files /dev/null and b/app/src/main/res/drawable/ic_logan.jpg differ diff --git a/app/src/main/res/drawable/ic_panther.jpg b/app/src/main/res/drawable/ic_panther.jpg new file mode 100644 index 0000000..26ed69a Binary files /dev/null and b/app/src/main/res/drawable/ic_panther.jpg differ diff --git a/app/src/main/res/drawable/ic_thor.jpg b/app/src/main/res/drawable/ic_thor.jpg new file mode 100644 index 0000000..1796c61 Binary files /dev/null and b/app/src/main/res/drawable/ic_thor.jpg differ diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..9518cd7 --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,64 @@ + + + +