From 4bffaefbb01bb6d804780438874b743e71fef783 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Mon, 28 Dec 2015 12:58:59 +0530 Subject: [PATCH 01/40] Added the Dialog Add class in java and initialized all views from the XML file. Added a listener to close the dialog on pressing the close button --- .idea/misc.xml | 2 +- .../vivz/bucketdrops/ActivityMain.java | 8 ++- .../slidenerd/vivz/bucketdrops/DialogAdd.java | 49 +++++++++++++++++++ app/src/main/res/layout/dialog_add.xml | 1 + 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb6828..5d19981 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java index 8b16200..e836fb2 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java @@ -6,7 +6,6 @@ import android.view.View; import android.widget.Button; import android.widget.ImageView; -import android.widget.Toast; import com.bumptech.glide.Glide; @@ -18,10 +17,15 @@ public class ActivityMain extends AppCompatActivity { @Override public void onClick(View v) { - Toast.makeText(ActivityMain.this, "Button was clicked from anonymous listener pointed to by a variable", Toast.LENGTH_SHORT).show(); + showDialogAdd(); } }; + private void showDialogAdd() { + DialogAdd dialog = new DialogAdd(); + dialog.show(getSupportFragmentManager(),"Add"); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java new file mode 100644 index 0000000..5aa7cb3 --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java @@ -0,0 +1,49 @@ +package slidenerd.vivz.bucketdrops; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.ImageButton; + +/** + * Created by vivz on 28/12/15. + */ +public class DialogAdd extends DialogFragment { + + private ImageButton mBtnClose; + private EditText mInputWhat; + private DatePicker mInputWhen; + private Button mBtnAdd; + + private View.OnClickListener mBtnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + } + }; + public DialogAdd() { + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.dialog_add, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mBtnClose = (ImageButton) view.findViewById(R.id.btn_close); + mInputWhat = (EditText) view.findViewById(R.id.et_drop); + mInputWhen = (DatePicker) view.findViewById(R.id.bpv_date); + mBtnAdd = (Button) view.findViewById(R.id.btn_add); + + mBtnClose.setOnClickListener(mBtnClickListener); + } +} diff --git a/app/src/main/res/layout/dialog_add.xml b/app/src/main/res/layout/dialog_add.xml index 6a1326c..04bd9bc 100644 --- a/app/src/main/res/layout/dialog_add.xml +++ b/app/src/main/res/layout/dialog_add.xml @@ -26,6 +26,7 @@ android:id="@+id/et_drop" android:layout_width="match_parent" android:layout_height="wrap_content" + android:inputType="textVisiblePassword" android:layout_below="@id/tv_title" android:hint="@string/hint_et_drop" android:padding="16dp" /> From ef7e4659c80ca8ef6fd81bc7c431ac4cf19c5d91 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Wed, 30 Dec 2015 09:22:41 +0530 Subject: [PATCH 02/40] Added a drop to realm through DialogAdd and used the RealmBrowser to show the added items --- app/build.gradle | 1 + .../slidenerd/vivz/bucketdrops/DialogAdd.java | 30 +++++++++- .../vivz/bucketdrops/beans/Drop.java | 57 +++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/beans/Drop.java diff --git a/app/build.gradle b/app/build.gradle index 3c6fdb2..4b9e4d5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,4 +24,5 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.github.bumptech.glide:glide:3.6.1' + compile 'io.realm:realm-android:0.87.1' } diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java index 5aa7cb3..f78fb75 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java @@ -11,6 +11,10 @@ import android.widget.EditText; import android.widget.ImageButton; +import io.realm.Realm; +import io.realm.RealmConfiguration; +import slidenerd.vivz.bucketdrops.beans.Drop; + /** * Created by vivz on 28/12/15. */ @@ -24,9 +28,32 @@ public class DialogAdd extends DialogFragment { private View.OnClickListener mBtnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { + int id =v.getId(); + switch (id){ + case R.id.btn_add_it: + addAction(); + break; + } dismiss(); } }; + + private void addAction() { + //get the value of the 'goal' or 'to-do' + //get the time when it was added + String what=mInputWhat.getText().toString(); + long now = System.currentTimeMillis(); + RealmConfiguration configuration=new RealmConfiguration.Builder(getActivity()).build(); + Realm.setDefaultConfiguration(configuration); + Realm realm=Realm.getDefaultInstance(); + Drop drop= new Drop(what, now, 0, false); + realm.beginTransaction(); + realm.copyToRealm(drop); + realm.commitTransaction(); + realm.close(); + + } + public DialogAdd() { } @@ -42,8 +69,9 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { mBtnClose = (ImageButton) view.findViewById(R.id.btn_close); mInputWhat = (EditText) view.findViewById(R.id.et_drop); mInputWhen = (DatePicker) view.findViewById(R.id.bpv_date); - mBtnAdd = (Button) view.findViewById(R.id.btn_add); + mBtnAdd = (Button) view.findViewById(R.id.btn_add_it); mBtnClose.setOnClickListener(mBtnClickListener); + mBtnAdd.setOnClickListener(mBtnClickListener); } } diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/beans/Drop.java b/app/src/main/java/slidenerd/vivz/bucketdrops/beans/Drop.java new file mode 100644 index 0000000..418802b --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/beans/Drop.java @@ -0,0 +1,57 @@ +package slidenerd.vivz.bucketdrops.beans; + +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +/** + * Created by vivz on 30/12/15. + */ +public class Drop extends RealmObject { + public Drop(String what, long added, long when, boolean completed) { + this.what = what; + this.added = added; + this.when = when; + this.completed = completed; + } + + private String what; + @PrimaryKey + private long added; + private long when; + private boolean completed; + + public Drop() { + } + + public String getWhat() { + return what; + } + + public void setWhat(String what) { + this.what = what; + } + + public long getAdded() { + return added; + } + + public void setAdded(long added) { + this.added = added; + } + + public long getWhen() { + return when; + } + + public void setWhen(long when) { + this.when = when; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } +} From f86a37368b6eab1bd6f1ac840071c4965955227a Mon Sep 17 00:00:00 2001 From: slidenerd Date: Wed, 30 Dec 2015 15:02:48 +0530 Subject: [PATCH 03/40] Added the RecyclerView in XML --- app/build.gradle | 1 + .../main/java/slidenerd/vivz/bucketdrops/ActivityMain.java | 7 +++++-- .../main/java/slidenerd/vivz/bucketdrops/DialogAdd.java | 1 + app/src/main/res/layout/activity_main.xml | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b9e4d5..8c271bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,4 +25,5 @@ dependencies { compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.github.bumptech.glide:glide:3.6.1' compile 'io.realm:realm-android:0.87.1' + compile 'com.android.support:recyclerview-v7:23.1.1' } diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java index e836fb2..3e0a961 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; @@ -9,10 +10,12 @@ import com.bumptech.glide.Glide; +//TODO add a layout manager for the RecyclerView public class ActivityMain extends AppCompatActivity { Toolbar mToolbar; Button mBtnAdd; + RecyclerView mRecycler; private View.OnClickListener mBtnAddListener = new View.OnClickListener() { @Override @@ -23,7 +26,7 @@ public void onClick(View v) { private void showDialogAdd() { DialogAdd dialog = new DialogAdd(); - dialog.show(getSupportFragmentManager(),"Add"); + dialog.show(getSupportFragmentManager(), "Add"); } @Override @@ -32,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); mBtnAdd = (Button) findViewById(R.id.btn_add); - + mRecycler = (RecyclerView) findViewById(R.id.rv_drops); mBtnAdd.setOnClickListener(mBtnAddListener); setSupportActionBar(mToolbar); initBackgroundImage(); diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java index f78fb75..a3f0c25 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java @@ -38,6 +38,7 @@ public void onClick(View v) { } }; + //TODO process date private void addAction() { //get the value of the 'goal' or 'to-do' //get the time when it was added diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e582ca3..dd46b08 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,5 +16,10 @@ android:layout_height="match_parent" android:layout_below="@+id/toolbar" /> + From 5e8d0f0fcec1d850b6eed00ea9bfd328b18195be Mon Sep 17 00:00:00 2001 From: slidenerd Date: Wed, 30 Dec 2015 18:03:16 +0530 Subject: [PATCH 04/40] Added the row_drop.xml and the selector bg_row_drop --- app/src/main/res/drawable-hdpi/ic_drop.png | Bin 0 -> 1070 bytes app/src/main/res/drawable-mdpi/ic_drop.png | Bin 0 -> 1012 bytes app/src/main/res/drawable-xhdpi/ic_drop.png | Bin 0 -> 1103 bytes app/src/main/res/drawable-xxhdpi/ic_drop.png | Bin 0 -> 1224 bytes app/src/main/res/drawable-xxxhdpi/ic_drop.png | Bin 0 -> 1327 bytes app/src/main/res/drawable/bg_row_drop.xml | 13 ++++++++ app/src/main/res/layout/row_drop.xml | 28 ++++++++++++++++++ app/src/main/res/values/colors.xml | 2 ++ app/src/main/res/values/dimens.xml | 9 ++++++ 9 files changed, 52 insertions(+) create mode 100755 app/src/main/res/drawable-hdpi/ic_drop.png create mode 100755 app/src/main/res/drawable-mdpi/ic_drop.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_drop.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_drop.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_drop.png create mode 100644 app/src/main/res/drawable/bg_row_drop.xml create mode 100644 app/src/main/res/layout/row_drop.xml diff --git a/app/src/main/res/drawable-hdpi/ic_drop.png b/app/src/main/res/drawable-hdpi/ic_drop.png new file mode 100755 index 0000000000000000000000000000000000000000..368228b9ccbad87787ad007ef1433e4f494f4417 GIT binary patch literal 1070 zcmaJ=OK8+U7*2PwK2WK{#_dFG&8QgiiKl*$WfE!3|l5|>LI=+Y7@uS!yau5-;*a<6l>e{xwOh7FthSF;-?GC|>S zWpv49W%!{(Cf*~X9clS=lst>O1yv~rZ!52Zx!X}=8o#8Y7ABb`6i68rh=-g_}tooroRQyBrL qqx03tuWhk+(WS?oqtW?qRAeL7^L*>ng$d?d_<{>sk2>2maOoG%gHz%F literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_drop.png b/app/src/main/res/drawable-mdpi/ic_drop.png new file mode 100755 index 0000000000000000000000000000000000000000..2360b9aafd31e6d431171ed1788ef593b8696a79 GIT binary patch literal 1012 zcmaJ=J8aWH7DDg zF0?$PmZ=>O2#JLW79?f{7+8RX0U=a2CMqGp$jCWOT82_f=ezs$egFUckJ~O4ul4m_ z=%pyCPoGiCWbY>HY)|y>e{%CF*#@yz#dBy8Hw_f==%h0gaR^G!&ii(Ze zl`5_lW@QsOj1gg&(D4YHq9&(8&oGxD1~pi>U4{Pj`V9?iOQGk*0$1>Iuwl=v`*3c( zSTWa^Ov$3Bu7b%>CJr2k4G=oZZXkyW-SR7wb7W>|(1PG4g+35fEtEhG`4EUqDsFPA zG)PMfFQ(JU^f(YWUSzoho8aO?LQZmWQUL9bCeeIrQ7)_bb}VvJ=my4~%(Bg9lW8Ux zBr(whfHdBa-axE)W|9_R~_hL zT~%meVJzE{Gip{;vw|q3QUcFwVrC+p%;fp3luD}_uW22w?grR!P1xbuN8IFzTsh}M z10%nJ&~m4Hr3S(%Xdn;da;1Q4_z|x zJ{j%$?~zmFSy;N7sf2sA&*7_wUA@mXANOxP+L#zGWkvyW|N40B`|a7%b_l+lsVSg% z@5Sl;59aj7rJeIL^x#(C&hYflfgN=$Hrf-@e=O{N>eg?(rB^Nw?{>ZWw)tmd;O^Ib as;irtesJ#N#eVB~^bU2csJ_fD-1!Te$~eUU literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_drop.png b/app/src/main/res/drawable-xhdpi/ic_drop.png new file mode 100755 index 0000000000000000000000000000000000000000..6a82189a8ba3f39bd77502dc78e5c7881d82924a GIT binary patch literal 1103 zcmaJ=PiPcZ7$3V~8`EToSV$u&JSJi*cIWTTtTSY*vpc(WA)7Aif_rIkcIG8JCNpoG zd2uHxElC=RQV&unBE3}YrBH;u*j5iQbq{*diYF;O#DgG$hzR0A`exmY9#RM1y!SqS zzwi5ff8MF`)MrBjy9OwV8Y&*rD`X!eYiEC){C|1&=vT6h;(QGsM$@=y_>j^pREMDG z7&EW}4Qt`}O*lbOu|0ORhHIrs)kF?sL>MM?Ji?}^i36c$n6nUrI-IfH4E^}(8VzhK zLm!b!T*=G9hJ9$!hldxZs^;RXsaW)ZPr*c}5(f^%1_+%wH&DY2-SMlEb7W>|(1GCD z4E;(}tyBg%{btR(ih zMK{2PYr-Dae$7?h%2jhdG%)h32+j4nS8gDTf(G(HF4yT6`1pwJTBsT9jmq0q3w`?p zv+}@73>ytsl3&*B`6z0bedN>whhM zh&S$BTg|t`;eAwVZ20Pqi{}SVeUWINexB;PcRT5<@Sa3v6El_ zEpZoqT8$4F-z?iFm#&PAczqiUYv|9xRV^|3?YoKJ&8Odw?7VzqJ@(JRUB4A?AC27s zpRdICp80NVcZ2%s#XH*{vMZ^{aqW8bOuU>pMrV)5hS4(oc@g}ZXpbJ8>u>*1e)6FF h(JgA@KG?QI#i+{MXl?eyjj`y77xPp4rR>p_{{XTWVsiih literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_drop.png b/app/src/main/res/drawable-xxhdpi/ic_drop.png new file mode 100755 index 0000000000000000000000000000000000000000..407e8367ec438d060f131708e0c7855dc7c78855 GIT binary patch literal 1224 zcmaJ>TWs4@7B!ZpY%FnX=Vq(v;>O7uXiAg@8VP~w#HWo(eTnT7 zx7tIS(zO#(HMGHsM8_s>Pu;Xhpdk=+QY&rnQb5`e($Lrgyf95eJdBHg<1FcTD6?e$ z=luG<|Ns7rd@Mb9czf&KRt&?oC;RyfvOCfHJS9HK~KRK41o~iB?F<5KXedKJ~BY~XoB{6D4O;ASU&~o500|w z;wYQp6ZKr^7Qu_Asj&o6sZ_ib+NUjT1HrcMvz_~AuRAcy#mFAuF9a+A6D8zLtijK)3l$bf`PcLpW_%`!XNI7lRU*U42jpd;uf{n zx$*zy5=abT5BERAZn)3}*~iV*MVHOxhYH$w9j*4u%h)uAHHDKrm$kmne{EfOV+PZj z^3Q`G7N6~Ca|j!b=jN}2?&hQSunWDelA{dvIp4oIazb>u$Nzf$-b>M6l8fA2cx_LT zys~@#_NBG*-fZ=&QQ+>r2GY4pKi<8#%k^hRA-%Ihdg|D5ZZZ1Az^mNf8@Y8U-Rrn} z20O()wsCUcAhv#*4$gi#z4TVg?9!R3bbIsf*OzC^o6c{y(eCQPk@+@$wf&oxTW;sC zP5tMCSHLdt(|fBRc)W99z%~47S{-N`jZ1UK01G3)&936v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gt*5rFf&&$x70H< zH8(dg*HJJsFf`RSFxEFV&^0o)GBL0+F;aj6C7^9ZDQQ+gE^bh}fIM5JjFOT9D}DX) z@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal z@=Hr>m4GgVcpG8yO|TwcUn|eN;*!L?U1bE=Fdiu7-xLrjCx525u%6 zPOgS7MlP0?hA_P@`N^fZsd*(Zy(tL2t~m9Al0$9*&}Ns^qRg_?6t|-MTm`VVtuk@D z#R;c*P`xR*-QtW>uRhQ*`k=@~ifot=Fa?2_@T3dmz!QIJ9x%lh0h9LI{6AkA7#Qb! zx;TbZ+)BDqv2ki6O9JZ=8HYXn5xhD)OB$=e$8{pVL#%xWy1nF_Ssru2V(e{ zU4A!p@?4+%ggZ&cz`fXZlm45PiH@>zJEOdG4H%R3Z9biI$nouDEfx7Cu%5Ne;f-?( zYu<$lrJGGs3TY}vQ?E|SYLpXTpEQBf@necl7weK8^B7lcn-;;nrNLrGW61;dBfpMB z1UM&2wq6&1!M2jQ(1Q6VgGj#B51kcim%pBP7W#0LgJ_4cqz3!L3lk1(SkTlX)we)D zL98R-IV9Jz=QefKD(B3A-(V+9g!RtS^Bdiru36f#>I_7uY7}=Qg}n&mpIKmaQlLkC)cfO8=J*mE|Bt)SoKU+z@Gil lYKIzuSwiy@H%lrUVBl4;UUZ;!OC_iX^K|udS?83{1OU7!z;XZp literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_row_drop.xml b/app/src/main/res/drawable/bg_row_drop.xml new file mode 100644 index 0000000..bdc641e --- /dev/null +++ b/app/src/main/res/drawable/bg_row_drop.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_drop.xml b/app/src/main/res/layout/row_drop.xml new file mode 100644 index 0000000..9f50ec7 --- /dev/null +++ b/app/src/main/res/layout/row_drop.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 07eedc0..4fb4b70 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,4 +6,6 @@ #B691FF #05FFCA #241543 + #BD8E79BB + #4A8E79BB diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e3c850b..7dda3b9 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -19,4 +19,13 @@ 28sp 36dp 18sp + + + 12dp + + + 22dp + + + 22dp From 4415824f130e3536e6b13b4209fc66a8f999ca04 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Wed, 30 Dec 2015 19:49:05 +0530 Subject: [PATCH 05/40] Added the implementation of RecyclerView.Adapter with dummy items inside and defined the layoutManager for the RecyclerView in XML --- .../vivz/bucketdrops/ActivityMain.java | 3 + .../bucketdrops/adapters/AdapterDrops.java | 60 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 5 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java index 3e0a961..97aa110 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java @@ -10,6 +10,8 @@ import com.bumptech.glide.Glide; +import slidenerd.vivz.bucketdrops.adapters.AdapterDrops; + //TODO add a layout manager for the RecyclerView public class ActivityMain extends AppCompatActivity { @@ -36,6 +38,7 @@ protected void onCreate(Bundle savedInstanceState) { mToolbar = (Toolbar) findViewById(R.id.toolbar); mBtnAdd = (Button) findViewById(R.id.btn_add); mRecycler = (RecyclerView) findViewById(R.id.rv_drops); + mRecycler.setAdapter(new AdapterDrops(this)); mBtnAdd.setOnClickListener(mBtnAddListener); setSupportActionBar(mToolbar); initBackgroundImage(); diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java new file mode 100644 index 0000000..e598da3 --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java @@ -0,0 +1,60 @@ +package slidenerd.vivz.bucketdrops.adapters; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.ArrayList; + +import slidenerd.vivz.bucketdrops.R; + +/** + * Created by vivz on 30/12/15. + */ +public class AdapterDrops extends RecyclerView.Adapter { + private LayoutInflater mInflater; + private ArrayList mItems = new ArrayList<>(); + + public AdapterDrops(Context context) { + mInflater = LayoutInflater.from(context); + mItems = generateValues(); + } + + public static ArrayList generateValues() { + ArrayList dummyValues = new ArrayList<>(); + for (int i = 1; i < 101; i++) { + dummyValues.add("Item " + i); + } + return dummyValues; + } + + + @Override + public DropHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.row_drop, parent, false); + DropHolder holder = new DropHolder(view); + return holder; + } + + @Override + public void onBindViewHolder(DropHolder holder, int position) { + holder.mTextWhat.setText(mItems.get(position)); + } + + @Override + public int getItemCount() { + return 100; + } + + public static class DropHolder extends RecyclerView.ViewHolder { + + TextView mTextWhat; + public DropHolder(View itemView) { + super(itemView); + mTextWhat = (TextView) itemView.findViewById(R.id.tv_what); + } + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index dd46b08..a599430 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" tools:context="slidenerd.vivz.bucketdrops.ActivityMain"> + android:layout_height="match_parent" + app:layoutManager="android.support.v7.widget.LinearLayoutManager" + /> From fdb8347c1caa81c15e187e9ff4a3ddf7baa3e354 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Wed, 30 Dec 2015 21:32:02 +0530 Subject: [PATCH 06/40] Displayed the data from the Realm Database inside the RecyclerView and called notifyDataSetChanged to asynchronously load data --- app/src/main/AndroidManifest.xml | 1 + .../vivz/bucketdrops/ActivityMain.java | 34 ++++++++++++++++++- .../vivz/bucketdrops/AppBucketDrops.java | 18 ++++++++++ .../slidenerd/vivz/bucketdrops/DialogAdd.java | 3 -- .../bucketdrops/adapters/AdapterDrops.java | 30 ++++++++-------- 5 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/AppBucketDrops.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b2fdab1..2babb4a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="slidenerd.vivz.bucketdrops"> mResults; + AdapterDrops mAdapter; private View.OnClickListener mBtnAddListener = new View.OnClickListener() { @Override @@ -26,6 +35,14 @@ public void onClick(View v) { } }; + private RealmChangeListener mChangeListener = new RealmChangeListener() { + @Override + public void onChange() { + Log.d(TAG, "onChange: was called"); + mAdapter.update(mResults); + } + }; + private void showDialogAdd() { DialogAdd dialog = new DialogAdd(); dialog.show(getSupportFragmentManager(), "Add"); @@ -35,15 +52,30 @@ private void showDialogAdd() { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + mRealm = Realm.getDefaultInstance(); + mResults = mRealm.where(Drop.class).findAllAsync(); mToolbar = (Toolbar) findViewById(R.id.toolbar); mBtnAdd = (Button) findViewById(R.id.btn_add); mRecycler = (RecyclerView) findViewById(R.id.rv_drops); - mRecycler.setAdapter(new AdapterDrops(this)); + mAdapter = new AdapterDrops(this, mResults); + mRecycler.setAdapter(mAdapter); mBtnAdd.setOnClickListener(mBtnAddListener); setSupportActionBar(mToolbar); initBackgroundImage(); } + @Override + protected void onStart() { + super.onStart(); + mResults.addChangeListener(mChangeListener); + } + + @Override + protected void onStop() { + super.onStop(); + mResults.removeChangeListener(mChangeListener); + } + private void initBackgroundImage() { ImageView background = (ImageView) findViewById(R.id.iv_background); Glide.with(this) diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/AppBucketDrops.java b/app/src/main/java/slidenerd/vivz/bucketdrops/AppBucketDrops.java new file mode 100644 index 0000000..007bc1f --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/AppBucketDrops.java @@ -0,0 +1,18 @@ +package slidenerd.vivz.bucketdrops; + +import android.app.Application; + +import io.realm.Realm; +import io.realm.RealmConfiguration; + +/** + * Created by vivz on 30/12/15. + */ +public class AppBucketDrops extends Application{ + @Override + public void onCreate() { + super.onCreate(); + RealmConfiguration configuration=new RealmConfiguration.Builder(this).build(); + Realm.setDefaultConfiguration(configuration); + } +} diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java index a3f0c25..7635e45 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/DialogAdd.java @@ -12,7 +12,6 @@ import android.widget.ImageButton; import io.realm.Realm; -import io.realm.RealmConfiguration; import slidenerd.vivz.bucketdrops.beans.Drop; /** @@ -44,8 +43,6 @@ private void addAction() { //get the time when it was added String what=mInputWhat.getText().toString(); long now = System.currentTimeMillis(); - RealmConfiguration configuration=new RealmConfiguration.Builder(getActivity()).build(); - Realm.setDefaultConfiguration(configuration); Realm realm=Realm.getDefaultInstance(); Drop drop= new Drop(what, now, 0, false); realm.beginTransaction(); diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java index e598da3..ab7f66b 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java @@ -2,51 +2,51 @@ import android.content.Context; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import java.util.ArrayList; - +import io.realm.RealmResults; import slidenerd.vivz.bucketdrops.R; +import slidenerd.vivz.bucketdrops.beans.Drop; /** * Created by vivz on 30/12/15. */ public class AdapterDrops extends RecyclerView.Adapter { private LayoutInflater mInflater; - private ArrayList mItems = new ArrayList<>(); - - public AdapterDrops(Context context) { + private RealmResults mResults; + public static final String TAG="VIVZ"; + public AdapterDrops(Context context, RealmResults results) { mInflater = LayoutInflater.from(context); - mItems = generateValues(); + update(results); } - public static ArrayList generateValues() { - ArrayList dummyValues = new ArrayList<>(); - for (int i = 1; i < 101; i++) { - dummyValues.add("Item " + i); - } - return dummyValues; + public void update(RealmResults results){ + mResults = results; + notifyDataSetChanged(); } - @Override public DropHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.row_drop, parent, false); DropHolder holder = new DropHolder(view); + Log.d(TAG, "onCreateViewHolder: "); return holder; } @Override public void onBindViewHolder(DropHolder holder, int position) { - holder.mTextWhat.setText(mItems.get(position)); + Drop drop=mResults.get(position); + holder.mTextWhat.setText(drop.getWhat()); + Log.d(TAG, "onBindViewHolder: "+position); } @Override public int getItemCount() { - return 100; + return mResults.size(); } public static class DropHolder extends RecyclerView.ViewHolder { From e90c2013d4bdff50b0100de4f0d241dbee8d8d0d Mon Sep 17 00:00:00 2001 From: slidenerd Date: Thu, 31 Dec 2015 10:53:49 +0530 Subject: [PATCH 07/40] Fixed the error 'plugin is too old' by updating gradle version from alpha1 to alpha3 and rebuilding the project after cleaning it --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b169365..c57c2c6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0-alpha1' + classpath 'com.android.tools.build:gradle:2.0.0-alpha3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 5fb65fbc392a51ab2f72e43a1240b455b02f6d5b Mon Sep 17 00:00:00 2001 From: slidenerd Date: Thu, 31 Dec 2015 18:02:34 +0530 Subject: [PATCH 08/40] Added an Adapter Data Observer to display an empty view when the Recycler View has nothing inside to display and a Util class with a bunch of methods to show or hide a group of Views --- .../vivz/bucketdrops/ActivityMain.java | 10 +- .../vivz/bucketdrops/extras/Util.java | 22 ++++ .../widgets/BucketRecyclerView.java | 106 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 14 ++- 4 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/extras/Util.java create mode 100644 app/src/main/java/slidenerd/vivz/bucketdrops/widgets/BucketRecyclerView.java diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java index 7713ade..6f60eb1 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/ActivityMain.java @@ -2,7 +2,6 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; @@ -16,6 +15,7 @@ import io.realm.RealmResults; import slidenerd.vivz.bucketdrops.adapters.AdapterDrops; import slidenerd.vivz.bucketdrops.beans.Drop; +import slidenerd.vivz.bucketdrops.widgets.BucketRecyclerView; //TODO add a layout manager for the RecyclerView public class ActivityMain extends AppCompatActivity { @@ -23,9 +23,10 @@ public class ActivityMain extends AppCompatActivity { public static final String TAG = "VIVZ"; Toolbar mToolbar; Button mBtnAdd; - RecyclerView mRecycler; + BucketRecyclerView mRecycler; Realm mRealm; RealmResults mResults; + View mEmptyView; AdapterDrops mAdapter; private View.OnClickListener mBtnAddListener = new View.OnClickListener() { @@ -55,8 +56,11 @@ protected void onCreate(Bundle savedInstanceState) { mRealm = Realm.getDefaultInstance(); mResults = mRealm.where(Drop.class).findAllAsync(); mToolbar = (Toolbar) findViewById(R.id.toolbar); + mEmptyView = findViewById(R.id.empty_drops); mBtnAdd = (Button) findViewById(R.id.btn_add); - mRecycler = (RecyclerView) findViewById(R.id.rv_drops); + mRecycler = (BucketRecyclerView) findViewById(R.id.rv_drops); + mRecycler.hideIfEmpty(mToolbar); + mRecycler.showIfEmpty(mEmptyView); mAdapter = new AdapterDrops(this, mResults); mRecycler.setAdapter(mAdapter); mBtnAdd.setOnClickListener(mBtnAddListener); diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/extras/Util.java b/app/src/main/java/slidenerd/vivz/bucketdrops/extras/Util.java new file mode 100644 index 0000000..e25e9d3 --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/extras/Util.java @@ -0,0 +1,22 @@ +package slidenerd.vivz.bucketdrops.extras; + +import android.view.View; + +import java.util.List; + +/** + * Created by vivz on 31/12/15. + */ +public class Util { + public static void showViews(List views) { + for (View view : views) { + view.setVisibility(View.VISIBLE); + } + } + + public static void hideViews(List views) { + for (View view : views) { + view.setVisibility(View.GONE); + } + } +} diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/widgets/BucketRecyclerView.java b/app/src/main/java/slidenerd/vivz/bucketdrops/widgets/BucketRecyclerView.java new file mode 100644 index 0000000..1c4e07a --- /dev/null +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/widgets/BucketRecyclerView.java @@ -0,0 +1,106 @@ +package slidenerd.vivz.bucketdrops.widgets; + +import android.content.Context; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.View; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import slidenerd.vivz.bucketdrops.extras.Util; + +/** + * Created by vivz on 31/12/15. + */ +public class BucketRecyclerView extends RecyclerView { + + private List mNonEmptyViews = Collections.emptyList(); + private List mEmptyViews = Collections.emptyList(); + private AdapterDataObserver mObserver = new AdapterDataObserver() { + @Override + public void onChanged() { + toggleViews(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount) { + toggleViews(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { + toggleViews(); + } + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + toggleViews(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + toggleViews(); + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + toggleViews(); + } + }; + + private void toggleViews() { + if (getAdapter() != null && !mEmptyViews.isEmpty() && !mNonEmptyViews.isEmpty()) { + if (getAdapter().getItemCount() == 0) { + + //show all the empty views + Util.showViews(mEmptyViews); + //hide the RecyclerView + setVisibility(View.GONE); + + //hide all the views which are meant to be hidden + Util.hideViews(mNonEmptyViews); + } else { + //hide all the empty views + Util.showViews(mNonEmptyViews); + + //show the RecyclerView + setVisibility(View.VISIBLE); + + //hide all the views which are meant to be hidden + Util.hideViews(mEmptyViews); + } + } + } + + public BucketRecyclerView(Context context) { + super(context); + } + + public BucketRecyclerView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public BucketRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void setAdapter(Adapter adapter) { + super.setAdapter(adapter); + if (adapter != null) { + adapter.registerAdapterDataObserver(mObserver); + } + mObserver.onChanged(); + } + + public void hideIfEmpty(View... views) { + mNonEmptyViews = Arrays.asList(views); + } + + public void showIfEmpty(View... emptyViews) { + mEmptyViews = Arrays.asList(emptyViews); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a599430..65f3781 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,9 +1,9 @@ - - + android:layout_below="@id/toolbar" + app:layoutManager="android.support.v7.widget.LinearLayoutManager" /> + + From 787aede483b2978282892d96fbfcf68122b9da16 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Sat, 2 Jan 2016 10:07:37 +0530 Subject: [PATCH 09/40] Fixed a bug where an Image was not taking full screen width and height while adding items for the first time because the ImageView was placed below the toolbar. When there were no items to display, the RecyclerView would hide itself and the toolbar and the ImageView would take all the available screen width and height causing Glide to load a particular image size but when the RecyclerView had atleast one item to display, the first time it would show the Toolbar and place the ImageView below the toolbar thereby changing its size and loading a different sized image for showing inside this ImageView --- app/src/main/res/layout/activity_main.xml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 65f3781..6845c9c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,16 +6,14 @@ android:layout_height="match_parent" tools:context="slidenerd.vivz.bucketdrops.ActivityMain"> - - - + android:layout_height="match_parent" /> + + - + + From 51ec48f85b10c7166a50dcb79697949b9e7c28d8 Mon Sep 17 00:00:00 2001 From: slidenerd Date: Sat, 2 Jan 2016 13:27:28 +0530 Subject: [PATCH 10/40] Override the getItemViewType method and change the code inside onCreateViewHolder and onBindViewHolder to implement sections inside the RecyclerView --- .../bucketdrops/adapters/AdapterDrops.java | 58 ++++++++++++++----- app/src/main/res/layout/footer.xml | 13 +++++ 2 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/layout/footer.xml diff --git a/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java index ab7f66b..b412cbd 100644 --- a/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java +++ b/app/src/main/java/slidenerd/vivz/bucketdrops/adapters/AdapterDrops.java @@ -2,10 +2,10 @@ import android.content.Context; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import io.realm.RealmResults; @@ -15,46 +15,76 @@ /** * Created by vivz on 30/12/15. */ -public class AdapterDrops extends RecyclerView.Adapter { +public class AdapterDrops extends RecyclerView.Adapter { + public static final int ITEM = 0; + public static final int FOOTER = 1; + private LayoutInflater mInflater; private RealmResults mResults; - public static final String TAG="VIVZ"; + public static final String TAG = "VIVZ"; + public AdapterDrops(Context context, RealmResults results) { mInflater = LayoutInflater.from(context); update(results); } - public void update(RealmResults results){ + public void update(RealmResults results) { mResults = results; notifyDataSetChanged(); } @Override - public DropHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.row_drop, parent, false); - DropHolder holder = new DropHolder(view); - Log.d(TAG, "onCreateViewHolder: "); - return holder; + public int getItemViewType(int position) { + //We return an item if results are null or if the position is within the bounds of the results + if (mResults == null || position < mResults.size()) { + return ITEM; + } else { + return FOOTER; + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == FOOTER) { + View view = mInflater.inflate(R.layout.footer, parent, false); + return new FooterHolder(view); + } else { + View view = mInflater.inflate(R.layout.row_drop, parent, false); + return new DropHolder(view); + } } @Override - public void onBindViewHolder(DropHolder holder, int position) { - Drop drop=mResults.get(position); - holder.mTextWhat.setText(drop.getWhat()); - Log.d(TAG, "onBindViewHolder: "+position); + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (holder instanceof DropHolder) { + DropHolder dropHolder = (DropHolder) holder; + Drop drop = mResults.get(position); + dropHolder.mTextWhat.setText(drop.getWhat()); + } } @Override public int getItemCount() { - return mResults.size(); + return mResults.size() + 1; } public static class DropHolder extends RecyclerView.ViewHolder { TextView mTextWhat; + public DropHolder(View itemView) { super(itemView); mTextWhat = (TextView) itemView.findViewById(R.id.tv_what); } } + + public static class FooterHolder extends RecyclerView.ViewHolder { + + Button mBtnAdd; + + public FooterHolder(View itemView) { + super(itemView); + mBtnAdd = (Button) itemView.findViewById(R.id.btn_footer); + } + } } diff --git a/app/src/main/res/layout/footer.xml b/app/src/main/res/layout/footer.xml new file mode 100644 index 0000000..8a593fe --- /dev/null +++ b/app/src/main/res/layout/footer.xml @@ -0,0 +1,13 @@ + +