├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── drawable
│ │ │ │ ├── iu.jpg
│ │ │ │ ├── iu_album.jpg
│ │ │ │ ├── iu_large.jpg
│ │ │ │ └── iu_producer.jpg
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── values
│ │ │ │ ├── styles.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ └── strings.xml
│ │ │ ├── menu
│ │ │ │ └── menu_main.xml
│ │ │ ├── values-w820dp
│ │ │ │ └── dimens.xml
│ │ │ └── layout
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── image_item.xml
│ │ │ │ ├── recycler_view.xml
│ │ │ │ ├── recycler_view_data_binding.xml
│ │ │ │ ├── image.xml
│ │ │ │ ├── user.xml
│ │ │ │ ├── main.xml
│ │ │ │ ├── observable_user.xml
│ │ │ │ ├── observable_fields_user.xml
│ │ │ │ └── observable_collection.xml
│ │ ├── java
│ │ │ └── net
│ │ │ │ └── novafactory
│ │ │ │ └── example
│ │ │ │ ├── image
│ │ │ │ ├── BindingUtils.java
│ │ │ │ └── ImageFragment.java
│ │ │ │ ├── MainFragment.java
│ │ │ │ ├── observable
│ │ │ │ ├── ObservableFieldsUser.java
│ │ │ │ ├── ObservableUser.java
│ │ │ │ ├── ObservableUserFragment.java
│ │ │ │ └── ObservableFieldsUserFragment.java
│ │ │ │ ├── basic
│ │ │ │ ├── User.java
│ │ │ │ └── UserFragment.java
│ │ │ │ ├── collection
│ │ │ │ └── ObservableCollectionFragment.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ └── list
│ │ │ │ ├── RecyclerViewFragment.java
│ │ │ │ └── RecyclerViewDataBindingFragment.java
│ │ └── AndroidManifest.xml
│ └── androidTest
│ │ └── java
│ │ └── net
│ │ └── novafactory
│ │ └── example
│ │ └── ApplicationTest.java
├── proguard-rules.pro
├── build.gradle
└── app.iml
├── settings.gradle
├── Databinding.key
├── Databinding.pdf
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .gitignore
├── README.md
├── gradle.properties
├── DataBindingExample.iml
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/Databinding.key:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/Databinding.key
--------------------------------------------------------------------------------
/Databinding.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/Databinding.pdf
--------------------------------------------------------------------------------
/app/src/main/res/drawable/iu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/drawable/iu.jpg
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/workspace.xml
4 | /.idea/libraries
5 | .DS_Store
6 | /build
7 | /captures
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/iu_album.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/drawable/iu_album.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/iu_large.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/drawable/iu_large.jpg
--------------------------------------------------------------------------------
/app/src/main/res/drawable/iu_producer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/drawable/iu_producer.jpg
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/croute/DataBindingExample/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Jul 12 06:04:14 KST 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.4-all.zip
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Android Data Binding example #
2 |
3 | ### Presentation file ###
4 |
5 | ##### keynote #####
6 |
7 | * `root/Databinding.key`
8 | * [File link](https://github.com/croute/DataBindingExample/blob/master/Databinding.key?raw=true)
9 |
10 | ##### pdf #####
11 |
12 | * `root/Databinding.pdf`
13 | * [File link](https://github.com/croute/DataBindingExample/blob/master/Databinding.pdf)
14 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/net/novafactory/example/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/image/BindingUtils.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.image;
2 |
3 | import android.databinding.BindingAdapter;
4 | import android.graphics.drawable.Drawable;
5 | import android.widget.ImageView;
6 |
7 | import com.squareup.picasso.Picasso;
8 |
9 | public class BindingUtils {
10 |
11 | @BindingAdapter({"bind:imageUrl", "bind:error"})
12 | public static void loadImage(ImageView view, String url, Drawable error) {
13 | Picasso.with(view.getContext()).load(url).error(error).into(view);
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/MainFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 |
10 | /**
11 | * @author nova
12 | */
13 | public class MainFragment extends Fragment {
14 |
15 | @Nullable
16 | @Override
17 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
18 | return inflater.inflate(R.layout.main, container, false);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/image_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
9 |
10 |
11 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/observable/ObservableFieldsUser.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.observable;
2 |
3 | import android.databinding.BaseObservable;
4 | import android.databinding.Bindable;
5 | import android.databinding.ObservableField;
6 | import android.graphics.drawable.Drawable;
7 |
8 | /**
9 | * @author nova
10 | */
11 | public class ObservableFieldsUser extends BaseObservable {
12 |
13 | @Bindable
14 | public final ObservableField profile = new ObservableField<>();
15 | @Bindable
16 | public final ObservableField firstName = new ObservableField<>();
17 | @Bindable
18 | public final ObservableField lastName = new ObservableField<>();
19 | }
20 |
--------------------------------------------------------------------------------
/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/nova/Documents/sdk/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 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/basic/User.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.basic;
2 |
3 | import android.graphics.drawable.Drawable;
4 |
5 | /**
6 | * @author nova
7 | */
8 | public class User {
9 | private final Drawable profile;
10 | private final String firstName;
11 | private final String lastName;
12 |
13 | public User(Drawable profile, String firstName, String lastName) {
14 | this.profile = profile;
15 | this.firstName = firstName;
16 | this.lastName = lastName;
17 | }
18 |
19 | public Drawable getProfile() {
20 | return profile;
21 | }
22 |
23 | public String getFirstName() {
24 | return this.firstName;
25 | }
26 |
27 | public String getLastName() {
28 | return this.lastName;
29 | }
30 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | DataBindingExample
3 |
4 | Hello world!
5 | Settings
6 | Basic
7 | Observable
8 | Observable Fields
9 | Observable Collection
10 | 데이터 바꾸기
11 | 다시 바꾸기
12 | 섞기
13 | RecyclerView
14 | RecyclerView DataBinding
15 | Image
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/recycler_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/recycler_view_data_binding.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/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 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/app/src/main/res/layout/image.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
11 |
16 |
17 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/DataBindingExample.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | apply plugin: 'com.android.databinding'
3 |
4 | android {
5 | compileSdkVersion 22
6 | buildToolsVersion "23.0.0 rc3"
7 |
8 | defaultConfig {
9 | applicationId "net.novafactory.example"
10 | minSdkVersion 16
11 | targetSdkVersion 22
12 | versionCode 1
13 | versionName "1.0"
14 | }
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19 | }
20 | }
21 | compileOptions {
22 | sourceCompatibility JavaVersion.VERSION_1_7
23 | targetCompatibility JavaVersion.VERSION_1_7
24 | }
25 | }
26 |
27 | dependencies {
28 | compile fileTree(dir: 'libs', include: ['*.jar'])
29 | compile 'com.android.support:appcompat-v7:22.2.0'
30 |
31 | // recycler view
32 | compile 'com.android.support:recyclerview-v7:22.2.0'
33 |
34 | // Image loader
35 | compile 'com.squareup.picasso:picasso:2.5.2'
36 | }
37 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/basic/UserFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.basic;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v4.content.ContextCompat;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 |
12 | import net.novafactory.example.R;
13 | import net.novafactory.example.databinding.UserBinding;
14 |
15 | /**
16 | *
17 | * @author nova
18 | */
19 | public class UserFragment extends Fragment {
20 |
21 | private User user;
22 |
23 | @Override
24 | public void onCreate(@Nullable Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | user = new User(ContextCompat.getDrawable(getActivity(), R.drawable.iu), "IU", "아이유");
27 | }
28 |
29 | @Nullable
30 | @Override
31 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
32 | return inflater.inflate(R.layout.user, container, false);
33 | }
34 |
35 | @Override
36 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
37 | super.onViewCreated(view, savedInstanceState);
38 | UserBinding binding = DataBindingUtil.bind(view);
39 | binding.setUser(user);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/observable/ObservableUser.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.observable;
2 |
3 | import android.databinding.BaseObservable;
4 | import android.databinding.Bindable;
5 | import android.graphics.drawable.Drawable;
6 |
7 | /**
8 | * @author nova
9 | */
10 | public class ObservableUser extends BaseObservable {
11 |
12 | private Drawable profile;
13 | private String firstName;
14 | private String lastName;
15 |
16 | public ObservableUser(Drawable profile, String firstName, String lastName) {
17 | this.profile = profile;
18 | this.firstName = firstName;
19 | this.lastName = lastName;
20 | }
21 |
22 | @Bindable
23 | public Drawable getProfile() {
24 | return profile;
25 | }
26 |
27 | public void setProfile(Drawable profile) {
28 | this.profile = profile;
29 | notifyPropertyChanged(net.novafactory.example.BR.profile);
30 | }
31 |
32 | @Bindable
33 | public String getFirstName() {
34 | return firstName;
35 | }
36 |
37 |
38 | public void setFirstName(String firstName) {
39 | this.firstName = firstName;
40 | notifyPropertyChanged(net.novafactory.example.BR.firstName);
41 | }
42 |
43 | @Bindable
44 | public String getLastName() {
45 | return lastName;
46 | }
47 |
48 | public void setLastName(String lastName) {
49 | this.lastName = lastName;
50 | notifyPropertyChanged(net.novafactory.example.BR.lastName);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/user.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
20 |
21 |
28 |
29 |
37 |
38 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
15 |
20 |
21 |
26 |
27 |
32 |
33 |
38 |
39 |
44 |
45 |
50 |
51 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/observable/ObservableUserFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.observable;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v4.content.ContextCompat;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 |
12 | import net.novafactory.example.R;
13 | import net.novafactory.example.databinding.ObservableUserBinding;
14 |
15 | /**
16 | * @author nova
17 | */
18 | public class ObservableUserFragment extends Fragment {
19 |
20 | private ObservableUser user;
21 |
22 | @Override
23 | public void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | user = new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu), "IU", "아이유");
26 | }
27 |
28 | @Nullable
29 | @Override
30 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
31 | return inflater.inflate(R.layout.observable_user, container, false);
32 | }
33 |
34 | @Override
35 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
36 | super.onViewCreated(view, savedInstanceState);
37 | ObservableUserBinding binding = DataBindingUtil.bind(view);
38 | binding.setUser(user);
39 | binding.observableUserBtnChange.setOnClickListener(new View.OnClickListener() {
40 | @Override
41 | public void onClick(View v) {
42 | user.setProfile(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer));
43 | user.setFirstName("Producer IU");
44 | user.setLastName("씐디");
45 | }
46 | });
47 | binding.observableUserBtnChangeAgain.setOnClickListener(new View.OnClickListener() {
48 | @Override
49 | public void onClick(View v) {
50 | user.setProfile(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album));
51 | user.setFirstName("IU");
52 | user.setLastName("마음");
53 | }
54 | });
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/observable_user.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
18 |
19 |
25 |
26 |
34 |
35 |
43 |
44 |
52 |
53 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/observable/ObservableFieldsUserFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.observable;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v4.content.ContextCompat;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 |
12 | import net.novafactory.example.R;
13 | import net.novafactory.example.databinding.ObservableFieldsUserBinding;
14 |
15 | /**
16 | * @author nova
17 | */
18 | public class ObservableFieldsUserFragment extends Fragment {
19 |
20 | private ObservableFieldsUser user;
21 |
22 | @Override
23 | public void onCreate(@Nullable Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 | user = new ObservableFieldsUser();
26 | user.profile.set(ContextCompat.getDrawable(getActivity(), R.drawable.iu));
27 | user.firstName.set("IU");
28 | user.lastName.set("아이유");
29 | }
30 |
31 | @Nullable
32 | @Override
33 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
34 | return inflater.inflate(R.layout.observable_fields_user, container, false);
35 | }
36 |
37 | @Override
38 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
39 | super.onViewCreated(view, savedInstanceState);
40 | ObservableFieldsUserBinding binding = DataBindingUtil.bind(view);
41 | binding.setUser(user);
42 |
43 |
44 | binding.observableFieldsUserBtnChange.setOnClickListener(new View.OnClickListener() {
45 | @Override
46 | public void onClick(View v) {
47 | user.profile.set(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer));
48 | user.firstName.set("Producer IU");
49 | user.lastName.set("씐디");
50 | }
51 | });
52 | binding.observableFieldsUserBtnChangeAgain.setOnClickListener(new View.OnClickListener() {
53 | @Override
54 | public void onClick(View v) {
55 | user.profile.set(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album));
56 | user.firstName.set("IU");
57 | user.lastName.set("마음");
58 | }
59 | });
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/observable_fields_user.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
18 |
19 |
25 |
26 |
34 |
35 |
43 |
44 |
52 |
53 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/observable_collection.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
13 |
14 |
19 |
20 |
26 |
27 |
35 |
36 |
44 |
45 |
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/collection/ObservableCollectionFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.collection;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.databinding.ObservableArrayMap;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.support.v4.content.ContextCompat;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 |
13 | import net.novafactory.example.R;
14 | import net.novafactory.example.databinding.ObservableCollectionBinding;
15 |
16 | /**
17 | * @author nova
18 | */
19 | public class ObservableCollectionFragment extends Fragment {
20 |
21 | public final ObservableArrayMap user = new ObservableArrayMap<>();
22 |
23 | @Override
24 | public void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | user.put("profile", ContextCompat.getDrawable(getActivity(), R.drawable.iu));
27 | user.put("firstName", "IU");
28 | user.put("lastName", "아이유");
29 | }
30 |
31 | @Nullable
32 | @Override
33 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
34 | return inflater.inflate(R.layout.observable_collection, container, false);
35 | }
36 |
37 | @Override
38 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
39 | super.onViewCreated(view, savedInstanceState);
40 | ObservableCollectionBinding binding = DataBindingUtil.bind(view);
41 |
42 | binding.setUser(user);
43 | binding.observableCollectionBtnChange.setOnClickListener(new View.OnClickListener() {
44 | @Override
45 | public void onClick(View v) {
46 | user.put("profile", ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer));
47 | user.put("firstName", "Producer IU");
48 | user.put("lastName", "씐디");
49 | }
50 | });
51 | binding.observableCollectionBtnChangeAgain.setOnClickListener(new View.OnClickListener() {
52 | @Override
53 | public void onClick(View v) {
54 | user.put("profile", ContextCompat.getDrawable(getActivity(), R.drawable.iu_album));
55 | user.put("firstName", "IU");
56 | user.put("lastName", "마음");
57 | }
58 | });
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/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 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
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 Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/MainActivity.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example;
2 |
3 | import android.os.Bundle;
4 | import android.support.v4.app.Fragment;
5 | import android.support.v4.app.FragmentManager;
6 | import android.support.v4.app.FragmentTransaction;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.view.View;
9 |
10 | import net.novafactory.example.basic.UserFragment;
11 | import net.novafactory.example.collection.ObservableCollectionFragment;
12 | import net.novafactory.example.image.ImageFragment;
13 | import net.novafactory.example.list.RecyclerViewDataBindingFragment;
14 | import net.novafactory.example.list.RecyclerViewFragment;
15 | import net.novafactory.example.observable.ObservableFieldsUserFragment;
16 | import net.novafactory.example.observable.ObservableUserFragment;
17 |
18 | public class MainActivity extends AppCompatActivity {
19 |
20 | @Override
21 | protected void onCreate(Bundle savedInstanceState) {
22 | super.onCreate(savedInstanceState);
23 | setContentView(R.layout.activity_main);
24 |
25 | replaceFragment(new MainFragment());
26 | }
27 |
28 | public void replaceFragment(Fragment fragment) {
29 | FragmentManager fm = getSupportFragmentManager();
30 | FragmentTransaction ft = fm.beginTransaction();
31 | ft.replace(R.id.activity_main_container, fragment, fragment.getClass().getSimpleName());
32 | ft.commit();
33 | }
34 |
35 | public void replaceFragmentWithStack(Fragment fragment, String tag) {
36 | FragmentManager fm = getSupportFragmentManager();
37 | FragmentTransaction ft = fm.beginTransaction();
38 | ft.replace(R.id.activity_main_container, fragment, tag);
39 | ft.addToBackStack(tag);
40 | ft.commit();
41 | }
42 |
43 | public void onClickBasic(View view) {
44 | replaceFragmentWithStack(new UserFragment(), "Basic");
45 | }
46 |
47 | public void onClickObservable(View view) {
48 | replaceFragmentWithStack(new ObservableUserFragment(), "Observable");
49 | }
50 |
51 | public void onClickObservableFields(View view) {
52 | replaceFragmentWithStack(new ObservableFieldsUserFragment(), "ObservableFields");
53 | }
54 |
55 | public void onClickObservableCollection(View view) {
56 | replaceFragmentWithStack(new ObservableCollectionFragment(), "ObservableCollection");
57 | }
58 |
59 | public void onClickRecyclerView(View view) {
60 | replaceFragmentWithStack(new RecyclerViewFragment(), "RecyclerView");
61 | }
62 |
63 | public void onClickRecyclerViewDataBinding(View view) {
64 | replaceFragmentWithStack(new RecyclerViewDataBindingFragment(), "RecyclerViewDataBinding");
65 | }
66 |
67 | public void onClickImage(View view) {
68 | replaceFragmentWithStack(new ImageFragment(), "Image");
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/list/RecyclerViewFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.list;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.support.v4.content.ContextCompat;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.ImageView;
13 | import android.widget.TextView;
14 |
15 | import net.novafactory.example.R;
16 | import net.novafactory.example.basic.User;
17 |
18 | import java.util.ArrayList;
19 | import java.util.Collections;
20 | import java.util.List;
21 |
22 | /**
23 | * @author nova
24 | */
25 | public class RecyclerViewFragment extends Fragment {
26 |
27 | private List list;
28 | private RecyclerViewAdapter adapter;
29 |
30 | @Override
31 | public void onCreate(Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | list = new ArrayList<>();
34 | list.add(new User(ContextCompat.getDrawable(getActivity(), R.drawable.iu), "IU", "아이유"));
35 | list.add(new User(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album), "IU", "마음"));
36 | list.add(new User(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer), "IU Producer", "씐디"));
37 | }
38 |
39 | @Nullable
40 | @Override
41 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
42 | return inflater.inflate(R.layout.recycler_view, container, false);
43 | }
44 |
45 | @Override
46 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
47 | super.onViewCreated(view, savedInstanceState);
48 |
49 | // layout manager
50 | LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
51 | layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
52 | layoutManager.scrollToPosition(0);
53 |
54 | adapter = new RecyclerViewAdapter(list);
55 |
56 | // recyclerview
57 | RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_rv_user);
58 | recyclerView.setLayoutManager(layoutManager);
59 | recyclerView.setAdapter(adapter);
60 |
61 |
62 | // shuffle button
63 | view.findViewById(R.id.recycler_view_btn_shuffle).setOnClickListener(new View.OnClickListener() {
64 | @Override
65 | public void onClick(View v) {
66 | Collections.shuffle(list);
67 | adapter.notifyDataSetChanged();
68 | }
69 | });
70 | }
71 |
72 | public class RecyclerViewAdapter extends RecyclerView.Adapter {
73 |
74 | private List list;
75 |
76 | public RecyclerViewAdapter(List list) {
77 | this.list = list;
78 | }
79 |
80 | @Override
81 | public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
82 | View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.user, viewGroup, false);
83 | return new ViewHolder(view);
84 | }
85 |
86 | @Override
87 | public void onBindViewHolder(ViewHolder holder, int position) {
88 | User user = list.get(position);
89 | holder.ivProfile.setImageDrawable(user.getProfile());
90 | holder.tvFirstName.setText(user.getFirstName());
91 | holder.tvLastName.setText(user.getLastName());
92 | }
93 |
94 | @Override
95 | public int getItemCount() {
96 | return list.size();
97 | }
98 | }
99 |
100 | public class ViewHolder extends RecyclerView.ViewHolder {
101 |
102 | ImageView ivProfile;
103 | TextView tvFirstName;
104 | TextView tvLastName;
105 |
106 | public ViewHolder(View itemView) {
107 | super(itemView);
108 |
109 | ivProfile = (ImageView) itemView.findViewById(R.id.user_iv_profile);
110 | tvFirstName = (TextView) itemView.findViewById(R.id.user_tv_first_name);
111 | tvLastName = (TextView) itemView.findViewById(R.id.user_tv_last_name);
112 | }
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/list/RecyclerViewDataBindingFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.list;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.databinding.ObservableArrayList;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.support.v4.content.ContextCompat;
9 | import android.support.v7.widget.LinearLayoutManager;
10 | import android.support.v7.widget.RecyclerView;
11 | import android.view.LayoutInflater;
12 | import android.view.View;
13 | import android.view.ViewGroup;
14 |
15 | import net.novafactory.example.R;
16 | import net.novafactory.example.databinding.ObservableUserBinding;
17 | import net.novafactory.example.observable.ObservableUser;
18 |
19 | import java.util.Collections;
20 |
21 | /**
22 | * @author nova
23 | */
24 | public class RecyclerViewDataBindingFragment extends Fragment {
25 |
26 | private ObservableArrayList list;
27 | private RecyclerViewAdapter adapter;
28 |
29 | @Override
30 | public void onCreate(Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | list = new ObservableArrayList<>();
33 | list.add(new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu), "IU", "아이유"));
34 | list.add(new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album), "IU", "마음"));
35 | list.add(new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album), null, "마음"));
36 | list.add(new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer), "IU Producer", "씐디"));
37 | list.add(new ObservableUser(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer), "IU Producer", null));
38 | }
39 |
40 | @Nullable
41 | @Override
42 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
43 | return inflater.inflate(R.layout.recycler_view_data_binding, container, false);
44 | }
45 |
46 | @Override
47 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
48 | super.onViewCreated(view, savedInstanceState);
49 |
50 | // layout manager
51 | LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
52 | layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
53 | layoutManager.scrollToPosition(0);
54 |
55 | adapter = new RecyclerViewAdapter(list);
56 |
57 | // recyclerview
58 | RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view_data_binding_rv_user);
59 | recyclerView.setLayoutManager(layoutManager);
60 | recyclerView.setAdapter(adapter);
61 |
62 | // shuffle button
63 | view.findViewById(R.id.recycler_view_data_binding_btn_shuffle).setOnClickListener(new View.OnClickListener() {
64 | @Override
65 | public void onClick(View v) {
66 | Collections.shuffle(list);
67 | adapter.notifyDataSetChanged();
68 | }
69 | });
70 | }
71 |
72 | public class RecyclerViewAdapter extends RecyclerView.Adapter {
73 |
74 | private ObservableArrayList list;
75 |
76 | public RecyclerViewAdapter(ObservableArrayList list) {
77 | this.list = list;
78 | }
79 |
80 | @Override
81 | public BindingHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
82 | View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.observable_user, viewGroup, false);
83 | return new BindingHolder(view);
84 | }
85 |
86 | @Override
87 | public void onBindViewHolder(BindingHolder holder, int position) {
88 | ObservableUser user = list.get(position);
89 | holder.getBinding().setUser(user);
90 |
91 | // Immediate Binding
92 | // holder.getBinding().executePendingBindings();
93 | }
94 |
95 | @Override
96 | public int getItemCount() {
97 | return list.size();
98 | }
99 | }
100 |
101 | public class BindingHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
102 |
103 | private ObservableUserBinding binding;
104 |
105 | public BindingHolder(View itemView) {
106 | super(itemView);
107 | binding = DataBindingUtil.bind(itemView);
108 | binding.observableUserBtnChange.setOnClickListener(this);
109 | binding.observableUserBtnChangeAgain.setOnClickListener(this);
110 | }
111 |
112 | public ObservableUserBinding getBinding() {
113 | return binding;
114 | }
115 |
116 | @Override
117 | public void onClick(View v) {
118 | switch (v.getId()) {
119 | case R.id.observable_user_btn_change:
120 | binding.getUser().setProfile(ContextCompat.getDrawable(getActivity(), R.drawable.iu_producer));
121 | binding.getUser().setFirstName("Producer IU");
122 | binding.getUser().setLastName("씐디");
123 | break;
124 | case R.id.observable_user_btn_change_again:
125 | binding.getUser().setProfile(ContextCompat.getDrawable(getActivity(), R.drawable.iu_album));
126 | binding.getUser().setFirstName("IU");
127 | binding.getUser().setLastName("마음");
128 | break;
129 | }
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/app/app.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | generateDebugAndroidTestSources
19 | generateDebugSources
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/app/src/main/java/net/novafactory/example/image/ImageFragment.java:
--------------------------------------------------------------------------------
1 | package net.novafactory.example.image;
2 |
3 | import android.databinding.DataBindingUtil;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 |
13 | import net.novafactory.example.R;
14 | import net.novafactory.example.databinding.ImageItemBinding;
15 |
16 | import java.util.ArrayList;
17 | import java.util.Collections;
18 | import java.util.List;
19 |
20 | /**
21 | * @author nova
22 | */
23 | public class ImageFragment extends Fragment {
24 |
25 | private List list;
26 | private ImageAdapter adapter;
27 |
28 | @Override
29 | public void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 | list = new ArrayList<>();
32 | list.add("http://www.etorrent.co.kr/data/mw.cheditor/140928/7bf135d2ca9a19ab01ff298d5c886fd5_o7PsXq1QY1VQLyd1USNH2vOIQZopFTD7.jpg");
33 | list.add("https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcS4KFknNIK_ZFhVxIn1T_dSA_TSGqvENUBnSh8iDraRiTuBPJSe");
34 | list.add("https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcT_bOzxWcKyLr1GvXB3LQ9dlQ7elnG021d1LlTP8fRf1rKSyBUl2w");
35 | list.add("http://i.ytimg.com/vi/GMN3dwnfoEU/maxresdefault.jpg");
36 | list.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTgsz3F4W6VjFIqj1crEIMgYJYb74zebzKYU8FfRVNopxbI-S2Xog");
37 | list.add("https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRFpu5sUu9H1s82WIemrfVcoXK_3feDRrfvexwHVh9p4kU84Np63g");
38 | list.add("data:image/jpeg;base64,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");
39 | list.add("https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTZUeArk07QTtd4XY8bzzU7Ur0lIQDzfLa0S6XEVrbnWDQVdtmXXA");
40 | list.add("https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcS7pAzk7Zs8KfSamJfgAOOFm0tXDN80LCxODArHtpqXIrGzE5B0Dw");
41 | list.add("https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQugBiCPftPhJ9eOBzjGc26TNkX8it4tmqwM6yZ2oMFpaQCEvqh7A");
42 | list.add("https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTBoLsZH5j9VPefIeZpDU56ESZ-l35AbxRVVfbTCNpbJZuuih2feQ");
43 | list.add("https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQHmAJ0gYNR7DdMRgED6DZ7hC9lBCXAaijbdFMt_Bt3jiNXvINv1A");
44 | list.add("data:image/jpeg;base64,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");
45 | list.add("http://i.ytimg.com/vi/XtX4ztey1sE/hqdefault.jpg");
46 | list.add("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSG_5LOVDkWZtNuiIhj4tYBFtStVTEG1WVIn3cK3WnSi3LBYhY7");
47 | list.add("http://cfile1.uf.tistory.com/image/230D2D4155863F691BBE66");
48 | list.add("data:image/jpeg;base64,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");
49 | list.add("http://mud-kage.kakaocdn.net/dn/g4Ckz/btqb6jOzT9h/7lh5DMYKhPyU67uwvfWMJK/img.jpg?convert=1080x*");
50 | }
51 |
52 | @Nullable
53 | @Override
54 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
55 | return inflater.inflate(R.layout.image, container, false);
56 | }
57 |
58 | @Override
59 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
60 | super.onViewCreated(view, savedInstanceState);
61 |
62 | // layout manager
63 | LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
64 | layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
65 | layoutManager.scrollToPosition(0);
66 |
67 | adapter = new ImageAdapter(list);
68 |
69 | // recyclerview
70 | RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.image_recycler_view);
71 | recyclerView.setLayoutManager(layoutManager);
72 | recyclerView.setAdapter(adapter);
73 |
74 | view.findViewById(R.id.image_btn_shuffle).setOnClickListener(new View.OnClickListener() {
75 | @Override
76 | public void onClick(View v) {
77 | Collections.shuffle(list);
78 | adapter.notifyDataSetChanged();
79 | }
80 | });
81 | }
82 |
83 | public class ImageAdapter extends RecyclerView.Adapter {
84 |
85 | private List imageList;
86 |
87 | public ImageAdapter(List imageList) {
88 | this.imageList = imageList;
89 | }
90 |
91 | @Override
92 | public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
93 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_item, parent, false);
94 | return new BindingHolder(view);
95 | }
96 |
97 | @Override
98 | public void onBindViewHolder(BindingHolder holder, int position) {
99 | String image = list.get(position);
100 | holder.getBinding().setImage(image);
101 | // immediate
102 | holder.getBinding().executePendingBindings();
103 | }
104 |
105 | @Override
106 | public int getItemCount() {
107 | return imageList.size();
108 | }
109 | }
110 |
111 | public class BindingHolder extends RecyclerView.ViewHolder {
112 |
113 | private ImageItemBinding binding;
114 |
115 | public BindingHolder(View itemView) {
116 | super(itemView);
117 | binding = DataBindingUtil.bind(itemView);
118 | }
119 |
120 | public ImageItemBinding getBinding() {
121 | return binding;
122 | }
123 | }
124 | }
125 |
--------------------------------------------------------------------------------