From c025df7f7a5e928c9a3277e35ee55bf3eb1dafe3 Mon Sep 17 00:00:00 2001 From: anfangshuo Date: Tue, 13 Dec 2016 08:40:12 +0800 Subject: [PATCH 01/56] update --- .../main/res/drawable-xhdpi/ic_search_grey.png | Bin 0 -> 659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/res/drawable-xhdpi/ic_search_grey.png diff --git a/app/src/main/res/drawable-xhdpi/ic_search_grey.png b/app/src/main/res/drawable-xhdpi/ic_search_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf8db359d3d6e1a9e3a02023a45e6b66cc7efb2 GIT binary patch literal 659 zcmV;E0&M+>P)09noTE|a}_@EjzEP+(O9TV?7!0~pHGN_Jso53hqxmCRq- z4o1^xQ;y|Wg1v`$3t+QPp}(vn1AcPV+y&?BZwpYUT`93EaPj?<3j52s1;~wkPp=P1 zew)flT2vqb*if*Q-*cZJWj3}?5PD}jW+*{xmu&%Hs@7mEfmeI>g&Rt_-}eMCdBYOu zLn!@vX$juLAWE59LGLg)wz(^au}GNYdCGxn*rQTQQHB3gQs)pt@b5Rx{?80 zWaU^dClSaiZjcJF0AxTDMNunm`|*Oh}ClO!Tr$J`i329+~eoaY4K}fF&z~I0(QFh&Yts)IL8L tKoLU0RVab|Gjmvg(sBHngZ7$l{{jjId@!J`&$<8r002ovPDHLkV1gQfDl-58 literal 0 HcmV?d00001 From 3833c3a6a303ba25356ddd1c36a31ff6f9dbc16b Mon Sep 17 00:00:00 2001 From: anfangshuo Date: Tue, 13 Dec 2016 08:44:12 +0800 Subject: [PATCH 02/56] =?UTF-8?q?=E7=AD=9B=E9=80=89UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/program/common/FilterDialog.java | 101 ++++++++++++++ .../net/coding/program/task/TaskFragment.java | 12 ++ .../res/drawable-xxhdpi/ic_menu_filter.png | Bin 0 -> 1974 bytes .../ic_menu_filter_selected.png | Bin 0 -> 3717 bytes .../main/res/layout/dialog_task_filter.xml | 130 ++++++++++++++++++ .../res/layout/dialog_task_status_filter.xml | 85 ++++++++++++ app/src/main/res/menu/fragment_task.xml | 14 +- app/src/main/res/values/colors.xml | 5 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/styles.xml | 13 ++ 10 files changed, 361 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/net/coding/program/common/FilterDialog.java create mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_filter.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_filter_selected.png create mode 100644 app/src/main/res/layout/dialog_task_filter.xml create mode 100644 app/src/main/res/layout/dialog_task_status_filter.xml diff --git a/app/src/main/java/net/coding/program/common/FilterDialog.java b/app/src/main/java/net/coding/program/common/FilterDialog.java new file mode 100644 index 000000000..8f2de0023 --- /dev/null +++ b/app/src/main/java/net/coding/program/common/FilterDialog.java @@ -0,0 +1,101 @@ +package net.coding.program.common; + +import android.app.Dialog; +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import net.coding.program.R; + +/** + * Created by afs on 2016/12/12. + */ + +public class FilterDialog { + + private Dialog mDialog; + private Context mContext; + + public FilterDialog() { + + } + + public static FilterDialog getInstance() { + return new FilterDialog(); + } + + public void show(Context context, FilterModel filterModel, SearchListener searchListener) { + mDialog = new Dialog(context, R.style.notitleDialog); + this.mContext = context; + mDialog.setContentView(R.layout.dialog_task_filter); + mDialog.setCanceledOnTouchOutside(true); + //赋值的位置是有影响的 + mDialog.getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT; + mDialog.show(); + + View reset = mDialog.findViewById(R.id.tv_reset); + + EditText etSearch = (EditText) mDialog.findViewById(R.id.et_search); + + TextView taskDoing = (TextView) mDialog.findViewById(R.id.tv_task_doing); + TextView taskDone = (TextView) mDialog.findViewById(R.id.tv_task_done); + + TextView bug = (TextView) mDialog.findViewById(R.id.tv_bug); + TextView function = (TextView) mDialog.findViewById(R.id.tv_function); + TextView survey = (TextView) mDialog.findViewById(R.id.tv_survey); + + setLeftDrawable(bug, false); + setLeftDrawable(function, false); + setLeftDrawable(survey, false); + + } + + /** + * 非左即右 + * + * @param textView + * @param resId + */ + public void setRightDrawable(TextView textView, int resId) { + textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, resId, 0); + } + + public void setLeftDrawable(TextView textView, boolean checked) { + + if (mContext == null) { + return; + } + + final Drawable originalBitmapDrawable = mContext.getResources().getDrawable(R.drawable.ic_project_topic_label).mutate(); + Drawable right = checked ? mContext.getResources().getDrawable(R.drawable.ic_task_status_list_check) : null; + + ColorStateList color = ColorStateList.valueOf(Color.parseColor(textView.getTag().toString())); + + textView.setCompoundDrawablesWithIntrinsicBounds(tintDrawable(originalBitmapDrawable, color), null, right, null); + } + + public Drawable tintDrawable(Drawable drawable, ColorStateList colors) { + final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); + DrawableCompat.setTintList(wrappedDrawable, colors); + return wrappedDrawable; + } + + public interface SearchListener { + void callback(FilterModel filterModel); + } + + public static class FilterModel { + public int status;//任务状态,进行中的为1,已完成的为2 + public String label;//任务标签 + public String keyword;//根据关键字筛选任务 + + public int statusTaskDoing; + public int statusTaskDone; + } +} diff --git a/app/src/main/java/net/coding/program/task/TaskFragment.java b/app/src/main/java/net/coding/program/task/TaskFragment.java index 9cabc529d..e91117df7 100755 --- a/app/src/main/java/net/coding/program/task/TaskFragment.java +++ b/app/src/main/java/net/coding/program/task/TaskFragment.java @@ -13,6 +13,7 @@ import net.coding.program.MainActivity; import net.coding.program.MyApp; import net.coding.program.R; +import net.coding.program.common.FilterDialog; import net.coding.program.common.Global; import net.coding.program.common.ListModify; import net.coding.program.common.SaveFragmentPagerAdapter; @@ -183,6 +184,17 @@ protected final void action_add() { .startForResult(ListModify.RESULT_EDIT_LIST); } + @OptionsItem + protected final void action_filter() { +// ProjectObject projectObject = mData.get(pager.getCurrentItem()); +// TaskAddActivity_.intent(this) +// .mUserOwner(MyApp.sUserObject) +// .mProjectObject(projectObject) +// .startForResult(ListModify.RESULT_EDIT_LIST); + + FilterDialog.getInstance().show(getContext(),null,null); + } + public static class TaskCount { public int project; public int processing; diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_filter.png b/app/src/main/res/drawable-xxhdpi/ic_menu_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..6f20ff47dce7d28c276a93cb6ad3003bfcc8b7cb GIT binary patch literal 1974 zcmV;n2TAyeP)Px+a7jc#RCodHTWf4oMHHTMw}ssn2sBE7f)Ino0JhLYi?-0NugD)XMvNwgL@{be zG)AD?M<81jXiI#=C}>1YP%!v_glIG-vTZ4?JPK_SB|;!#3aEjCmUdfu_m1CeyWP9@ zu@Aa!uj#$Xa_5{mGjq^9Y#Fm38vz>u8vz>u8vz>u8vz>u8vz>u8vz@Ekw$>T zg1LTgAzoV;<8IEGYowJJ?e&OQfH7*8Bvx^vsJdRQ4+(GpN*%zF)E#59O^U<8JZg|6 z&iG~%#?fe|ma)#j(OSelr6g9zW(H@dl4n|DyV` zn}c$22i9AW?3$tT9cSBT%*tN>{cSJzCOtmc0V6G+S6`kJl;!=LvDrge8#jhVXNKdk z!%H^*mCQVr_8t%s`0BMP?m*|?y<(QjDJPLWx%3plrPXFDriZjKH{hq0t z@J1O#-EisV>Dk#klgS`54@On>!pmc>U9Fz#r^9rt_fe1UPxmq3{eAy-AB0?9lq}~H z0)b!|c&|k94G0o0+1=Y+2iIF*(4P_(V#TlHGo@vT1jpRQifrD~*KV-znJmg!5YKb8 z;}-f$=ioqj5}xE#_aXgXY$>kF#v5VI{E@nQ12w}5j#wH8yLr7`%2snVB0ba-d?Z3e zT9Sh{CJT-j-QubGofv;VGE;vGfqZ(dzx-}3UrS3scDa^0EHtr)6PZ_GN}*N`fwF6| z;@Yd_CrUdUX*-Q%;XJyvv~m)Ik7=2sN{hRd=0O>>=|;RKJk9ZCo7>Rt2-Aaa&a(&G zCJlHH`@y6ywd@4f!MCLY2zM%R&KcT626GUb9&b_!!E?O`qVWWW)K7FWja(&(%z?vR zP%DQR;?VMvr4fn^=HPL6PnyUq%TK?Xck%rBRS4Ed^E@Nj#ZBc0()?uZ`Yh2c0z)n! zt=yrW6G48KnohQjfK13{GqvLYPuwd<=o~a~M)?R6h|j1#_)6P#d6%;#1r5~`Z?vfH zuJz_)&PiIsBu=NaJS{E$XVqE{k>5a}@ttxceH#XI&PXX8Z;8T+ymZEkiGO<1B(j-;Q?D6NpE@01mKo-ySGWMwmN+uwFyjp3C>J(p-(7NDHgt(kQB(jkBp^>Y-h0Wje# zBT+D;bQm*R+_CgBdJakSR%>zfT76G6$FcwkH5VPKn5|rwn-VoT+O+r-Jn_v|PtCem zl9r4?VTDf=Y&z#;T->;ihk2=dV+*cb==a8~GFTcQ0mflZO?&#JjHN`Upe-GPj1(5UV!zLMh4nswOjUqG;0y&N5*Q+GD3|f?Nfh)O=T3Fj ze>LBCJv_%s{-xuTzj-%;{u5!I_Km<@gTU=o^9KRKq7$x4fgGGzQ&*E#uas`*g#*qC;O2X-X`QV5{j+L8@GenX6NgV~zH$`>&QZm|j9>TB_8$B8Nu0*M87 zBQvfv8-sPLk=;r~KYmDF`XcAbb~9m1@FiN)R$QGj9R)}oEbs+(%j2f@5qqx9Q}eO- zA^93pA&YbnPpyvFwsID8J%uCr*XAZt=n#o4#^;y|S)_;4EveQd3=+2PH%4n+a07*qo IM6N<$f+vKN_W%F@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_filter_selected.png b/app/src/main/res/drawable-xxhdpi/ic_menu_filter_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecda84aeee340dd36e3c2e0decb4d83de9a96d7 GIT binary patch literal 3717 zcmcha)^2`xlV>*-&5|5sELf2R@>H2fE& zZclYJNJ{&;)=5a{)F4{w&%8;u;WX~dW9$Sk&!nFs4f&r68H&zyaTBQT)(YrXuv^C_7p!K3~f_5&j&-$CsG~5}5^l z?X9h4&NpJ!NS=<&r0P+^yuUs++*=K?`(1K5Y?LLU>L#Zbf+LY`*h;nBuRUXLQen;i zgVSq~rS38#x0SdXE_KJc3KeVDbO$Wd%zjI|xurL*6e#1VLiMejQF1ezukd!*0#ots z>j4lW#Fe5e$^pj48>hvRLt8SySG%k}_(6&`C8dA)GwOQs?NZ_|b%sr!jmbkBf$C%c z2pylj3)SXYK-jB`VksMSKsZt>OVo@n9OCxuOBy{sxyA8|0mUVg-DBG0dOYnL!=I2-6q}BVMq>xY{GZ!IEUU0>*_stkm}W7N z<33{JAcZgTdEByvo8H~x9Ec&~NZ)U%O>Bw0s(LXJA9poy{K=~TEF{KQr~-fQgGNW9 z(?rZWw2#v|pgW0Q^B}sa$ggfsPE(%PEle&09e0O39Ul=^Y;e~{y@;$9GW<|!y4cXK z=(WAh6!R%t<%3+BNQ>wu(K4j9x3I5&;@@}xeW_9cG(Rmf*Z~mNIT@==rG4IEh8Z5Q zO5N>>MnyY}{!BuZRRi-BDtp)4eP;|Uvt#*%K!{@zNKW&R#v##E60xw zz&K_6C)Vd!Ea6mjdP&FN21);Hq#(a&l?ofs+l^oz?GLzzKYe(UO$0qQyc6<9^?xg) zb&xb#;a+THjC#$vN5SOI@caNQh1}Aa1~TyXk466*@cLzo>EJ;jrM@wBvm4z{9yr zK{mgrno0G9m55J^x>zkpylM`p9p+}NZ!D=sg&qK%Mil823HxpaH!r|?f8S|1Au>rC zr*E!$6y?MmOXNrCCHsh;Dq12mb+B1IW+iu zeKZf7TpCawCWq`Vw~AZ-GOTR=z2YV$!1Ah*TcPYscl&Ww82RhKR)64Xetw>cR!vpK zT3XG9*~I*#@T}!OadZN#`K1(i?I%{ri;>s8S%jv`)To+6qy`$f4NJZG)=Rrv-G0!;Gapg!#%M@`@2r9vIhfuJU0-^}ADHe?M%s^ClhL+xN{1Q075;NM|AfndDch zJATKq-5{BS&KQkPLXXAB2L0eCyNUfMkIo+shdcc~o>}E^ zJ5p_q;~}9(_|MIt+7yE9eMn}xoRt}23SEl^H40UBDKCP%gs0@W4NH~X8(C2wG|TbF z3n+C?OvJ_r!c&b>Z24S#y329mAjv$&TyvZg8xtJe9%HpDzEKl2qtB(gt6bfaKRE}3 z<9_X>a`+vIGpd~C?3hoEuFc!9S|-8jsZc`ok21;#?wQtmDyW}EBTKJ~Y3rbv(U}evd%5>Z&7e#hf6p~{UKWXJG8_|-_>wdS zo{7eSCceHPXfF214+Om$zjsIN0ZC)HR8M^HTO3aFK?0olrTu~VYV}p+3Hie@?>DhN zj~YDW=&dKLCr0xwdL^zrgznFqH;g>1+aAeuCXY7Ht1Bv_vS0Xe$bel{?u4bEoqeLc}+DmqI+*@;mH@-{8K{*mRoc$ILZo(or>L<+n+!@Ptsziq@&|kf}Cb zQ)AZHez{+$xo1grBEN~(L}zo(ylZqCF)?@Y)Wc>sN3kS0&`Y}A2exIC+?1@lzi&0; z5M(V`NG7d#bos{J@}Y6Y4)Wahb5^ekw`WD!vP7NCJg>^j|9?+K6o%F!wm9Nop``zHdDr?nSlSY*Ml&-i+6IhH9q3DoUaVAl{E~y zi6nYwdktC#pt%aSOM!;BPBBk{Cw5a@R*Fmgrl~vOE{B|2|BPV^8Qr(J6d;$#BBkO#F>r+@^%_@#nF7nkwo*ty z@s@D%QnDwTQD=$#_dd102aJ^h;jeF0#P$^ze7d(P`k7BvRlMVV_19s+wKIHG4pNh~ zxBs;;yIK(x{(?518$Z%EjRj*ilnO%I$!~0dEg~iuKp1fN{!`CfXCCQWBB?Wt8{1lE1 zHd9*`vO9Muu2-s$5nc$UX_H}WF(5G$*7wm#VtuiAiYi7`A6xxc|J~I;fg=OHC?xp0 z*{SB1_9n~KGvtX_g#GRexju^!ok3)LtFfOw4`c_v3=Rn0Ss`+oo;8?Ea{xuJ(hXHc zD*r}da3!JC&Y?T<;7hISje2seBeqGn|v8OFR{vr5yq|2NT?sNI}%w8sHoF*hrawy6&{!{8Y@vd-kMO$iuQm!@~a%R;kNpYpP0ccQdLb zJZgvv%GQ!=-b2EJK7I!}(vLZ-VE|ZbOoE$V1v)s&?KyEFO#5RfUdT3vhWjcjYA?}7 zKuLphsVfE!xIMRDW#SQTLy)l}kqF@g8)N?vgvxHcw* zZ){LRAU!16AEbX`93v=yCEt`0K8dLsRFz8N`x^j+?u2oDmMF}xq>L0TQFhZCoV`K|>oq%A1KO2oTN=MeyFJEk~-)T#^nN4CIS&d#!r^XkA zLG=t@Q6t?~W#awm%O){D80hYRpUbMQJ=t4(H>kQ;MM%9u&A8*Rg~ zf8=eUXn?kNvNV9}m84Xp25~Dj`1B%a7dSpVkm`J1EYdsd=V~qd**~
  • l3YVp|+Xa7nB?&|us#U6i2>B0Up()`2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/dialog_task_filter.xml b/app/src/main/res/layout/dialog_task_filter.xml new file mode 100644 index 000000000..54a7aef77 --- /dev/null +++ b/app/src/main/res/layout/dialog_task_filter.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_task_status_filter.xml b/app/src/main/res/layout/dialog_task_status_filter.xml new file mode 100644 index 000000000..75b589495 --- /dev/null +++ b/app/src/main/res/layout/dialog_task_status_filter.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/fragment_task.xml b/app/src/main/res/menu/fragment_task.xml index 5467a0525..481ca203c 100755 --- a/app/src/main/res/menu/fragment_task.xml +++ b/app/src/main/res/menu/fragment_task.xml @@ -1,11 +1,17 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="net.coding.program.user.UsersListActivity"> + + app:showAsAction="always"/> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 381ee6583..fb1fd90c0 100755 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -120,4 +120,9 @@ #8cc665 #44a340 #1e6923 + + #E84D60 + #59C772 + #F6A623 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f85346e65..0ee960871 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -168,6 +168,7 @@ LocalFileListActivity 项目转让 我的任务 + 任务筛选 欢迎注册 Coding,请尽快去邮箱查收邮件并激活账号。如若在收件箱中未看到激活邮件,请留意一下垃圾邮件箱(T_T)。 该邮箱尚未激活,请尽快去邮箱查收邮件并激活账号。如若在收件箱中未看到激活邮件,请留意一下垃圾邮件箱(T_T)。 @@ -201,5 +202,9 @@ 团队成员 团队项目 删除 + 重置 + Bug + 功能 + 调研 \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b0aaf3574..204767623 100755 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -404,6 +404,19 @@ @color/font_2 + + From b0b10a87df4a685f70f5e6014affab945c4b985c Mon Sep 17 00:00:00 2001 From: 8206503 <8206503@qq.com> Date: Tue, 13 Dec 2016 15:43:37 +0800 Subject: [PATCH 03/56] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=B8=8B=20build.gradl?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 384a5be86..c385d09db 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,7 +90,6 @@ dependencies { compile files('libs/pinyin4j-2.5.0.jar') compile files('libs/jg_filter_sdk_1.1.jar') compile files('libs/wup-1.0.0.E-SNAPSHOT.jar') - compile files('libs/Xg_sdk_v2.42_20160111_1539.jar') compile files('libs/Xg_sdk_v2.45_20160510_1845.jar') compile project(':bottom-bar') From 311e082e3d4e4d9d7262a8283e1a32ada3ea0a71 Mon Sep 17 00:00:00 2001 From: anfangshuo Date: Tue, 13 Dec 2016 18:35:34 +0800 Subject: [PATCH 04/56] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=A4=96=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=AD=9B=E9=80=89UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/coding/program/MainActivity.java | 17 ++- .../coding/program/common/FilterDialog.java | 32 ++--- .../net/coding/program/event/EventFilter.java | 14 +++ .../program/project/ProjectFragment.java | 6 +- .../project/detail/ProjectTaskFragment.java | 25 ++++ .../net/coding/program/task/TaskFragment.java | 68 ++++++++++- .../main/res/layout/dialog_task_filter.xml | 110 ++++++++++++++---- .../res/layout/dialog_task_status_filter.xml | 85 -------------- app/src/main/res/layout/fragment_task.xml | 26 +++-- .../res/layout/view_task_status_filter.xml | 29 +++++ .../main/res/menu/fragment_project_task.xml | 11 ++ app/src/main/res/values/colors.xml | 5 - 12 files changed, 283 insertions(+), 145 deletions(-) delete mode 100644 app/src/main/res/layout/dialog_task_status_filter.xml create mode 100644 app/src/main/res/layout/view_task_status_filter.xml create mode 100755 app/src/main/res/menu/fragment_project_task.xml diff --git a/app/src/main/java/net/coding/program/MainActivity.java b/app/src/main/java/net/coding/program/MainActivity.java index 4f305b0f8..4d49d905b 100755 --- a/app/src/main/java/net/coding/program/MainActivity.java +++ b/app/src/main/java/net/coding/program/MainActivity.java @@ -83,7 +83,7 @@ public class MainActivity extends BaseActivity { View actionBarCompShadow; TextView toolbarTitle; - View toolbarProjectTitle; + TextView toolbarProjectTitle; private static boolean sNeedWarnEmailNoValidLogin = false; @@ -233,7 +233,7 @@ final void initMainActivity() { } toolbarTitle = (TextView) findViewById(R.id.toolbarTitle); - toolbarProjectTitle = findViewById(R.id.toolbarProjectTitle); + toolbarProjectTitle = (TextView) findViewById(R.id.toolbarProjectTitle); toolbarProjectTitle.setOnClickListener(clickProjectTitle); toolbarMaopaoTitle = (Spinner) findViewById(R.id.toolbarMaopaoTitle); @@ -383,7 +383,14 @@ public void onNavigationDrawerItemSelected(int position) { } visibleTitle(toolbarMaopaoTitle); - } else if (position == 0) { + } else if (position == 0 || position == 1) { + if (position == 0) { + toolbarProjectTitle.setText("我的项目"); + } + if (position == 1) { + toolbarProjectTitle.setText("我的任务"); + } + toolbarProjectTitle.setTag(position); visibleTitle(toolbarProjectTitle); } else { toolbarTitle.setVisibility(View.VISIBLE); @@ -429,7 +436,7 @@ protected void onRestoreInstanceState(Bundle savedInstanceState) { public void restoreActionBar() { mTitle = drawer_title[mSelectPos]; - if (mSelectPos == 0) { + if (mSelectPos == 0 || mSelectPos == 1) { visibleTitle(toolbarProjectTitle); } else if (mSelectPos == 2) { visibleTitle(toolbarMaopaoTitle); @@ -478,7 +485,7 @@ private void exitApp() { } private View.OnClickListener clickProjectTitle = v -> { - EventBus.getDefault().post(new EventFilter()); + EventBus.getDefault().post(new EventFilter(v.getTag())); }; class MaopaoTypeAdapter extends BaseAdapter { diff --git a/app/src/main/java/net/coding/program/common/FilterDialog.java b/app/src/main/java/net/coding/program/common/FilterDialog.java index 8f2de0023..3afae63a4 100644 --- a/app/src/main/java/net/coding/program/common/FilterDialog.java +++ b/app/src/main/java/net/coding/program/common/FilterDialog.java @@ -8,6 +8,8 @@ import android.support.v4.graphics.drawable.DrawableCompat; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; @@ -31,31 +33,36 @@ public static FilterDialog getInstance() { } public void show(Context context, FilterModel filterModel, SearchListener searchListener) { - mDialog = new Dialog(context, R.style.notitleDialog); this.mContext = context; + mDialog = new Dialog(context, R.style.notitleDialog); + //adjustPan|stateAlwaysVisible|adjustUnspecified|stateHidden + mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | + WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | + WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); mDialog.setContentView(R.layout.dialog_task_filter); mDialog.setCanceledOnTouchOutside(true); - //赋值的位置是有影响的 mDialog.getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT; mDialog.show(); View reset = mDialog.findViewById(R.id.tv_reset); EditText etSearch = (EditText) mDialog.findViewById(R.id.et_search); + etSearch.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + mDialog.dismiss(); + } + return false; + }); TextView taskDoing = (TextView) mDialog.findViewById(R.id.tv_task_doing); TextView taskDone = (TextView) mDialog.findViewById(R.id.tv_task_done); - TextView bug = (TextView) mDialog.findViewById(R.id.tv_bug); - TextView function = (TextView) mDialog.findViewById(R.id.tv_function); - TextView survey = (TextView) mDialog.findViewById(R.id.tv_survey); - - setLeftDrawable(bug, false); - setLeftDrawable(function, false); - setLeftDrawable(survey, false); + //setLeftDrawable(bug, false); } + /** * 非左即右 * @@ -66,7 +73,7 @@ public void setRightDrawable(TextView textView, int resId) { textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, resId, 0); } - public void setLeftDrawable(TextView textView, boolean checked) { + public void setLeftDrawable(TextView textView, String color, boolean checked) { if (mContext == null) { return; @@ -75,9 +82,8 @@ public void setLeftDrawable(TextView textView, boolean checked) { final Drawable originalBitmapDrawable = mContext.getResources().getDrawable(R.drawable.ic_project_topic_label).mutate(); Drawable right = checked ? mContext.getResources().getDrawable(R.drawable.ic_task_status_list_check) : null; - ColorStateList color = ColorStateList.valueOf(Color.parseColor(textView.getTag().toString())); - - textView.setCompoundDrawablesWithIntrinsicBounds(tintDrawable(originalBitmapDrawable, color), null, right, null); + ColorStateList colorStateList = ColorStateList.valueOf(Color.parseColor(color)); + textView.setCompoundDrawablesWithIntrinsicBounds(tintDrawable(originalBitmapDrawable, colorStateList), null, right, null); } public Drawable tintDrawable(Drawable drawable, ColorStateList colors) { diff --git a/app/src/main/java/net/coding/program/event/EventFilter.java b/app/src/main/java/net/coding/program/event/EventFilter.java index d60a5c909..6000274c1 100644 --- a/app/src/main/java/net/coding/program/event/EventFilter.java +++ b/app/src/main/java/net/coding/program/event/EventFilter.java @@ -1,7 +1,21 @@ package net.coding.program.event; +import net.coding.program.common.Global; + /** * Created by chenchao on 16/9/18. */ public class EventFilter { + public EventFilter(Object obj) { + if (obj == null) { + return; + } + try { + this.index = Integer.parseInt(obj.toString()); + } catch (Exception e) { + Global.errorLog(e); + } + } + + public int index;//0 我的项目,1我的任务 } diff --git a/app/src/main/java/net/coding/program/project/ProjectFragment.java b/app/src/main/java/net/coding/program/project/ProjectFragment.java index 3837c3c14..665c0e85a 100755 --- a/app/src/main/java/net/coding/program/project/ProjectFragment.java +++ b/app/src/main/java/net/coding/program/project/ProjectFragment.java @@ -89,7 +89,11 @@ public void onDetach() { // 用于处理推送 public void onEventMainThread(Object object) { if (object instanceof EventFilter) { - action_filter(); + EventFilter eventFilter = (EventFilter) object; + //确定是我的项目筛选 + if (eventFilter.index == 0) { + action_filter(); + } } else if (object instanceof EventPosition) { EventPosition event = (EventPosition) object; int position = event.position; diff --git a/app/src/main/java/net/coding/program/project/detail/ProjectTaskFragment.java b/app/src/main/java/net/coding/program/project/detail/ProjectTaskFragment.java index 5e6c4674b..f2b282349 100755 --- a/app/src/main/java/net/coding/program/project/detail/ProjectTaskFragment.java +++ b/app/src/main/java/net/coding/program/project/detail/ProjectTaskFragment.java @@ -7,6 +7,8 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.ViewPager; +import android.support.v7.view.menu.ActionMenuItemView; +import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.View; @@ -15,6 +17,7 @@ import net.coding.program.MyApp; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; +import net.coding.program.common.FilterDialog; import net.coding.program.common.Global; import net.coding.program.common.ListModify; import net.coding.program.common.SaveFragmentPagerAdapter; @@ -33,6 +36,8 @@ import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.FragmentArg; import org.androidannotations.annotations.OnActivityResult; +import org.androidannotations.annotations.OptionsItem; +import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.ViewById; import org.json.JSONArray; import org.json.JSONException; @@ -43,6 +48,7 @@ import java.util.List; @EFragment(R.layout.fragment_project_task) +@OptionsMenu(R.menu.fragment_project_task) public class ProjectTaskFragment extends BaseFragment implements TaskListParentUpdate, TaskListFragment.FloatButton { final String HOST_MEMBERS = Global.HOST_API + "/project/%d/members?pageSize=1000"; @@ -292,4 +298,23 @@ public String getPageIconUrl(int position) { return mMembersAll.get(position).user.avatar; } } + + @OptionsItem + protected final void action_filter() { + + Toolbar mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); + if (mToolbar != null) { + ActionMenuItemView viewById = (ActionMenuItemView) mToolbar.findViewById(R.id.action_filter); + if (viewById != null) { + viewById.setIcon(getResources().getDrawable(R.drawable.ic_menu_filter_selected)); + } + } +// ProjectObject projectObject = mData.get(pager.getCurrentItem()); +// TaskAddActivity_.intent(this) +// .mUserOwner(MyApp.sUserObject) +// .mProjectObject(projectObject) +// .startForResult(ListModify.RESULT_EDIT_LIST); + + FilterDialog.getInstance().show(getContext(), null, null); + } } diff --git a/app/src/main/java/net/coding/program/task/TaskFragment.java b/app/src/main/java/net/coding/program/task/TaskFragment.java index e91117df7..d6c82b89c 100755 --- a/app/src/main/java/net/coding/program/task/TaskFragment.java +++ b/app/src/main/java/net/coding/program/task/TaskFragment.java @@ -5,10 +5,13 @@ import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; +import android.support.v7.view.menu.ActionMenuItemView; +import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import net.coding.program.MainActivity; import net.coding.program.MyApp; @@ -18,6 +21,7 @@ import net.coding.program.common.ListModify; import net.coding.program.common.SaveFragmentPagerAdapter; import net.coding.program.common.network.LoadingFragment; +import net.coding.program.event.EventFilter; import net.coding.program.model.AccountInfo; import net.coding.program.model.ProjectObject; import net.coding.program.model.TaskObject; @@ -40,6 +44,8 @@ import java.util.ArrayList; import java.util.List; +import de.greenrobot.event.EventBus; + @EFragment(R.layout.fragment_task) @OptionsMenu(R.menu.fragment_task) @@ -186,13 +192,23 @@ protected final void action_add() { @OptionsItem protected final void action_filter() { + TextView title = (TextView) getActivity().findViewById(R.id.toolbarProjectTitle); + title.setText("update"); + + Toolbar mToolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); + if (mToolbar != null) { + ActionMenuItemView viewById = (ActionMenuItemView) mToolbar.findViewById(R.id.action_filter); + if (viewById != null) { + viewById.setIcon(getResources().getDrawable(R.drawable.ic_menu_filter_selected)); + } + } // ProjectObject projectObject = mData.get(pager.getCurrentItem()); // TaskAddActivity_.intent(this) // .mUserOwner(MyApp.sUserObject) // .mProjectObject(projectObject) // .startForResult(ListModify.RESULT_EDIT_LIST); - FilterDialog.getInstance().show(getContext(),null,null); + FilterDialog.getInstance().show(getContext(), null, null); } public static class TaskCount { @@ -258,4 +274,54 @@ public Fragment getItem(int position) { return fragment; } } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + EventBus.getDefault().register(this); + } + + @Override + public void onDetach() { + super.onDetach(); + EventBus.getDefault().unregister(this); + } + + //筛选的index + private int statusIndex = 0; + + // 用于处理推送 + public void onEventMainThread(Object object) { + if (!(object instanceof EventFilter)) { + return; + } + EventFilter eventFilter = (EventFilter) object; + //确定是我的任务筛选 + if (eventFilter.index == 1) { + iniTaskStatusLayout(); + iniTaskStatus(); + } + } + + private void iniTaskStatusLayout() { + View viewById = getActivity().findViewById(R.id.ll_task_filter); + viewById.setVisibility(viewById.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE); + } + + private void iniTaskStatus() { + int[] filterItem = {R.id.tv_status1, R.id.tv_status2, R.id.tv_status3}; + int font2 = getResources().getColor(R.color.font_2); + int green = getResources().getColor(R.color.green); + for (int i = 0; i < filterItem.length; i++) { + TextView status = (TextView) getActivity().findViewById(filterItem[i]); + int finalI = i; + status.setOnClickListener(v -> { + this.statusIndex = finalI; + iniTaskStatus(); + iniTaskStatusLayout(); + }); + status.setTextColor(i != this.statusIndex ? font2 : green); + status.setCompoundDrawablesWithIntrinsicBounds(0, 0, i != this.statusIndex ? 0 : R.drawable.ic_task_status_list_check, 0); + } + } } diff --git a/app/src/main/res/layout/dialog_task_filter.xml b/app/src/main/res/layout/dialog_task_filter.xml index 54a7aef77..3f5f53a82 100644 --- a/app/src/main/res/layout/dialog_task_filter.xml +++ b/app/src/main/res/layout/dialog_task_filter.xml @@ -14,8 +14,9 @@ android:background="@color/white"> + - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task.xml b/app/src/main/res/layout/fragment_task.xml index 8d9dba0f8..99f4b6f73 100755 --- a/app/src/main/res/layout/fragment_task.xml +++ b/app/src/main/res/layout/fragment_task.xml @@ -1,37 +1,39 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="net.coding.program.task.TaskFragment"> + android:id="@+id/actionDivideLine" + style="@style/DivideLine"/> + android:background="@color/stand_bg"/> + android:layout_height="wrap_content"/> + android:layout_height="wrap_content" + android:layout_gravity="center"/> + + diff --git a/app/src/main/res/layout/view_task_status_filter.xml b/app/src/main/res/layout/view_task_status_filter.xml new file mode 100644 index 000000000..b7ffc568e --- /dev/null +++ b/app/src/main/res/layout/view_task_status_filter.xml @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/fragment_project_task.xml b/app/src/main/res/menu/fragment_project_task.xml new file mode 100755 index 000000000..661735981 --- /dev/null +++ b/app/src/main/res/menu/fragment_project_task.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index fb1fd90c0..381ee6583 100755 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -120,9 +120,4 @@ #8cc665 #44a340 #1e6923 - - #E84D60 - #59C772 - #F6A623 - \ No newline at end of file From da1d73b2e6742159af939cc48f7fb1ec60a6d059 Mon Sep 17 00:00:00 2001 From: 8206503 <8206503@qq.com> Date: Wed, 14 Dec 2016 16:41:54 +0800 Subject: [PATCH 05/56] =?UTF-8?q?=E5=86=92=E6=B3=A1=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=94=B1=20listview=20=E6=94=B9=E4=B8=BA=20recyclerview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../java/net/coding/program/FootUpdate.java | 21 +- .../net/coding/program/common/Global.java | 16 + .../maopao/MaopaoListBaseFragment.java | 359 ++++++++++-------- .../program/maopao/MaopaoListFragment.java | 22 +- .../subject/SubjectDetailFragment.java | 8 +- .../res/layout/fragment_mall_order_detail.xml | 1 + .../main/res/layout/fragment_maopao_list.xml | 27 +- .../res/layout/fragment_maopao_list_item.xml | 8 +- .../res/layout/subject_detail_maopao_list.xml | 29 +- .../jazzylistview/CompatListView.java | 148 ++++++++ 11 files changed, 420 insertions(+), 220 deletions(-) create mode 100644 scrollanimationlibrary/src/main/java/com/twotoasters/jazzylistview/CompatListView.java diff --git a/app/build.gradle b/app/build.gradle index c385d09db..ac37b990b 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,6 +95,7 @@ dependencies { compile 'com.alibaba:fastjson:1.1.44.android' compile 'com.flyco.roundview:FlycoRoundView_Lib:1.1.4@aar' + compile 'com.marshalchen.ultimaterecyclerview:library:0.7.0' } buildscript { diff --git a/app/src/main/java/net/coding/program/FootUpdate.java b/app/src/main/java/net/coding/program/FootUpdate.java index 1d31028c5..e1b87fe91 100755 --- a/app/src/main/java/net/coding/program/FootUpdate.java +++ b/app/src/main/java/net/coding/program/FootUpdate.java @@ -1,5 +1,6 @@ package net.coding.program; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -36,6 +37,10 @@ public void init(Object listView, LayoutInflater inflater, final LoadMore loadMo init(listView, inflater, loadMore, "addFooterView"); } + public void initToRecycler(Object listView, LayoutInflater inflater, final LoadMore loadMore) { + init(listView, inflater, loadMore, null); + } + private void init(Object listView, LayoutInflater inflater, final LoadMore loadMore, String callMethod) { View v = inflater.inflate(R.layout.listview_foot, null, false); @@ -52,16 +57,22 @@ private void init(Object listView, LayoutInflater inflater, final LoadMore loadM mLoading = v.findViewById(R.id.progressBar); - try { - Method method = listView.getClass().getMethod(callMethod, View.class); - method.invoke(listView, v); - } catch (Exception e) { - Global.errorLog(e); + if (!TextUtils.isEmpty(callMethod)) { + try { + Method method = listView.getClass().getMethod(callMethod, View.class); + method.invoke(listView, v); + } catch (Exception e) { + Global.errorLog(e); + } } mLayout.setVisibility(View.GONE); } + public View getView() { + return mLayout; + } + public void showLoading() { show(true, true); } diff --git a/app/src/main/java/net/coding/program/common/Global.java b/app/src/main/java/net/coding/program/common/Global.java index 6d99c0ed1..5fe741842 100644 --- a/app/src/main/java/net/coding/program/common/Global.java +++ b/app/src/main/java/net/coding/program/common/Global.java @@ -109,6 +109,22 @@ public static String dayFromTime(long time) { return DayFormatTime.format(time); } + private static final String LOG_PREFIX = "coding_"; + private static final int LOG_PREFIX_LENGTH = LOG_PREFIX.length(); + private static final int MAX_LOG_TAG_LENGTH = 23; + + public static String makeLogTag(Class cls) { + return makeLogTag(cls.getSimpleName()); + } + + public static String makeLogTag(String str) { + if (str.length() > MAX_LOG_TAG_LENGTH - LOG_PREFIX_LENGTH) { + return LOG_PREFIX + str.substring(0, MAX_LOG_TAG_LENGTH - LOG_PREFIX_LENGTH - 1); + } + + return LOG_PREFIX + str; + } + public static long longFromDay(String day) throws ParseException { final String format = "yyyy-MM-dd"; final SimpleDateFormat sd = new SimpleDateFormat(format); diff --git a/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java b/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java index 30e0450a5..d98362d45 100644 --- a/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java +++ b/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java @@ -1,5 +1,6 @@ package net.coding.program.maopao; +import android.animation.Animator; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; @@ -8,14 +9,15 @@ import android.support.v4.app.Fragment; import android.support.v4.view.ViewCompat; import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.text.Html; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.widget.BaseAdapter; +import android.view.animation.LinearInterpolator; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; @@ -24,10 +26,12 @@ import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.JsonHttpResponseHandler; import com.loopj.android.http.RequestParams; -import com.twotoasters.jazzylistview.JazzyListView; +import com.marshalchen.ultimaterecyclerview.UltimateRecyclerView; +import com.marshalchen.ultimaterecyclerview.UltimateRecyclerviewViewHolder; +import com.marshalchen.ultimaterecyclerview.UltimateViewAdapter; +import com.marshalchen.ultimaterecyclerview.quickAdapter.easyRegularAdapter; import com.umeng.socialize.sso.UMSsoHandler; -import net.coding.program.FootUpdate; import net.coding.program.MyApp; import net.coding.program.R; import net.coding.program.common.BlankViewDisplay; @@ -39,9 +43,10 @@ import net.coding.program.common.StartActivity; import net.coding.program.common.TextWatcherAt; import net.coding.program.common.base.MyJsonResponse; -import net.coding.program.common.network.LoadingFragment; import net.coding.program.common.network.MyAsyncHttpClient; +import net.coding.program.common.network.RefreshBaseFragment; import net.coding.program.common.ui.BaseActivity; +import net.coding.program.common.ui.BaseFragment; import net.coding.program.common.widget.input.MainInputView; import net.coding.program.event.EventShowBottom; import net.coding.program.maopao.item.CommentArea; @@ -53,6 +58,7 @@ import net.coding.program.setting.ValidePhoneActivity_; import net.coding.program.third.EmojiFilter; +import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.ViewById; import org.apache.http.Header; @@ -62,14 +68,18 @@ import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import de.greenrobot.event.EventBus; +import jp.wasabeef.recyclerview.internal.ViewHelper; /** * Created by chenchao on 15/9/22. */ @EFragment -public abstract class MaopaoListBaseFragment extends LoadingFragment implements FootUpdate.LoadMore, StartActivity { +public abstract class MaopaoListBaseFragment extends BaseFragment implements StartActivity { + + public static final String TAG = Global.makeLogTag(MaopaoListBaseFragment.class); abstract protected String createUrl(); @@ -82,7 +92,7 @@ public abstract class MaopaoListBaseFragment extends LoadingFragment implements abstract protected void initData(); @ViewById - protected JazzyListView listView; + protected UltimateRecyclerView listView; @ViewById protected View blankLayout; @ViewById @@ -93,7 +103,7 @@ public abstract class MaopaoListBaseFragment extends LoadingFragment implements protected boolean mIsToMaopaoTopic = false; - protected int id = UPDATE_ALL_INT; + protected int id = RefreshBaseFragment.UPDATE_ALL_INT; protected long lastTime = 0; int needScrollY = 0; @@ -119,6 +129,7 @@ public abstract class MaopaoListBaseFragment extends LoadingFragment implements boolean mNoMore = false; + protected MyAdapter mAdapter; protected ArrayList mData = new ArrayList<>(); @@ -135,6 +146,24 @@ public void onActivityCreated(Bundle savedInstanceState) { setHasOptionsMenu(true); } + View baseLoadinggView; + + public void showLoading(boolean show) { + if (baseLoadinggView == null) { + return; + } + + baseLoadinggView.setVisibility(show ? View.VISIBLE : View.GONE); + } + + @AfterViews + protected void initLoadingFragment() { + View view = getView(); + if (view != null) { + baseLoadinggView = view.findViewById(R.id.baseLoadingView); + } + } + protected void initImageWidth() { // 图片显示,单位为 dp // 62 photo 3 photo 3 photo 34 @@ -147,7 +176,17 @@ protected void initImageWidth() { } protected void initMaopaoListBaseFragmen() { - initRefreshLayout(); + RecyclerView.LayoutManager manager = new LinearLayoutManager(getActivity()); + listView.setLayoutManager(manager); + + listView.setEmptyView(R.layout.loading_view, R.layout.loading_view); + + + listView.setDefaultOnRefreshListener(() -> onRefresh()); + + listView.setOnLoadMoreListener((itemsCount, maxLastVisiblePosition) -> + MaopaoListBaseFragment.this.loadMore()); + initImageWidth(); ViewCompat.setNestedScrollingEnabled(listView, true); @@ -163,13 +202,17 @@ protected void initMaopaoListBaseFragmen() { if (mData.isEmpty()) { showLoading(true); } else { - setRefreshing(true); + listView.setRefreshing(true); } initMaopaoType(); myImageGetter = new MyImageGetter(getActivity()); - mFootUpdate.init(listView, mInflater, this); + mFootUpdate.initToRecycler(listView, mInflater, this); + mFootUpdate.showLoading(); + listView.setLoadMoreView(mFootUpdate.getView()); + + mAdapter = new MyAdapter(mData, getShowAnimator()); listView.setAdapter(mAdapter); ViewTreeObserver vto = listView.getViewTreeObserver(); @@ -189,7 +232,7 @@ public void onGlobalLayout() { } else if (cal1 == 1) { int scrollResult = needScrollY + oldListHigh - listHeight; - listView.smoothScrollBy(scrollResult, 1); + listView.mRecyclerView.smoothScrollBy(scrollResult, 1); needScrollY = 0; } @@ -220,6 +263,10 @@ public boolean onTouch(View v, MotionEvent event) { initData(); } + protected boolean getShowAnimator() { + return false; + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_EDIT_MAOPAO) { @@ -294,9 +341,9 @@ private void sendEvent(boolean show) { public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(getMaopaoUrlFormat())) { showLoading(false); - setRefreshing(false); + listView.setRefreshing(false); if (code == 0) { - if (id == UPDATE_ALL_INT) { + if (id == RefreshBaseFragment.UPDATE_ALL_INT) { mData.clear(); } @@ -321,15 +368,16 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object lastTime = maopaoObject.sortTime; mAdapter.notifyDataSetChanged(); - if (oldId == UPDATE_ALL_INT) { + if (oldId == RefreshBaseFragment.UPDATE_ALL_INT) { // 当单个的冒泡item大于一屏时,smoothScrollToPosition(0)不会滚动到listview的顶端 - listView.setSelectionAfterHeaderView(); + listView.mRecyclerView.scrollToPosition(0); } } if (mNoMore) { - mFootUpdate.dismiss(); + listView.disableLoadmore(); } else { + listView.reenableLoadmore(); mFootUpdate.showLoading(); } @@ -337,9 +385,10 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object } else { if (mData.size() > 0) { + listView.reenableLoadmore(); mFootUpdate.showFail(); } else { - mFootUpdate.dismiss(); + listView.disableLoadmore(); } showErrorMsg(code, respanse); @@ -442,7 +491,7 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object @Override protected void initSetting() { super.initSetting(); - id = UPDATE_ALL_INT; + id = RefreshBaseFragment.UPDATE_ALL_INT; lastTime = 0; } @@ -451,7 +500,6 @@ public void loadMore() { getNetwork(createUrl(), getMaopaoUrlFormat()); } - @Override public void onRefresh() { initSetting(); getNetwork(createUrl(), getMaopaoUrlFormat()); @@ -500,7 +548,7 @@ public void onClick(DialogInterface dialog, int which) { } }; - public static void popReward(final BaseActivity activity, View v, final BaseAdapter adapter) { + public static void popReward(final BaseActivity activity, View v, final UltimateViewAdapter adapter) { Object data = v.getTag(); if (data instanceof Maopao.MaopaoObject) { final Maopao.MaopaoObject maopaoData = (Maopao.MaopaoObject) data; @@ -726,165 +774,99 @@ protected void popComment(View v) { mEnterLayout.showSystemInput(true); } - protected BaseAdapter mAdapter = new BaseAdapter() { - final int[] commentsId = new int[]{ - R.id.comment0, - R.id.comment1, - R.id.comment2, - R.id.comment3, - R.id.comment4, - }; - protected View.OnClickListener mOnClickMaopaoItem = new View.OnClickListener() { - @Override - public void onClick(View v) { - Maopao.MaopaoObject data = (Maopao.MaopaoObject) v.getTag(); - Fragment parent = getParentFragment(); - MaopaoDetailActivity_ - .intent(parent != null ? parent : MaopaoListBaseFragment.this) - .mMaopaoObject(data) - .startForResult(RESULT_EDIT_MAOPAO); - } - }; - ClickSmallImage onClickImage = new ClickSmallImage(MaopaoListBaseFragment.this); + class MyHolder extends UltimateRecyclerviewViewHolder { - View.OnClickListener onClickMaopaoMore = new View.OnClickListener() { - @Override - public void onClick(View v) { - final int maopaoId = (int) v.getTag(TAG_MAOPAO_ID); - showDialog(new String[]{"删除冒泡"}, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - showDialog("冒泡", "删除冒泡?", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String HOST_MAOPAO_DELETE = Global.HOST_API + "/tweet/%s"; - deleteNetwork(String.format(HOST_MAOPAO_DELETE, maopaoId), TAG_DELETE_MAOPAO, - -1, maopaoId); - } - }); - } - } - }); + ViewHolder holder = new ViewHolder(); - } - }; + public MyHolder(View convertView, boolean isHeader) { + super(convertView); + } - View.OnClickListener onClickComment = new View.OnClickListener() { - @Override - public void onClick(View v) { - final Maopao.Comment comment = (Maopao.Comment) v.getTag(TAG_COMMENT); - if (MyApp.sUserObject.id == (comment.owner_id)) { - showDialog("冒泡", "删除评论?", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final String URI_COMMENT_DELETE = Global.HOST_API + "/tweet/%d/comment/%d"; - deleteNetwork(String.format(URI_COMMENT_DELETE, comment.tweet_id, comment.id), TAG_DELETE_MAOPAO_COMMENT, -1, comment); - } - }); - } else { - popComment(v); + public MyHolder(View convertView) { + super(convertView); + + holder.maopaoItemTop = convertView.findViewById(R.id.maopao_item_top); + + holder.maopaoItem = convertView.findViewById(R.id.MaopaoItem); + holder.maopaoItem.setOnClickListener(mOnClickMaopaoItem); + + holder.icon = (ImageView) convertView.findViewById(R.id.icon); + holder.icon.setOnClickListener(mOnClickUser); + + holder.name = (TextView) convertView.findViewById(R.id.name); + holder.name.setOnClickListener(mOnClickUser); + holder.time = (TextView) convertView.findViewById(R.id.time); + + holder.contentArea = new ContentArea(convertView, mOnClickMaopaoItem, onClickImage, myImageGetter, getImageLoad(), mPxImageWidth); + + holder.commentLikeArea = convertView.findViewById(R.id.commentLikeArea); + holder.likeUsersArea = new LikeUsersArea(convertView, MaopaoListBaseFragment.this, getImageLoad(), mOnClickUser); + + holder.location = (TextView) convertView.findViewById(R.id.location); + holder.photoType = (TextView) convertView.findViewById(R.id.photoType); + holder.likeBtn = (CheckBox) convertView.findViewById(R.id.likeBtn); + holder.commentBtn = (TextView) convertView.findViewById(R.id.commentBtn); + holder.reward = (TextView) convertView.findViewById(R.id.rewardCount); + holder.likeBtn.setTag(R.id.likeBtn, holder); + holder.maopaoGoodView = convertView.findViewById(R.id.maopaoGood); + holder.likeAreaDivide = convertView.findViewById(R.id.likeAreaDivide); + holder.commentBtn.setOnClickListener(v -> popComment(v)); + + holder.reward.setOnClickListener(v -> popReward((BaseActivity) getActivity(), v, mAdapter)); + + holder.shareBtn = convertView.findViewById(R.id.shareBtn); + holder.shareBtn.setOnClickListener(v -> { + Object item = v.getTag(); + if (item instanceof Maopao.MaopaoObject) { + action_share_third((Maopao.MaopaoObject) item); } + }); + + holder.maopaoDelete = convertView.findViewById(R.id.deleteButton); + holder.maopaoDelete.setOnClickListener(onClickDeleteMaopao); + + holder.commentArea = new CommentArea(convertView, onClickComment, myImageGetter); + + View[] divides = new View[commentsId.length]; + for (int i = 0; i < commentsId.length; ++i) { + divides[i] = convertView.findViewById(commentsId[i]).findViewById(R.id.commentTopDivider); } - }; + holder.divides = divides; + } + } - @Override - public int getCount() { - return mData.size(); + protected class MyAdapter extends easyRegularAdapter { + + private final LinearInterpolator interpolator = new LinearInterpolator(); + + public MyAdapter(List list, boolean showAnimator) { + super(list); + this.showAnimator = showAnimator; } @Override - public Object getItem(int position) { - return mData.get(position); + protected int getNormalLayoutResId() { + return R.layout.fragment_maopao_list_item; } @Override - public long getItemId(int position) { - return position; + protected MyHolder newViewHolder(View view) { + return new MyHolder(view); } - void action_share_third(Maopao.MaopaoObject mMaopaoObject) { - mEnterLayout.hideKeyboard(); - CustomShareBoard.ShareData shareData = new CustomShareBoard.ShareData(mMaopaoObject); - CustomShareBoard shareBoard = new CustomShareBoard(getActivity(), shareData); - shareBoard.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); + @Override + public MyHolder newHeaderHolder(View view) { + return new MyHolder(view, true); } @Override - public View getView(int position, View convertView, ViewGroup parent) { - final ViewHolder holder; - - if (convertView == null) { - holder = new ViewHolder(); - convertView = mInflater.inflate(R.layout.fragment_maopao_list_item, parent, false); - - holder.maopaoItemTop = convertView.findViewById(R.id.maopao_item_top); - - holder.maopaoItem = convertView.findViewById(R.id.MaopaoItem); - holder.maopaoItem.setOnClickListener(mOnClickMaopaoItem); - - holder.icon = (ImageView) convertView.findViewById(R.id.icon); - holder.icon.setOnClickListener(mOnClickUser); - - holder.name = (TextView) convertView.findViewById(R.id.name); - holder.name.setOnClickListener(mOnClickUser); - holder.time = (TextView) convertView.findViewById(R.id.time); - - holder.contentArea = new ContentArea(convertView, mOnClickMaopaoItem, onClickImage, myImageGetter, getImageLoad(), mPxImageWidth); - - holder.commentLikeArea = convertView.findViewById(R.id.commentLikeArea); - holder.likeUsersArea = new LikeUsersArea(convertView, MaopaoListBaseFragment.this, getImageLoad(), mOnClickUser); - - holder.location = (TextView) convertView.findViewById(R.id.location); - holder.photoType = (TextView) convertView.findViewById(R.id.photoType); - holder.likeBtn = (CheckBox) convertView.findViewById(R.id.likeBtn); - holder.commentBtn = (TextView) convertView.findViewById(R.id.commentBtn); - holder.reward = (TextView) convertView.findViewById(R.id.rewardCount); - holder.likeBtn.setTag(R.id.likeBtn, holder); - holder.maopaoGoodView = convertView.findViewById(R.id.maopaoGood); - holder.likeAreaDivide = convertView.findViewById(R.id.likeAreaDivide); - holder.commentBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - popComment(v); - } - }); - - holder.reward.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - popReward((BaseActivity) getActivity(), v, mAdapter); - } - }); - - holder.shareBtn = convertView.findViewById(R.id.shareBtn); - holder.shareBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Object item = v.getTag(); - if (item instanceof Maopao.MaopaoObject) { - action_share_third((Maopao.MaopaoObject) item); - } - } - }); - - holder.maopaoDelete = convertView.findViewById(R.id.deleteButton); - holder.maopaoDelete.setOnClickListener(onClickDeleteMaopao); - - holder.commentArea = new CommentArea(convertView, onClickComment, myImageGetter); - - View[] divides = new View[commentsId.length]; - for (int i = 0; i < commentsId.length; ++i) { - divides[i] = convertView.findViewById(commentsId[i]).findViewById(R.id.commentTopDivider); - } - holder.divides = divides; - - convertView.setTag(R.id.MaopaoItem, holder); - } else { - holder = (ViewHolder) convertView.getTag(R.id.MaopaoItem); - } + public MyHolder newFooterHolder(View view) { + return new MyHolder(view, true); + } - final Maopao.MaopaoObject data = (Maopao.MaopaoObject) getItem(position); + @Override + protected void withBindHolder(MyHolder holderLayout, Maopao.MaopaoObject data, int position) { + ViewHolder holder = holderLayout.holder; holder.likeUsersArea.likeUsersLayout.setTag(TAG_MAOPAO, data); holder.likeUsersArea.displayLikeUser(); @@ -1008,15 +990,60 @@ public void onMyFailure(JSONObject response) { holder.divides[commentsId.length - 1].setVisibility(View.VISIBLE); } - if (mData.size() - position <= 1) { - if (!mNoMore) { - getNetwork(createUrl(), getMaopaoUrlFormat()); + if (showAnimator) { + if (position > mLastPosition) { + Animator[] animators = getAdapterAnimations(holderLayout.getView(), AdapterAnimationType.SlideInBottom); + for (Animator anim : animators) { + anim.setDuration(600).start(); + anim.setInterpolator(interpolator); + } + mLastPosition = position; + } else { + ViewHelper.clear(holderLayout.getView()); } } + } + + private boolean showAnimator = false; + private int mLastPosition = -1; + } + + View.OnClickListener mOnClickMaopaoItem = v -> { + Maopao.MaopaoObject data = (Maopao.MaopaoObject) v.getTag(); + Fragment parent = getParentFragment(); + MaopaoDetailActivity_ + .intent(parent != null ? parent : MaopaoListBaseFragment.this) + .mMaopaoObject(data) + .startForResult(RESULT_EDIT_MAOPAO); + }; + ClickSmallImage onClickImage = new ClickSmallImage(MaopaoListBaseFragment.this); + + void action_share_third(Maopao.MaopaoObject mMaopaoObject) { + mEnterLayout.hideKeyboard(); + CustomShareBoard.ShareData shareData = new CustomShareBoard.ShareData(mMaopaoObject); + CustomShareBoard shareBoard = new CustomShareBoard(getActivity(), shareData); + shareBoard.showAtLocation(getActivity().getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); + } + - return convertView; + View.OnClickListener onClickComment = v -> { + final Maopao.Comment comment = (Maopao.Comment) v.getTag(TAG_COMMENT); + if (MyApp.sUserObject.id == (comment.owner_id)) { + showDialog("冒泡", "删除评论?", (dialog, which) -> { + final String URI_COMMENT_DELETE = Global.HOST_API + "/tweet/%s/comment/%s"; + deleteNetwork(String.format(URI_COMMENT_DELETE, comment.tweet_id, comment.id), TAG_DELETE_MAOPAO_COMMENT, -1, comment); + }); + } else { + popComment(v); } + }; + final int[] commentsId = new int[]{ + R.id.comment0, + R.id.comment1, + R.id.comment2, + R.id.comment3, + R.id.comment4, }; static class ViewHolder { diff --git a/app/src/main/java/net/coding/program/maopao/MaopaoListFragment.java b/app/src/main/java/net/coding/program/maopao/MaopaoListFragment.java index 8b8d6f43d..7ec4a2cff 100755 --- a/app/src/main/java/net/coding/program/maopao/MaopaoListFragment.java +++ b/app/src/main/java/net/coding/program/maopao/MaopaoListFragment.java @@ -26,6 +26,7 @@ import net.coding.program.common.RedPointTip; import net.coding.program.common.guide.IndicatorView; import net.coding.program.common.htmltext.URLSpanNoUnderline; +import net.coding.program.common.network.LoadingFragment; import net.coding.program.model.AccountInfo; import net.coding.program.model.BannerObject; import net.coding.program.model.UserObject; @@ -147,11 +148,14 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object } @Override - protected void initMaopaoType() { - listView.setTransitionEffect(new UpSlideInEffect()); + protected boolean getShowAnimator() { + return true; + } + @Override + protected void initMaopaoType() { if (mType == Type.friends) { - id = UPDATE_ALL_INT; + id = LoadingFragment.UPDATE_ALL_INT; lastTime = 0; } @@ -160,7 +164,7 @@ protected void initMaopaoType() { } if (mType != Type.user) { - floatButton.attachToListView(listView); + floatButton.attachToRecyclerView(listView.mRecyclerView); } else { floatButton.hide(false); } @@ -174,7 +178,6 @@ protected void initMaopaoType() { addDoubleClickActionbar(); - getNetwork(createUrl(), getMaopaoUrlFormat()); } @@ -195,8 +198,9 @@ public void onClick(View v) { mLastTime = nowTime; if (nowTime - lastTime < DOUBLE_CLICK_TIME) { - if (!isRefreshing()) { - setRefreshing(true); + if (listView.mSwipeRefreshLayout != null && + !listView.mSwipeRefreshLayout.isRefreshing()) { + listView.setRefreshing(true); onRefresh(); } } @@ -253,7 +257,7 @@ private void initBannerData() { bannerName = (TextView) bannerLayout.findViewById(R.id.bannerName); bannerTitle = (TextView) bannerLayout.findViewById(R.id.bannerTitle); - listView.addHeaderView(bannerLayout); + listView.setNormalHeader(bannerLayout); ((ViewPager) banner.findViewById(R.id.cbLoopViewPager)).setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override @@ -277,7 +281,7 @@ public void onPageSelected(int position) { @Override public void onPageScrollStateChanged(int state) { - enableSwipeRefresh(state == ViewPager.SCROLL_STATE_IDLE); + listView.enableDefaultSwipeRefresh(state == ViewPager.SCROLL_STATE_IDLE); } }); } diff --git a/app/src/main/java/net/coding/program/subject/SubjectDetailFragment.java b/app/src/main/java/net/coding/program/subject/SubjectDetailFragment.java index 671eb3ee5..55ea4503c 100755 --- a/app/src/main/java/net/coding/program/subject/SubjectDetailFragment.java +++ b/app/src/main/java/net/coding/program/subject/SubjectDetailFragment.java @@ -9,6 +9,7 @@ import net.coding.program.R; import net.coding.program.common.Global; +import net.coding.program.common.network.LoadingFragment; import net.coding.program.maopao.MaopaoListBaseFragment; import net.coding.program.model.Maopao; import net.coding.program.model.Subject; @@ -78,8 +79,7 @@ protected void initMaopaoType() { mAllJoinedPeopleLayout = (FlowLayout) mListHeaderView.findViewById(R.id.subject_detail_all_join); - - listView.addHeaderView(mListHeaderView); + listView.setNormalHeader(mListHeaderView); } @Override @@ -127,7 +127,7 @@ private int getPxValue(float dipValue) { @Override protected String createUrl() { if (subjectDescObject != null) { - if (id == UPDATE_ALL_INT) { + if (id == LoadingFragment.UPDATE_ALL_INT) { return String.format(maopaoUrlFirstFormat, subjectDescObject.id); } else return String.format(maopaoUrlFormat, subjectDescObject.id, id); @@ -143,7 +143,7 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object if (json != null) { Maopao.MaopaoObject item = new Maopao.MaopaoObject(json); mIsToMaopaoTopic = true; - if (id == UPDATE_ALL_INT) { + if (id == LoadingFragment.UPDATE_ALL_INT) { mData.clear(); mData.add(0, item); id = item.id; diff --git a/app/src/main/res/layout/fragment_mall_order_detail.xml b/app/src/main/res/layout/fragment_mall_order_detail.xml index 089e43b82..d6ef25e9b 100644 --- a/app/src/main/res/layout/fragment_mall_order_detail.xml +++ b/app/src/main/res/layout/fragment_mall_order_detail.xml @@ -15,6 +15,7 @@ android:layout_above="@+id/list_footer" android:layout_height="match_parent"> + - - - - - + android:layout_height="match_parent" + android:background="@color/divide" + android:divider="@null" + android:dividerHeight="6dp" + android:footerDividersEnabled="false" + android:scrollingCache="false" /> + android:layout_height="wrap_content" + android:layout_gravity="center" /> diff --git a/app/src/main/res/layout/fragment_maopao_list_item.xml b/app/src/main/res/layout/fragment_maopao_list_item.xml index f5ae6ce5a..dbcdb51eb 100755 --- a/app/src/main/res/layout/fragment_maopao_list_item.xml +++ b/app/src/main/res/layout/fragment_maopao_list_item.xml @@ -12,6 +12,13 @@ android:paddingLeft="@dimen/padding_12" android:paddingRight="@dimen/padding_12"> + + - - - - - - - + android:layout_height="match_parent" + android:background="@color/divide" + android:divider="@null" + android:dividerHeight="6dp" + android:footerDividersEnabled="false" /> > + android:layout_height="wrap_content" + app:showEmojiOnly="true" /> diff --git a/scrollanimationlibrary/src/main/java/com/twotoasters/jazzylistview/CompatListView.java b/scrollanimationlibrary/src/main/java/com/twotoasters/jazzylistview/CompatListView.java new file mode 100644 index 000000000..fc90936e7 --- /dev/null +++ b/scrollanimationlibrary/src/main/java/com/twotoasters/jazzylistview/CompatListView.java @@ -0,0 +1,148 @@ +package com.twotoasters.jazzylistview; + +/** + * Created by chenchao on 2016/12/13. + */ + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.NestedScrollingChild; +import android.support.v4.view.NestedScrollingChildHelper; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.widget.ListView; + +/** + * Created by mkishan on 9/27/2015. + */ +public class CompatListView extends ListView implements NestedScrollingChild { + private NestedScrollingChildHelper helper; + private int mLastY; + private final int[] mScrollOffset = new int[2]; + private final int[] mScrollConsumed = new int[2]; + private int mNestedOffsetY; + public CompatListView(Context context) { + super(context); + helper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); + } + + public CompatListView(Context context, AttributeSet attrs) { + super(context, attrs); + helper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); + } + + public CompatListView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + helper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public CompatListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + helper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); + } + + @Override + public void setNestedScrollingEnabled(boolean enabled) { + helper.setNestedScrollingEnabled(enabled); + } + + @Override + public boolean startNestedScroll(int axes) { + return helper.startNestedScroll(axes); + } + + @Override + public void stopNestedScroll() { + helper.stopNestedScroll(); + } + + @Override + public boolean hasNestedScrollingParent() { + return helper.hasNestedScrollingParent(); + } + + @Override + public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { + return helper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { + return helper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { + return helper.dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean dispatchNestedPreFling(float velocityX, float velocityY) { + return helper.dispatchNestedPreFling(velocityX, velocityY); + } + +// @Override +// public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { +// super.onNestedScroll(target, dxConsumed, dyUnconsumed, dxUnconsumed, dyConsumed); +// } + + @Override public boolean onTouchEvent(MotionEvent event) { + boolean rs = false; + final int action = MotionEventCompat.getActionMasked(event); + if (action == MotionEvent.ACTION_DOWN) { + mNestedOffsetY = 0; + } + int y = (int) event.getY(); + event.offsetLocation(0,mNestedOffsetY); + switch (action) { + case MotionEvent.ACTION_DOWN: + rs = super.onTouchEvent(event); + mLastY = y; + break; + case MotionEvent.ACTION_MOVE: + + int dy = mLastY - y; + int oldY = getScrollY(); + startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); + + if (dispatchNestedPreScroll(0, dy, mScrollConsumed, mScrollOffset)) { + dy -= mScrollConsumed[1]; + event.offsetLocation(0,-mScrollOffset[1]); + mNestedOffsetY += mScrollOffset[1]; + } + rs = super.onTouchEvent(event); + mLastY = y - mScrollOffset[1]; + if (dy < 0) { + int newScrollY = Math.max(0, oldY+dy); + dy -= newScrollY - oldY; + if (dispatchNestedScroll(0, newScrollY - dy, 0, dy, mScrollOffset)) { + event.offsetLocation(0,mScrollOffset[1]); + mNestedOffsetY += mScrollOffset[1]; + mLastY -= mScrollOffset[1]; + } + } + Log.d("dy", dy + ""); + Log.d("oldy", oldY+""); + Log.d("mlasty", mLastY+""); + stopNestedScroll(); + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + rs = super.onTouchEvent(event); +// mLastY = 0; +// mNestedOffsetY = 0; + stopNestedScroll(); + break; + } + return rs; + } +} \ No newline at end of file From c401f924e8e8ceb5c84f7c74a091e63c8103aa20 Mon Sep 17 00:00:00 2001 From: 8206503 <8206503@qq.com> Date: Wed, 14 Dec 2016 17:21:59 +0800 Subject: [PATCH 06/56] =?UTF-8?q?=E5=86=92=E6=B3=A1=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=94=B1=20listview=20=E6=94=B9=E4=B8=BA=20recyclerview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../maopao/MaopaoListBaseFragment.java | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java b/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java index d98362d45..40f5ec114 100644 --- a/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java +++ b/app/src/main/java/net/coding/program/maopao/MaopaoListBaseFragment.java @@ -2,7 +2,6 @@ import android.animation.Animator; import android.app.Activity; -import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -215,7 +214,7 @@ protected void initMaopaoListBaseFragmen() { mAdapter = new MyAdapter(mData, getShowAnimator()); listView.setAdapter(mAdapter); - ViewTreeObserver vto = listView.getViewTreeObserver(); + ViewTreeObserver vto = listView.mRecyclerView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { @@ -232,7 +231,7 @@ public void onGlobalLayout() { } else if (cal1 == 1) { int scrollResult = needScrollY + oldListHigh - listHeight; - listView.mRecyclerView.smoothScrollBy(scrollResult, 1); + listView.mRecyclerView.smoothScrollBy(0, scrollResult); needScrollY = 0; } @@ -241,16 +240,13 @@ public void onGlobalLayout() { } }); - listView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - int action = event.getAction(); - if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { - hideSoftkeyboard(); - } - - return false; + listView.mRecyclerView.setOnTouchListener((v, event) -> { + int action = event.getAction(); + if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { + hideSoftkeyboard(); } + + return false; }); // mEnterLayout = new EnterEmojiLayout(getActivity(), onClickSendText, EnterLayout.Type.TextOnly, EnterEmojiLayout.EmojiType.SmallOnly); @@ -327,8 +323,12 @@ protected void hideSoftkeyboard() { mEnterLayout.clearContent(); mEnterLayout.hideKeyboard(); mEnterLayout.hide(); - sendEvent(true); +// sendEvent(true); + sendEventDelay(true); + } + private void sendEventDelay(boolean show) { + mEnterLayout.postDelayed(() -> sendEvent(show), 500); } private void sendEvent(boolean show) { @@ -533,19 +533,13 @@ public void onClick(View v) { } }; - View.OnClickListener onClickDeleteMaopao = new View.OnClickListener() { - @Override - public void onClick(View v) { - final int maopaoId = (int) v.getTag(TAG_MAOPAO_ID); - showDialog("冒泡", "删除冒泡?", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String HOST_MAOPAO_DELETE = Global.HOST_API + "/tweet/%s"; - deleteNetwork(String.format(HOST_MAOPAO_DELETE, maopaoId), TAG_DELETE_MAOPAO, - -1, maopaoId); - } - }); - } + View.OnClickListener onClickDeleteMaopao = v -> { + final int maopaoId = (int) v.getTag(TAG_MAOPAO_ID); + showDialog("冒泡", "删除冒泡?", (dialog, which) -> { + String HOST_MAOPAO_DELETE = Global.HOST_API + "/tweet/%s"; + deleteNetwork(String.format(HOST_MAOPAO_DELETE, maopaoId), TAG_DELETE_MAOPAO, + -1, maopaoId); + }); }; public static void popReward(final BaseActivity activity, View v, final UltimateViewAdapter adapter) { @@ -660,7 +654,6 @@ public void onSuccess(int statusCode, Header[] headers, JSONObject response) { } else { activity.showErrorMsg(code, response); } - } @Override From 32c49a05f9d3519fa293a91c4fee803ab7d96803 Mon Sep 17 00:00:00 2001 From: 8206503 <8206503@qq.com> Date: Wed, 14 Dec 2016 18:22:13 +0800 Subject: [PATCH 07/56] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=20"=E5=8A=A0=E8=BD=BD=E4=B8=AD"=20=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../program/common/util/BlankViewHelp.java | 43 +++++++++++++++++ .../project/detail/TaskListFragment.java | 27 +++-------- .../net/coding/program/task/TaskFragment.java | 20 -------- .../main/res/layout/fragment_task_list.xml | 2 +- app/src/main/res/layout/view_blank_common.xml | 47 +++++++++++++++++++ 5 files changed, 98 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/net/coding/program/common/util/BlankViewHelp.java create mode 100755 app/src/main/res/layout/view_blank_common.xml diff --git a/app/src/main/java/net/coding/program/common/util/BlankViewHelp.java b/app/src/main/java/net/coding/program/common/util/BlankViewHelp.java new file mode 100644 index 000000000..5778d5f77 --- /dev/null +++ b/app/src/main/java/net/coding/program/common/util/BlankViewHelp.java @@ -0,0 +1,43 @@ +package net.coding.program.common.util; + +import android.view.View; + +import net.coding.program.R; +import net.coding.program.common.BlankViewDisplay; + +/** + * Created by chenchao on 2016/12/14. + * 与 view_blank_common 配套使用 + */ + +public class BlankViewHelp extends BlankViewDisplay { + + public static void setBlankLoading(View v, boolean show) { + showLoading(v, show); + if (show) { + v.setVisibility(View.VISIBLE); + } else { + v.setVisibility(View.GONE); + } + } + + public static void setBlank(int itemSize, Object fragment, boolean request, View v, View.OnClickListener onClick) { + showLoading(v, false); + BlankViewDisplay.setBlank(itemSize, fragment, request, v, onClick); + } + + public static void setBlank(int itemSize, Object fragment, boolean request, View v, View.OnClickListener onClick, String tipString) { + showLoading(v, false); + BlankViewDisplay.setBlank(itemSize, fragment, request, v, onClick, tipString); + } + + private static void showLoading(View v, boolean show) { + int loadingVisable = show ? View.VISIBLE : View.GONE; + int otherVisable = show ? View.GONE : View.VISIBLE; + v.findViewById(R.id.icon).setVisibility(otherVisable); + v.findViewById(R.id.message).setVisibility(otherVisable); + v.findViewById(R.id.btnRetry).setVisibility(otherVisable); + v.findViewById(R.id.loadingLayout).setVisibility(loadingVisable); + } + +} diff --git a/app/src/main/java/net/coding/program/project/detail/TaskListFragment.java b/app/src/main/java/net/coding/program/project/detail/TaskListFragment.java index f042178fe..548ec4d8f 100755 --- a/app/src/main/java/net/coding/program/project/detail/TaskListFragment.java +++ b/app/src/main/java/net/coding/program/project/detail/TaskListFragment.java @@ -3,7 +3,6 @@ import android.content.Intent; import android.graphics.PorterDuff; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -23,11 +22,11 @@ import net.coding.program.common.ListModify; import net.coding.program.common.network.RefreshBaseFragment; import net.coding.program.common.umeng.UmengEvent; +import net.coding.program.common.util.BlankViewHelp; import net.coding.program.common.widget.FlowLabelLayout; import net.coding.program.model.AccountInfo; import net.coding.program.model.ProjectObject; import net.coding.program.model.TaskObject; -import net.coding.program.task.TaskFragment; import net.coding.program.task.TaskListUpdate; import net.coding.program.task.add.TaskAddActivity_; @@ -45,7 +44,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -import java.util.WeakHashMap; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; @@ -87,8 +85,9 @@ public class TaskListFragment extends RefreshBaseFragment implements TaskListUpd TestBaseAdapter mAdapter; String mToday = ""; String mTomorrow = ""; - WeakHashMap mOriginalViewHeightPool = new WeakHashMap<>(); + private net.coding.program.task.TaskListParentUpdate mParent; + private View listFooter; public void setParent(net.coding.program.task.TaskListParentUpdate parent) { @@ -176,6 +175,7 @@ protected void initTaskListFragment() { listView.setAreHeadersSticky(false); listView.addFooterView(listFooter, null, false); listView.setAdapter(mAdapter); + BlankViewHelp.setBlankLoading(blankLayout, true); updateFootStyle(); @@ -199,10 +199,7 @@ protected void initTaskListFragment() { loadData(); - Fragment parentFragment = getParentFragment(); - if (parentFragment instanceof TaskFragment) { - ((TaskFragment) parentFragment).showLoading(true); - } + BlankViewHelp.setBlankLoading(blankLayout, true); } private void updateFootStyle() { @@ -246,11 +243,8 @@ protected void initSetting() { public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(urlAll)) { setRefreshing(false); - Fragment parentFragment = getParentFragment(); - if (parentFragment instanceof TaskFragment) { - ((TaskFragment) parentFragment).showLoading(false); - } - + BlankViewHelp.setBlankLoading(blankLayout, false); + if (code == 0) { if (mUpdateAll) { mData.clear(); @@ -324,16 +318,9 @@ public void parseJson(int code, JSONObject respanse, String tag, int pos, Object TaskObject.SingleTask task = param.mTask; task.status = param.mStatus; -// if (mParent != null) { -// mNeedUpdate = false; -// mParent.taskListParentUpdate(); -// } - } else { Toast.makeText(getActivity(), "修改任务失败", Toast.LENGTH_SHORT).show(); } - -// mAdapter.notifyDataSetChanged(); } } diff --git a/app/src/main/java/net/coding/program/task/TaskFragment.java b/app/src/main/java/net/coding/program/task/TaskFragment.java index 9cabc529d..6af980060 100755 --- a/app/src/main/java/net/coding/program/task/TaskFragment.java +++ b/app/src/main/java/net/coding/program/task/TaskFragment.java @@ -5,7 +5,6 @@ import android.support.v4.app.Fragment; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; -import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; @@ -81,23 +80,6 @@ void initTaskFragment() { public void onRefresh() { } - private void initListData() { - mAllData.clear(); - mData.clear(); - mData.add(new ProjectObject()); - - try { - JSONObject json = AccountInfo.getGetRequestCacheData(getActivity(), host); - jsonToAllData(json.optJSONArray("list")); - - JSONArray jsonArray = AccountInfo.getGetRequestCacheListData(getActivity(), urlTaskCount); - jsonToData(jsonArray); - - } catch (Exception e) { - Global.errorLog(e); - } - } - @Override public void parseJson(int code, JSONObject respanse, String tag, int pos, Object data) throws JSONException { if (tag.equals(host)) { @@ -216,8 +198,6 @@ public Object instantiateItem(ViewGroup container, int position) { TaskListFragment fragment = (TaskListFragment) super.instantiateItem(container, position); fragment.setParent(TaskFragment.this); - Log.d("", "init p " + position); - return fragment; } diff --git a/app/src/main/res/layout/fragment_task_list.xml b/app/src/main/res/layout/fragment_task_list.xml index 75d1a04b2..5679befbc 100755 --- a/app/src/main/res/layout/fragment_task_list.xml +++ b/app/src/main/res/layout/fragment_task_list.xml @@ -36,7 +36,7 @@ diff --git a/app/src/main/res/layout/view_blank_common.xml b/app/src/main/res/layout/view_blank_common.xml new file mode 100755 index 000000000..99349bb38 --- /dev/null +++ b/app/src/main/res/layout/view_blank_common.xml @@ -0,0 +1,47 @@ + + + + + + + +