├── MultiTypeAdapterSample ├── app │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ ├── ic_obama.png │ │ │ │ │ ├── ic_djtrump.png │ │ │ │ │ ├── ic_dlputin.png │ │ │ │ │ └── ic_xidada.png │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable │ │ │ │ │ ├── x_bg.xml │ │ │ │ │ ├── x_btn_bg.xml │ │ │ │ │ └── x_border.xml │ │ │ │ ├── values-w820dp │ │ │ │ │ └── dimens.xml │ │ │ │ └── layout │ │ │ │ │ ├── activity_main.xml │ │ │ │ │ ├── item_header.xml │ │ │ │ │ ├── item_empty.xml │ │ │ │ │ ├── item_error.xml │ │ │ │ │ ├── item_text.xml │ │ │ │ │ ├── item_image.xml │ │ │ │ │ ├── include_actions.xml │ │ │ │ │ ├── item_follower.xml │ │ │ │ │ └── item_footer.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── baurine │ │ │ │ │ └── multitypeadaptersample │ │ │ │ │ ├── activity │ │ │ │ │ ├── RefreshingView.java │ │ │ │ │ └── MainActivity.java │ │ │ │ │ ├── item │ │ │ │ │ ├── HeaderItem.java │ │ │ │ │ ├── ErrorItem.java │ │ │ │ │ ├── EmptyItem.java │ │ │ │ │ ├── BaseItem.java │ │ │ │ │ ├── FooterItem.java │ │ │ │ │ ├── FollowerItem.java │ │ │ │ │ ├── ImageItem.java │ │ │ │ │ └── TextItem.java │ │ │ │ │ ├── util │ │ │ │ │ ├── DateFormatUtil.java │ │ │ │ │ ├── CommonUtil.java │ │ │ │ │ └── BindingUtil.java │ │ │ │ │ ├── model │ │ │ │ │ ├── ModelFaker.java │ │ │ │ │ ├── BaseModel.java │ │ │ │ │ ├── ImageModel.java │ │ │ │ │ ├── FollowerModel.java │ │ │ │ │ └── TextModel.java │ │ │ │ │ └── presenter │ │ │ │ │ └── MainPresenter.java │ │ │ └── AndroidManifest.xml │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadaptersample │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── baurine │ │ │ └── multitypeadaptersample │ │ │ └── ExampleInstrumentedTest.java │ ├── proguard-rules.pro │ └── build.gradle ├── multitypeadapter │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadapter │ │ │ │ └── MultiTypeAdapter.java │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadapter │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── baurine │ │ │ └── multitypeadapter │ │ │ └── ExampleInstrumentedTest.java │ ├── proguard-rules.pro │ └── build.gradle ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore ├── build.gradle ├── gradle.properties ├── gradlew.bat └── gradlew ├── MultiTypeAdapterTutorial ├── app │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable │ │ │ │ │ ├── x_bg.xml │ │ │ │ │ ├── x_btn_bg.xml │ │ │ │ │ └── x_border.xml │ │ │ │ ├── values-w820dp │ │ │ │ │ └── dimens.xml │ │ │ │ └── layout │ │ │ │ │ ├── activity_main.xml │ │ │ │ │ ├── item_header.xml │ │ │ │ │ ├── item_text.xml │ │ │ │ │ ├── item_image.xml │ │ │ │ │ ├── item_empty.xml │ │ │ │ │ ├── item_error.xml │ │ │ │ │ ├── include_actions.xml │ │ │ │ │ └── item_footer.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── baurine │ │ │ │ │ └── multitypeadaptertutorial │ │ │ │ │ ├── activity │ │ │ │ │ ├── RefreshingView.java │ │ │ │ │ └── MainActivity.java │ │ │ │ │ ├── item │ │ │ │ │ ├── HeaderItem.java │ │ │ │ │ ├── ErrorItem.java │ │ │ │ │ ├── EmptyItem.java │ │ │ │ │ ├── BaseItem.java │ │ │ │ │ ├── FooterItem.java │ │ │ │ │ ├── TextItem.java │ │ │ │ │ └── ImageItem.java │ │ │ │ │ ├── model │ │ │ │ │ ├── ModelFaker.java │ │ │ │ │ ├── BaseModel.java │ │ │ │ │ ├── TextModel.java │ │ │ │ │ └── ImageModel.java │ │ │ │ │ ├── util │ │ │ │ │ └── BindingUtil.java │ │ │ │ │ └── presenter │ │ │ │ │ └── MainPresenter.java │ │ │ └── AndroidManifest.xml │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadaptertutorial │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── baurine │ │ │ └── multitypeadaptertutorial │ │ │ └── ExampleInstrumentedTest.java │ ├── proguard-rules.pro │ └── build.gradle ├── multitypeadapter │ ├── .gitignore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ └── values │ │ │ │ │ └── strings.xml │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadapter │ │ │ │ └── MultiTypeAdapter.java │ │ ├── test │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── baurine │ │ │ │ └── multitypeadapter │ │ │ │ └── ExampleUnitTest.java │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── baurine │ │ │ └── multitypeadapter │ │ │ └── ExampleInstrumentedTest.java │ ├── proguard-rules.pro │ └── build.gradle ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore ├── build.gradle ├── gradle.properties ├── gradlew.bat └── gradlew ├── note ├── tutorial_art │ ├── tutorial_step_5.png │ ├── tutorial_step_8.png │ ├── tutorial_step_10_1.gif │ ├── tutorial_step_11_1.gif │ ├── tutorial_step_9_1.gif │ ├── tutorial_step_final.png │ ├── tutorial_step_6_refresh_1.gif │ ├── tutorial_step_6_refresh_2.gif │ ├── tutorial_step_7_loadmore_1.gif │ └── tutorial_step_7_loadmore_2.gif ├── sample_art │ ├── multi_type_adapter_1.gif │ ├── multi_type_adapter_2.gif │ └── multi_type_adapter_3.gif └── multi-type-adapter-tutorial-1.md └── README.md /MultiTypeAdapterSample/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':multitypeadapter' 2 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':multitypeadapter' 2 | -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_5.png -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_8.png -------------------------------------------------------------------------------- /note/sample_art/multi_type_adapter_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/sample_art/multi_type_adapter_1.gif -------------------------------------------------------------------------------- /note/sample_art/multi_type_adapter_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/sample_art/multi_type_adapter_2.gif -------------------------------------------------------------------------------- /note/sample_art/multi_type_adapter_3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/sample_art/multi_type_adapter_3.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_10_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_10_1.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_11_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_11_1.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_9_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_9_1.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_final.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MultiTypeAdapterSample 3 | 4 | -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_6_refresh_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_6_refresh_1.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_6_refresh_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_6_refresh_2.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_7_loadmore_1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_7_loadmore_1.gif -------------------------------------------------------------------------------- /note/tutorial_art/tutorial_step_7_loadmore_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/note/tutorial_art/tutorial_step_7_loadmore_2.gif -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MultiTypeAdapter 3 | 4 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MultiTypeAdapter Tutorial 3 | 4 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MultiTypeAdapter 3 | 4 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_obama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_obama.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_djtrump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_djtrump.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_dlputin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_dlputin.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_xidada.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/drawable-xxhdpi/ic_xidada.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterSample/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/baurine/multi-type-adapter/HEAD/MultiTypeAdapterTutorial/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiTypeAdapterSample/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | #/.idea/workspace.xml 6 | #/.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | #/.idea/workspace.xml 6 | #/.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable/x_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable/x_btn_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/drawable/x_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Dec 28 10:00:20 PST 2015 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/drawable/x_btn_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/activity/RefreshingView.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.activity; 2 | 3 | /** 4 | * Created by baurine on 1/16/17. 5 | */ 6 | 7 | public interface RefreshingView { 8 | void setRefreshing(boolean refreshing); 9 | } 10 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/activity/RefreshingView.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.activity; 2 | 3 | /** 4 | * Created by baurine on 1/12/17. 5 | */ 6 | 7 | // it should move to `iview` folder 8 | public interface RefreshingView { 9 | void setRefreshing(boolean refreshing); 10 | } 11 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/drawable/x_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/drawable/x_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/item/HeaderItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.item; 2 | 3 | import com.baurine.multitypeadaptersample.R; 4 | 5 | /** 6 | * Created by baurine on 1/10/17. 7 | */ 8 | 9 | public class HeaderItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_header; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/item/HeaderItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.item; 2 | 3 | import com.baurine.multitypeadaptertutorial.R; 4 | 5 | /** 6 | * Created by baurine on 1/14/17. 7 | */ 8 | 9 | public class HeaderItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_header; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/util/DateFormatUtil.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.util; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | 6 | public class DateFormatUtil { 7 | 8 | private static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 9 | 10 | public static String formatTime(Date date) { 11 | return sdf.format(date); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/test/java/com/baurine/multitypeadaptersample/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/src/test/java/com/baurine/multitypeadapter/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadapter; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/model/ModelFaker.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.model; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * Created by baurine on 1/16/17. 7 | */ 8 | 9 | public class ModelFaker { 10 | public static BaseModel fake() { 11 | String type = new Random().nextBoolean() ? "image" : "text"; 12 | if (type.equals("image")) { 13 | return new ImageModel(); 14 | } else { 15 | return new TextModel(); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/src/test/java/com/baurine/multitypeadapter/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadapter; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/test/java/com/baurine/multitypeadaptertutorial/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/util/CommonUtil.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.util; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.widget.Toast; 6 | 7 | public class CommonUtil { 8 | 9 | public static int dpToPx(int dp) { 10 | return (int) (dp * Resources.getSystem().getDisplayMetrics().density); 11 | } 12 | 13 | public static void showToast(Context cxt, String content) { 14 | Toast.makeText(cxt, content, Toast.LENGTH_SHORT).show(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/model/ModelFaker.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.model; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * Created by baurine on 1/11/17. 7 | */ 8 | 9 | public class ModelFaker { 10 | public static BaseModel fake() { 11 | int type = new Random().nextInt() % 3; 12 | if (type == 0) { 13 | return new ImageModel(); 14 | } else if (type == 1) { 15 | return new TextModel(); 16 | } else { 17 | return new FollowerModel(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | 21 | task clean(type: Delete) { 22 | delete rootProject.buildDir 23 | } 24 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.2.3' 9 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' 10 | 11 | // NOTE: Do not place your application dependencies here; they belong 12 | // in the individual module build.gradle files 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | jcenter() 19 | } 20 | } 21 | 22 | task clean(type: Delete) { 23 | delete rootProject.buildDir 24 | } 25 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/baurine/Developments/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/item/ErrorItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.item; 2 | 3 | import com.baurine.multitypeadaptersample.R; 4 | 5 | /** 6 | * Created by baurine on 1/10/17. 7 | */ 8 | 9 | public class ErrorItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_error; 13 | } 14 | 15 | ///////////////////////////////////////////////// 16 | public ErrorItem() { 17 | content = "Error happened! please try it later!"; 18 | } 19 | 20 | ///////////////////////////////////////////////// 21 | // data part 22 | private String content; 23 | 24 | public String getContent() { 25 | return content; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/baurine/Developments/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/item/EmptyItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.item; 2 | 3 | import com.baurine.multitypeadaptersample.R; 4 | 5 | /** 6 | * Created by baurine on 1/10/17. 7 | */ 8 | 9 | public class EmptyItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_empty; 13 | } 14 | 15 | ///////////////////////////////////////////////// 16 | public EmptyItem() { 17 | content = "Currently has no items, please refresh it later!"; 18 | } 19 | 20 | ///////////////////////////////////////////////// 21 | // data part 22 | private String content; 23 | 24 | public String getContent() { 25 | return content; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/baurine/Developments/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/item/ErrorItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.item; 2 | 3 | 4 | import com.baurine.multitypeadaptertutorial.R; 5 | 6 | /** 7 | * Created by baurine on 1/10/17. 8 | */ 9 | 10 | public class ErrorItem extends BaseItem { 11 | @Override 12 | public int getLayout() { 13 | return R.layout.item_error; 14 | } 15 | 16 | ///////////////////////////////////////////////// 17 | public ErrorItem() { 18 | content = "Error happened! please try it later!"; 19 | } 20 | 21 | ///////////////////////////////////////////////// 22 | // data part 23 | private String content; 24 | 25 | public String getContent() { 26 | return content; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/baurine/Developments/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/item/EmptyItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.item; 2 | 3 | import com.baurine.multitypeadaptertutorial.R; 4 | 5 | /** 6 | * Created by baurine on 1/10/17. 7 | */ 8 | 9 | public class EmptyItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_empty; 13 | } 14 | 15 | ///////////////////////////////////////////////// 16 | public EmptyItem() { 17 | content = "Currently has no items, please refresh it later!"; 18 | } 19 | 20 | ///////////////////////////////////////////////// 21 | // data part 22 | private final String content; 23 | 24 | public String getContent() { 25 | return content; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/model/BaseModel.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.model; 2 | 3 | import com.baurine.multitypeadapter.MultiTypeAdapter; 4 | 5 | import java.util.Date; 6 | import java.util.Random; 7 | 8 | /** 9 | * Created by baurine on 1/11/17. 10 | */ 11 | 12 | public class BaseModel { 13 | 14 | public MultiTypeAdapter.IItem createItem(MultiTypeAdapter adapter) { 15 | return null; 16 | } 17 | 18 | ///////////////////////////////////////////////////////////////////// 19 | public final int id; 20 | public final Date createdAt; 21 | public final Date updatedAt; 22 | 23 | public BaseModel() { 24 | id = (new Random()).nextInt(10000); 25 | createdAt = new Date(); 26 | updatedAt = new Date(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/util/BindingUtil.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.util; 2 | 3 | import android.databinding.BindingAdapter; 4 | import android.graphics.drawable.Drawable; 5 | import android.widget.ImageView; 6 | 7 | import com.bumptech.glide.Glide; 8 | 9 | public class BindingUtil { 10 | @BindingAdapter({"imageUrl", "error", "placeholder"}) 11 | public static void loadImage(ImageView imgView, 12 | String url, 13 | Drawable error, 14 | Drawable placeholder) { 15 | Glide.with(imgView.getContext()) 16 | .load(url) 17 | .error(error) 18 | .placeholder(placeholder) 19 | .into(imgView); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/model/BaseModel.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.model; 2 | 3 | import com.baurine.multitypeadapter.MultiTypeAdapter; 4 | import com.baurine.multitypeadaptertutorial.item.BaseItem; 5 | 6 | import java.util.Date; 7 | import java.util.Random; 8 | 9 | /** 10 | * Created by baurine on 1/11/17. 11 | */ 12 | 13 | public class BaseModel { 14 | public BaseItem createItem(MultiTypeAdapter adapter) { 15 | return null; 16 | } 17 | 18 | //////////////////////////////////////////////////////// 19 | public int id; 20 | public Date createdAt; 21 | public Date updatedAt; 22 | 23 | public BaseModel() { 24 | id = (new Random()).nextInt(10000); 25 | createdAt = new Date(); 26 | updatedAt = new Date(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/model/ImageModel.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.model; 2 | 3 | import com.baurine.multitypeadapter.MultiTypeAdapter; 4 | import com.baurine.multitypeadaptersample.item.ImageItem; 5 | 6 | import java.util.Random; 7 | 8 | /** 9 | * Created by baurine on 1/11/17. 10 | */ 11 | 12 | public class ImageModel extends BaseModel { 13 | @Override 14 | public MultiTypeAdapter.IItem createItem(MultiTypeAdapter adapter) { 15 | return new ImageItem(this, adapter); 16 | } 17 | 18 | //////////////////////////////////////// 19 | public final String url; 20 | public boolean liked; 21 | 22 | public ImageModel() { 23 | super(); 24 | url = "https://unsplash.it/200/200?random&" + new Random().nextInt(40); 25 | liked = (new Random()).nextBoolean(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/item/BaseItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.item; 2 | 3 | import android.view.View; 4 | 5 | import com.baurine.multitypeadapter.MultiTypeAdapter; 6 | import com.baurine.multitypeadaptersample.BR; 7 | 8 | /** 9 | * Created by baurine on 1/10/17. 10 | */ 11 | 12 | public abstract class BaseItem implements MultiTypeAdapter.IItem { 13 | @Override 14 | public int getVariableId() { 15 | return BR.item; 16 | } 17 | 18 | //////////////////////////////////////////// 19 | // handle event 20 | private View.OnClickListener onClickListener; 21 | 22 | public View.OnClickListener getOnClickListener() { 23 | return onClickListener; 24 | } 25 | 26 | public void setOnClickListener(View.OnClickListener onClickListener) { 27 | this.onClickListener = onClickListener; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/item/BaseItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.item; 2 | 3 | import android.view.View; 4 | 5 | import com.android.databinding.library.baseAdapters.BR; 6 | import com.baurine.multitypeadapter.MultiTypeAdapter; 7 | 8 | /** 9 | * Created by baurine on 1/10/17. 10 | */ 11 | 12 | public abstract class BaseItem implements MultiTypeAdapter.IItem { 13 | @Override 14 | public int getVariableId() { 15 | return BR.item; 16 | } 17 | 18 | //////////////////////////////////////////// 19 | // handle event 20 | private View.OnClickListener onClickListener; 21 | 22 | public View.OnClickListener getOnClickListener() { 23 | return onClickListener; 24 | } 25 | 26 | public void setOnClickListener(View.OnClickListener onClickListener) { 27 | this.onClickListener = onClickListener; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/model/TextModel.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.model; 2 | 3 | import com.baurine.multitypeadapter.MultiTypeAdapter; 4 | import com.baurine.multitypeadaptertutorial.item.BaseItem; 5 | import com.baurine.multitypeadaptertutorial.item.TextItem; 6 | 7 | import java.util.Date; 8 | import java.util.Random; 9 | 10 | /** 11 | * Created by baurine on 1/16/17. 12 | */ 13 | 14 | public class TextModel extends BaseModel { 15 | @Override 16 | public BaseItem createItem(MultiTypeAdapter adapter) { 17 | return new TextItem(adapter, this); 18 | } 19 | 20 | //////////////////////////////////////////////////// 21 | public String content; 22 | public boolean liked; 23 | 24 | public TextModel() { 25 | super(); 26 | content = new Date().toString(); 27 | liked = new Random().nextBoolean(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/model/ImageModel.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.model; 2 | 3 | import com.baurine.multitypeadapter.MultiTypeAdapter; 4 | import com.baurine.multitypeadaptertutorial.item.BaseItem; 5 | import com.baurine.multitypeadaptertutorial.item.ImageItem; 6 | 7 | import java.util.Random; 8 | 9 | /** 10 | * Created by baurine on 1/16/17. 11 | */ 12 | 13 | public class ImageModel extends BaseModel { 14 | @Override 15 | public BaseItem createItem(MultiTypeAdapter adapter) { 16 | return new ImageItem(adapter, this); 17 | } 18 | 19 | //////////////////////////////////////////////////// 20 | public String url; 21 | public boolean liked; 22 | 23 | public ImageModel() { 24 | super(); 25 | url = "https://unsplash.it/200/200?random&" + new Random().nextInt(40); 26 | liked = new Random().nextBoolean(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/androidTest/java/com/baurine/multitypeadaptersample/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.baurine.multitypeadaptersample", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/src/androidTest/java/com/baurine/multitypeadapter/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadapter; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.baurine.multitypeadapter.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/src/androidTest/java/com/baurine/multitypeadapter/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadapter; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.baurine.multitypeadapter.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/androidTest/java/com/baurine/multitypeadaptertutorial/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.baurine.multitypeadaptertutorial", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/layout/item_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 20 | 21 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/layout/item_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 20 | 21 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/layout/item_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 19 | 20 | 24 | 25 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/multitypeadapter/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.1" 6 | 7 | defaultConfig { 8 | minSdkVersion 16 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | dataBinding { 23 | enabled = true 24 | } 25 | } 26 | 27 | dependencies { 28 | compile fileTree(dir: 'libs', include: ['*.jar']) 29 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 30 | exclude group: 'com.android.support', module: 'support-annotations' 31 | }) 32 | compile 'com.android.support:appcompat-v7:25.1.0' 33 | compile 'com.android.support:recyclerview-v7:25.1.0' 34 | testCompile 'junit:junit:4.12' 35 | } 36 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/util/BindingUtil.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.util; 2 | 3 | import android.databinding.BindingAdapter; 4 | import android.graphics.drawable.Drawable; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.bumptech.glide.Glide; 9 | 10 | public class BindingUtil { 11 | @BindingAdapter({"imageUrl", "error", "placeholder"}) 12 | public static void loadImage(ImageView imgView, 13 | String url, 14 | Drawable error, 15 | Drawable placeholder) { 16 | Glide.with(imgView.getContext()) 17 | .load(url) 18 | .error(error) 19 | .placeholder(placeholder) 20 | .into(imgView); 21 | } 22 | 23 | @BindingAdapter("android:paddingVertical") 24 | public static void setPaddingVertical(View view, int paddingVertical) { 25 | int px = CommonUtil.dpToPx(paddingVertical); 26 | view.setPadding(view.getPaddingLeft(), px, view.getPaddingRight(), px); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/java/com/baurine/multitypeadaptersample/item/FooterItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptersample.item; 2 | 3 | import com.baurine.multitypeadaptersample.R; 4 | 5 | /** 6 | * Created by baurine on 1/10/17. 7 | */ 8 | 9 | public class FooterItem extends BaseItem { 10 | @Override 11 | public int getLayout() { 12 | return R.layout.item_footer; 13 | } 14 | 15 | /////////////////////////////////////////////// 16 | public FooterItem setState(int state) { 17 | this.state = state; 18 | return this; 19 | } 20 | 21 | /////////////////////////////////////////////// 22 | // data part 23 | // FooterItem has 3 states: Loading, Error, NoMore 24 | public final static int LOADING = 0; 25 | public final static int ERROR = 1; 26 | public final static int NO_MORE = 2; 27 | private int state = LOADING; 28 | 29 | public boolean isLoading() { 30 | return state == LOADING; 31 | } 32 | 33 | public boolean isError() { 34 | return state == ERROR; 35 | } 36 | 37 | public boolean isNoMore() { 38 | return state == NO_MORE; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/res/layout/item_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 18 | 19 | 26 | 27 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/src/main/java/com/baurine/multitypeadaptertutorial/item/FooterItem.java: -------------------------------------------------------------------------------- 1 | package com.baurine.multitypeadaptertutorial.item; 2 | 3 | 4 | import com.baurine.multitypeadaptertutorial.R; 5 | 6 | /** 7 | * Created by baurine on 1/10/17. 8 | */ 9 | 10 | public class FooterItem extends BaseItem { 11 | @Override 12 | public int getLayout() { 13 | return R.layout.item_footer; 14 | } 15 | 16 | /////////////////////////////////////////////// 17 | public FooterItem setState(int state) { 18 | this.state = state; 19 | return this; 20 | } 21 | 22 | /////////////////////////////////////////////// 23 | // data part 24 | // FooterItem has 3 states: Loading, Error, NoMore 25 | public final static int LOADING = 0; 26 | public final static int ERROR = 1; 27 | public final static int NO_MORE = 2; 28 | private int state = LOADING; 29 | 30 | public boolean isLoading() { 31 | return state == LOADING; 32 | } 33 | 34 | public boolean isError() { 35 | return state == ERROR; 36 | } 37 | 38 | public boolean isNoMore() { 39 | return state == NO_MORE; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/multitypeadapter/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'com.github.dcendents.android-maven' 3 | 4 | group='com.github.baurine' 5 | 6 | android { 7 | compileSdkVersion 25 8 | buildToolsVersion "24.0.1" 9 | 10 | defaultConfig { 11 | minSdkVersion 16 12 | targetSdkVersion 25 13 | versionCode 10006 14 | versionName "1.0.6" 15 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 16 | } 17 | buildTypes { 18 | release { 19 | minifyEnabled false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | dataBinding { 24 | enabled = true 25 | } 26 | } 27 | 28 | dependencies { 29 | compile fileTree(dir: 'libs', include: ['*.jar']) 30 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 31 | exclude group: 'com.android.support', module: 'support-annotations' 32 | }) 33 | compile 'com.android.support:appcompat-v7:25.1.0' 34 | compile 'com.android.support:recyclerview-v7:25.1.0' 35 | testCompile 'junit:junit:4.12' 36 | } 37 | -------------------------------------------------------------------------------- /MultiTypeAdapterTutorial/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.1" 6 | defaultConfig { 7 | applicationId "com.baurine.multitypeadaptertutorial" 8 | minSdkVersion 16 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | dataBinding { 21 | enabled = true 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(dir: 'libs', include: ['*.jar']) 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | compile 'com.android.support:appcompat-v7:25.1.0' 31 | compile 'com.android.support:recyclerview-v7:25.1.0' 32 | compile 'com.github.bumptech.glide:glide:3.7.0' 33 | testCompile 'junit:junit:4.12' 34 | compile project(path: ':multitypeadapter') 35 | } 36 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "24.0.1" 6 | defaultConfig { 7 | applicationId "com.baurine.multitypeadaptersample" 8 | minSdkVersion 16 9 | targetSdkVersion 25 10 | versionCode 10006 11 | versionName "1.0.6" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | dataBinding { 21 | enabled = true 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(dir: 'libs', include: ['*.jar']) 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | compile project(':multitypeadapter') 31 | compile 'com.android.support:appcompat-v7:25.1.0' 32 | compile 'com.android.support:recyclerview-v7:25.1.0' 33 | compile 'com.android.support:cardview-v7:25.1.0' 34 | compile 'com.github.bumptech.glide:glide:3.7.0' 35 | testCompile 'junit:junit:4.12' 36 | } 37 | -------------------------------------------------------------------------------- /MultiTypeAdapterSample/app/src/main/res/layout/item_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 21 | 22 | 26 | 27 |