23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/java/com/dizcoding/recylermultipleview/adapter/exampletwo/ExampleTwoTypeFactoryImpl.kt:
--------------------------------------------------------------------------------
1 | package com.dizcoding.recylermultipleview.adapter.exampletwo
2 |
3 | import android.view.View
4 | import com.dizcoding.mylibrv.AbstractViewHolder
5 | import com.dizcoding.recylermultipleview.adapter.exampletwo.left.ExampleTwoLeftModel
6 | import com.dizcoding.recylermultipleview.adapter.exampletwo.left.ExampleTwoLeftVH
7 | import com.dizcoding.recylermultipleview.adapter.exampletwo.right.ExampleTwoRightModel
8 | import com.dizcoding.recylermultipleview.adapter.exampletwo.right.ExampleTwoRightVH
9 |
10 | class ExampleTwoTypeFactoryImpl : ExampleTwoTypeFactory {
11 | override fun type(typeFactory: ExampleTwoLeftModel): Int = ExampleTwoLeftVH.LAYOUT
12 |
13 | override fun type(typeFactory: ExampleTwoRightModel): Int = ExampleTwoRightVH.LAYOUT
14 |
15 | override fun createViewHolder(parent: View, type: Int): AbstractViewHolder<*> {
16 |
17 | return when (type) {
18 | ExampleTwoLeftVH.LAYOUT -> ExampleTwoLeftVH(parent)
19 | ExampleTwoRightVH.LAYOUT -> ExampleTwoRightVH(parent)
20 | else -> createViewHolder(parent, type)
21 | }
22 | }
23 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_example_two_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
18 |
19 |
27 |
28 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 | # Kotlin code style for this project: "official" or "obsolete":
21 | kotlin.code.style=official
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_example_one_dual.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
21 |
22 |
23 |
31 |
32 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/myLibRv/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.library'
3 | id 'kotlin-android'
4 | id 'com.github.dcendents.android-maven'
5 | }
6 | group='com.github.gandhi-wibowo'
7 | android {
8 | compileSdkVersion 30
9 | buildToolsVersion "30.0.3"
10 |
11 | defaultConfig {
12 | minSdkVersion 16
13 | targetSdkVersion 30
14 | versionCode 1
15 | versionName "1.0"
16 |
17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
18 | consumerProguardFiles "consumer-rules.pro"
19 | }
20 |
21 | buildTypes {
22 | release {
23 | minifyEnabled false
24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
25 | }
26 | }
27 | compileOptions {
28 | sourceCompatibility JavaVersion.VERSION_1_8
29 | targetCompatibility JavaVersion.VERSION_1_8
30 | }
31 | kotlinOptions {
32 | jvmTarget = '1.8'
33 | }
34 | }
35 |
36 | dependencies {
37 |
38 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
39 | implementation 'androidx.core:core-ktx:1.3.2'
40 | implementation 'androidx.appcompat:appcompat:1.2.0'
41 | implementation 'com.google.android.material:material:1.3.0'
42 | testImplementation 'junit:junit:4.+'
43 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
44 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
45 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/dizcoding/recylermultipleview/adapter/exampleone/ExampleOneTypeFactoryImpl.kt:
--------------------------------------------------------------------------------
1 | package com.dizcoding.recylermultipleview.adapter.exampleone
2 |
3 | import android.view.View
4 | import com.dizcoding.mylibrv.AbstractViewHolder
5 | import com.dizcoding.recylermultipleview.adapter.exampleone.dual.ContentExampleOneDualVH
6 | import com.dizcoding.recylermultipleview.adapter.exampleone.dual.ExampleOneDualModel
7 | import com.dizcoding.recylermultipleview.adapter.exampleone.full.ContentExampleOneFullVH
8 | import com.dizcoding.recylermultipleview.adapter.exampleone.full.ExampleOneFullModel
9 | import com.dizcoding.recylermultipleview.adapter.exampleone.half.ContentExampleOneHalfVH
10 | import com.dizcoding.recylermultipleview.adapter.exampleone.half.ExampleOneHalfModel
11 |
12 | class ExampleOneTypeFactoryImpl : ExampleOneTypeFactory {
13 | override fun type(typeFactory: ExampleOneDualModel): Int = ContentExampleOneDualVH.LAYOUT
14 | override fun type(typeFactory: ExampleOneFullModel): Int = ContentExampleOneFullVH.LAYOUT
15 | override fun type(typeFactory: ExampleOneHalfModel): Int = ContentExampleOneHalfVH.LAYOUT
16 | override fun createViewHolder(parent: View, type: Int): AbstractViewHolder<*> {
17 | return when (type) {
18 | ContentExampleOneDualVH.LAYOUT -> ContentExampleOneDualVH(parent)
19 | ContentExampleOneHalfVH.LAYOUT -> ContentExampleOneHalfVH(parent)
20 | ContentExampleOneFullVH.LAYOUT -> ContentExampleOneFullVH(parent)
21 | else -> createViewHolder(parent, type)
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/myLibRv/src/main/java/com/dizcoding/mylibrv/EndlessRecyclerViewScrollListener.java:
--------------------------------------------------------------------------------
1 | package com.dizcoding.mylibrv;
2 |
3 | import androidx.recyclerview.widget.LinearLayoutManager;
4 | import androidx.recyclerview.widget.RecyclerView;
5 |
6 | public abstract class EndlessRecyclerViewScrollListener extends RecyclerView.OnScrollListener {
7 |
8 | private int visibleThreshold = 5;
9 | private int previousTotalItemCount = 0;
10 | private boolean loading = true;
11 |
12 | RecyclerView.LayoutManager mLayoutManager;
13 |
14 | public EndlessRecyclerViewScrollListener(LinearLayoutManager layoutManager) {
15 | this.mLayoutManager = layoutManager;
16 | }
17 |
18 | @Override
19 | public void onScrolled(RecyclerView view, int dx, int dy) {
20 | int lastVisibleItemPosition = 0;
21 | int totalItemCount = mLayoutManager.getItemCount();
22 | lastVisibleItemPosition = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
23 |
24 | if (totalItemCount < previousTotalItemCount) {
25 | this.previousTotalItemCount = totalItemCount;
26 | if (totalItemCount == 0) {
27 | this.loading = true;
28 | }
29 | }
30 |
31 | if (loading && (totalItemCount > previousTotalItemCount)) {
32 | loading = false;
33 | previousTotalItemCount = totalItemCount;
34 | }
35 |
36 | if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) {
37 | onLoadMore();
38 | loading = true;
39 | }
40 | }
41 |
42 | public void resetState() {
43 | this.previousTotalItemCount = 0;
44 | this.loading = true;
45 | }
46 |
47 | public abstract void onLoadMore();
48 |
49 | }
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | id 'kotlin-android'
4 | id 'kotlin-parcelize'
5 | id 'kotlin-kapt'
6 | }
7 |
8 | android {
9 | compileSdkVersion 30
10 | buildToolsVersion "30.0.3"
11 |
12 | defaultConfig {
13 | applicationId "com.dizcoding.recylermultipleview"
14 | minSdkVersion 16
15 | targetSdkVersion 30
16 | versionCode 1
17 | versionName "1.0"
18 |
19 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
20 | }
21 |
22 | buildTypes {
23 | release {
24 | minifyEnabled false
25 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
26 | }
27 | }
28 | compileOptions {
29 | sourceCompatibility JavaVersion.VERSION_1_8
30 | targetCompatibility JavaVersion.VERSION_1_8
31 | }
32 | kotlinOptions {
33 | jvmTarget = '1.8'
34 | }
35 | buildFeatures {
36 | viewBinding = true
37 | }
38 | }
39 |
40 | dependencies {
41 |
42 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
43 | implementation project(":myLibRv")
44 | implementation 'androidx.core:core-ktx:1.3.2'
45 | implementation 'androidx.appcompat:appcompat:1.2.0'
46 | implementation 'com.google.android.material:material:1.3.0'
47 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
48 |
49 | // glide
50 | implementation "com.github.bumptech.glide:glide:4.11.0"
51 | kapt "com.github.bumptech.glide:compiler:4.11.0"
52 |
53 | testImplementation 'junit:junit:4.+'
54 | androidTestImplementation 'androidx.test.ext:junit:1.1.2'
55 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
56 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/app/src/main/java/com/dizcoding/recylermultipleview/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.dizcoding.recylermultipleview
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import androidx.recyclerview.widget.LinearLayoutManager
6 | import com.dizcoding.mylibrv.BaseListAdapter
7 | import com.dizcoding.recylermultipleview.adapter.exampleone.ExampleOneTypeFactoryImpl
8 | import com.dizcoding.recylermultipleview.adapter.exampleone.dual.ExampleOneDualModel
9 | import com.dizcoding.recylermultipleview.adapter.exampleone.full.ExampleOneFullModel
10 | import com.dizcoding.recylermultipleview.adapter.exampleone.half.ExampleOneHalfModel
11 | import com.dizcoding.recylermultipleview.adapter.exampletwo.ExampleTwoTypeFactoryImpl
12 | import com.dizcoding.recylermultipleview.adapter.exampletwo.left.ExampleTwoLeftModel
13 | import com.dizcoding.recylermultipleview.adapter.exampletwo.right.ExampleTwoRightModel
14 | import com.dizcoding.recylermultipleview.databinding.ActivityMainBinding
15 |
16 | class MainActivity : AppCompatActivity() {
17 |
18 | lateinit var binding: ActivityMainBinding
19 |
20 | override fun onCreate(savedInstanceState: Bundle?) {
21 | super.onCreate(savedInstanceState)
22 | binding = ActivityMainBinding.inflate(layoutInflater)
23 | setContentView(binding.root)
24 |
25 | // initExampleOneData()
26 | initExampleTwoData()
27 | }
28 |
29 | private fun initExampleOneData() {
30 | val adapter = BaseListAdapter(ExampleOneTypeFactoryImpl())
31 | binding.mainRv.layoutManager = LinearLayoutManager(this)
32 | binding.mainRv.adapter = adapter
33 |
34 | adapter.addItems(
35 | listOf(
36 | ExampleOneFullModel("ONe Content Center"),
37 | ExampleOneHalfModel("One Content Left"),
38 | ExampleOneFullModel("ONe Content Center"),
39 | ExampleOneDualModel("Dual Content Left", "Dua Content RIght"),
40 | ExampleOneHalfModel("One Content Left"),
41 | )
42 | )
43 | }
44 |
45 | private fun initExampleTwoData() {
46 | val adapter = BaseListAdapter(ExampleTwoTypeFactoryImpl())
47 | binding.mainRv.layoutManager = LinearLayoutManager(this)
48 | binding.mainRv.adapter = adapter
49 |
50 | adapter.addItems(
51 | listOf(
52 | ExampleTwoLeftModel("Hy How Are you ?"),
53 | ExampleTwoLeftModel("I think i just miss you"),
54 | ExampleTwoRightModel("Im good. "),
55 | ExampleTwoRightModel("Aw that was so cute"),
56 | ExampleTwoRightModel("But, im a MAN, are you gay ?"),
57 | )
58 | )
59 | }
60 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RecyclerMultipleView
2 |
3 | [](https://jitpack.io/#gandhi-wibowo/RecylerMultipleView)
4 |
5 | ## What ?
6 | Its just my base code for multipleview type of Recyclerview. Sometime i just use this stuff in my project.
7 | If you want to use this, just be patient, cause i just put much bug on this stuff.
8 | So, happy debugging.
9 |
10 | ## Preview ?
11 |
12 |
13 |
14 |
15 | ## Install ?
16 |
17 | Add it in your root _build.gradle_ at the ed of repositories :
18 | ```gradle
19 | allprojects {
20 | repositories {
21 | ...
22 | maven { url 'https://jitpack.io' }
23 | }
24 | }
25 | ```
26 |
27 | And in the dependecy section, add this
28 |
29 | ```gradle
30 | dependencies {
31 | implementation 'com.github.gandhi-wibowo:RecylerMultipleView:$version'
32 | }
33 | ```
34 |
35 | ## Features ?
36 | | Function | Return Type | Description |
37 | | ------ | ------ | ------ |
38 | | getSelected() | ArrayList | get items that the value of isSelected is true |
39 | | addSelected(item: BaseItemModel, position: Int) | - | invert isSelected value |
40 | | addSinggleSelected(item: BaseItemModel, position: Int) | - | false all items isSelected value, and invert this item isSelected value #the selected data should be just this item|
41 | | removeSelectedMarker() | - | false all items isSelected value |
42 | | resetData(items: List) | - | delete all items, and add the new items |
43 | | clearItems() | - | delete all items |
44 | | updateItem(item: BaseItemModel, position: Int) | - | update item value, and reload adapter |
45 | | addItem(item: BaseItemModel) | - | add one item into items |
46 | | addItems(items: List) | - | add multiple item into items |
47 | | getItems() | List | get all items that has added |
48 | | removeItems(items: List)) | - | delete all this items from existing items |
49 | | removeItem(item: BaseItemModel) | - | delete this items from existing items |
50 |
51 | ## Use ?
52 |
53 | I was to lazy for make a tutorial. So just look at the example that i was put on this project.
54 |
55 | ## License
56 | ```
57 | Copyright 2021 Gandhi Wibowo
58 |
59 | Licensed under the Apache License, Version 2.0 (the "License");
60 | you may not use this file except in compliance with the License.
61 | You may obtain a copy of the License at
62 |
63 | http://www.apache.org/licenses/LICENSE-2.0
64 |
65 | Unless required by applicable law or agreed to in writing, software
66 | distributed under the License is distributed on an "AS IS" BASIS,
67 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
68 | See the License for the specific language governing permissions and
69 | limitations under the License.
70 | ```
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |