diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml
new file mode 100644
index 0000000..3efe9d6
--- /dev/null
+++ b/.idea/markdown-navigator.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index afe245c..7158618 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,74 +3,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/hourglass.json b/app/src/main/assets/hourglass.json
new file mode 100644
index 0000000..8f54d57
--- /dev/null
+++ b/app/src/main/assets/hourglass.json
@@ -0,0 +1 @@
+{"v":"5.0.3","fr":24,"ip":0,"op":46,"w":1280,"h":720,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[719.269,437.649,0],"ix":2},"a":{"a":0,"k":[81.853,109.045,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-15.782,6.528],[0,-19.879]],"o":[[0,0],[0,0],[0,-19.879],[15.81,6.551],[0,0]],"v":[[49.861,99.744],[-49.855,99.744],[-49.855,49.873],[-0.011,4.538],[49.861,49.873]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,19.879],[0,0],[0,0],[0,0],[15.787,-6.528]],"o":[[0,0],[0,0],[0,0],[0,19.901],[-15.782,-6.528]],"v":[[-49.855,-49.873],[-49.855,-99.717],[49.861,-99.717],[49.861,-49.873],[-0.011,-4.54]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[16.932,7.99],[0,23.823],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-16.938,-7.99],[0,-23.795],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-23.795],[16.932,-7.99],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,23.823],[-16.938,7.99],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[81.6,99.744],[58.939,99.744],[58.939,49.873],[9.067,-0.001],[58.939,-49.873],[58.939,-99.717],[81.6,-99.717],[81.6,-108.795],[-81.6,-108.795],[-81.6,-99.717],[-58.933,-99.717],[-58.933,-49.873],[-9.061,-0.001],[-58.933,49.873],[-58.933,99.744],[-81.6,99.744],[-81.6,108.795],[81.6,108.795]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.999999820485,0.999999760646,0.999999820485,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.85,109.045],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":4}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":32,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 10 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":25,"s":[719.431,537.721,0],"e":[719.431,537,0],"to":[0,-0.90864837169647,0],"ti":[0,1.77124309539795,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":32,"s":[719.431,537,0],"e":[719.431,537,0],"to":[0,-0.35245817899704,0],"ti":[0,0.40625029802322,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":36,"s":[719.431,537,0],"e":[719.431,537.722,0],"to":[0,-0.05667289346457,0],"ti":[0,0.15397024154663,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":37,"s":[719.431,537.722,0],"e":[719.431,513.721,0],"to":[0,-2.94422245025635,0],"ti":[0,0.72574734687805,0]},{"t":41}],"ix":2},"a":{"a":0,"k":[61.419,0.91,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,0.39,100],"e":[100,7.248,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":4,"s":[100,7.248,100],"e":[100,65.273,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":9,"s":[100,65.273,100],"e":[102,103.253,100]},{"t":24}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.218,1.013],[0,0],[0,0],[0,0],[0,0],[0,0],[14.228,-18.623],[8.547,0.072],[0,0],[0.008,0.001],[0.037,0.001],[0,0],[0.001,0],[0,0],[0.203,0.01],[0,0],[0.028,0.007],[12.494,16.755]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[6.458,1.052],[-12.475,16.329],[0,0],[-0.007,0],[-0.037,-0.001],[0,0],[-0.001,-0.001],[0,0],[-0.196,0.005],[0,0],[-0.028,-0.002],[-9.007,-0.572],[-13.433,-18.017]],"v":[[-54.95,-35.66],[-2.777,-35.66],[-2.777,-35.659],[2.537,-35.659],[2.537,-35.66],[54.71,-35.66],[41.714,8.278],[0.017,35.588],[0.017,35.595],[-0.005,35.589],[-0.12,35.593],[-0.119,35.556],[-0.121,35.555],[-0.12,35.593],[-0.722,35.574],[-0.722,35.595],[-0.806,35.571],[-42.953,5.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.418,35.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 9 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":12,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":16}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":24,"st":12,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 8 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":11,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":15}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":23,"st":11,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":10,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":14}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":22,"st":10,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 6 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":7,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":11}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7,"op":19,"st":7,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":5,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":9}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":17,"st":5,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":2,"s":[717.751,446.954,0],"e":[717.751,529.954,0],"to":[0,13.8333330154419,0],"ti":[0,-13.8333330154419,0]},{"t":6}],"ix":2},"a":{"a":0,"k":[3.594,3.594,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.839,0],[0,-1.839],[-1.857,0],[0,1.84]],"o":[[-1.857,0],[0,1.84],[1.839,0],[0,-1.839]],"v":[[0,-3.345],[-3.345,0],[0,3.345],[3.345,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.594,3.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":2,"op":14,"st":2,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[718.431,432.721,0],"ix":2},"a":{"a":0,"k":[61.419,69.91,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":0,"s":[100,100,100],"e":[88.882,63.763,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":10,"s":[88.882,63.763,100],"e":[84.435,49.34,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[84.435,49.34,100],"e":[65.373,33.486,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[65.373,33.486,100],"e":[39.758,11.315,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":24,"s":[39.758,11.315,100],"e":[30.803,-0.129,100]},{"t":27}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.218,1.013],[0,0],[0,0],[0,0],[0,0],[0,0],[14.228,-18.623],[8.547,0.072],[0,0],[0.008,0.001],[0.037,0.001],[0,0],[0.001,0],[0,0],[0.203,0.01],[0,0],[0.028,0.007],[12.494,16.755]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[6.458,1.052],[-12.475,16.329],[0,0],[-0.007,0],[-0.037,-0.001],[0,0],[-0.001,-0.001],[0,0],[-0.196,0.005],[0,0],[-0.028,-0.002],[-9.007,-0.572],[-13.433,-18.017]],"v":[[-54.95,-35.66],[-2.777,-35.66],[-2.777,-35.659],[2.537,-35.659],[2.537,-35.66],[54.71,-35.66],[41.714,8.278],[0.017,35.588],[0.017,35.595],[-0.005,35.589],[-0.12,35.593],[-0.119,35.556],[-0.121,35.555],[-0.12,35.593],[-0.722,35.574],[-0.722,35.595],[-0.806,35.571],[-42.953,5.945]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.418,35.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":0,"nm":"egg timer","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":34,"s":[0],"e":[180]},{"t":40}],"ix":10},"p":{"a":0,"k":[628,388,0],"ix":2},"a":{"a":0,"k":[719,437,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1400,"h":980,"ip":0,"op":47,"st":0,"bm":0}]}
\ No newline at end of file
diff --git a/app/src/main/java/com/refreshDemo/CustomFooter.java b/app/src/main/java/com/refreshDemo/CustomFooter.java
new file mode 100644
index 0000000..e1de33a
--- /dev/null
+++ b/app/src/main/java/com/refreshDemo/CustomFooter.java
@@ -0,0 +1,37 @@
+package com.refreshDemo;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.GoRefresh.DefaultFooterView;
+
+/**
+ * Created by Administrator on 2017/11/24 0024.
+ * 这里继承了DefaultFooterView 也可直接实现IFooterView接口
+ */
+
+public class CustomFooter extends DefaultFooterView {
+ private LayoutInflater inflater;
+ public CustomFooter(Context context) {
+ super(context);
+ inflater=LayoutInflater.from(context);
+ }
+
+ @Override
+ public View getLoadingView() {
+ return inflater.inflate(R.layout.lottle_loading_animation_footer,null);
+ }
+
+ @Override
+ public View getFinishView() {
+ return super.getFinishView();
+ }
+
+ @Override
+ public View getFailureView() {
+ return super.getFailureView();
+ }
+
+
+}
diff --git a/app/src/main/java/com/refreshDemo/CustomHeader.java b/app/src/main/java/com/refreshDemo/CustomHeader.java
index a1d5562..5564f1f 100644
--- a/app/src/main/java/com/refreshDemo/CustomHeader.java
+++ b/app/src/main/java/com/refreshDemo/CustomHeader.java
@@ -7,7 +7,7 @@
import android.widget.ImageView;
import android.widget.TextView;
-import com.GoRefresh.IHeaderView;
+import com.GoRefresh.interfaces.IHeaderView;
/**
* Created by Administrator on 2017/11/5 0005.
@@ -29,7 +29,9 @@ public CustomHeader(Context context) {
icon.setImageResource(R.drawable.arrow);
icon.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
- mTextView.setText("下拉刷新");
+ // progressBar.setColors(R.color.red,R.color.colorAccent,R.color.red_comm_click,R.color.colorPrimary,R.color.defaultbg);
+ progressBar.setColor(R.color.colorAccent);
+ mTextView.setText(R.string.pulltorefresh);
}
@Override
@@ -49,10 +51,10 @@ public void onReady() {
@Override
public void onChange(boolean isPull) {
if(isPull){//下拉经过临界点
- mTextView.setText("松手刷新");
+ mTextView.setText(R.string.release);
arrowUp();
}else{ //上拉经过临界点
- mTextView.setText("下拉刷新");
+ mTextView.setText(R.string.pulltorefresh);
arrowDown();
}
@@ -63,7 +65,7 @@ public void onRefresh() {
progressBar.setVisibility(View.VISIBLE);
progressBar.start();
icon.setVisibility(View.GONE);
- mTextView.setText("正在加载");
+ mTextView.setText(R.string.loading);
}
@@ -86,7 +88,7 @@ private void arrowUp(){
private void reset() {
- mTextView.setText("下拉刷新");
+ mTextView.setText(R.string.pulltorefresh);
progressBar.setVisibility(View.GONE);
progressBar.stop();
icon.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/com/refreshDemo/ListViewActivity.java b/app/src/main/java/com/refreshDemo/ListViewActivity.java
index df7b192..549271c 100644
--- a/app/src/main/java/com/refreshDemo/ListViewActivity.java
+++ b/app/src/main/java/com/refreshDemo/ListViewActivity.java
@@ -14,8 +14,8 @@
import android.widget.TextView;
import com.GoRefresh.GoRefreshLayout;
-import com.GoRefresh.LoadmoreListener;
-import com.GoRefresh.RefreshListener;
+import com.GoRefresh.interfaces.LoadMoreListener;
+import com.GoRefresh.interfaces.RefreshListener;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
@@ -44,11 +44,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
}
listView.setAdapter(adapter);
+ CustomFooter customFooter = new CustomFooter(this);
+ goRefreshLayout.setFooterView(customFooter);
+
goRefreshLayout.setLoadingView(R.layout.footer_loading);
goRefreshLayout.setErrorViewWithRetry(R.layout.footerview_error, R.id.tips);
//下拉刷新
- goRefreshLayout.setOnRefreshListener( new RefreshListener() {
+ goRefreshLayout.setOnRefreshListener( new RefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@@ -65,7 +68,7 @@ public void run() {
});
goRefreshLayout.startRefresh();
//上拉加载
- goRefreshLayout.setOnLoadmoreListener(new LoadmoreListener() {
+ goRefreshLayout.setOnLoadMoreListener(new LoadMoreListener() {
@Override
public void onLoadmore() {
new Handler().postDelayed(new Runnable() {
diff --git a/app/src/main/java/com/refreshDemo/LottieActivity.java b/app/src/main/java/com/refreshDemo/LottieActivity.java
index 8d42f35..ae3ea3a 100644
--- a/app/src/main/java/com/refreshDemo/LottieActivity.java
+++ b/app/src/main/java/com/refreshDemo/LottieActivity.java
@@ -19,8 +19,9 @@
import com.GoRefesh_core.LottieView;
import com.GoRefresh.GoRefreshLayout;
-import com.GoRefresh.LoadmoreListener;
-import com.GoRefresh.RefreshListener;
+import com.GoRefresh.interfaces.LoadMoreListener;
+import com.GoRefresh.interfaces.RefreshListener;
+import com.GoRefresh.RvLoadMoreWrapper;
import com.airbnb.lottie.LottieAnimationView;
import com.bumptech.glide.Glide;
@@ -38,7 +39,7 @@ public class LottieActivity extends AppCompatActivity {
private List list = new ArrayList<>();
private final int COUNT = 10;
private LottieView lottieView;
-
+ private RvLoadMoreWrapper rvLoadMoreWrapper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -50,13 +51,10 @@ protected void onCreate(Bundle savedInstanceState) {
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(gridLayoutManager);
adapter = new MyAdapter();
- recyclerView.setAdapter(adapter);
- addData();
lottieView = new LottieView(this, R.layout.lottie_gift, R.id.animation_view);
lottieView.setPullOriginProgress(1f);
refreshLayout.setHeaderView(lottieView);
-
refreshLayout.setOnRefreshListener(new RefreshListener() {
@Override
public void onRefresh() {
@@ -68,8 +66,13 @@ public void run() {
}, 4000);
}
});
+
refreshLayout.setHasFooter(true);
- refreshLayout.setOnLoadmoreListener(new LoadmoreListener() {
+ rvLoadMoreWrapper=refreshLayout.buildRvLoadMoreAdapter(adapter);
+ rvLoadMoreWrapper.setLoadingView(R.layout.lottle_loading_animation_footer);
+ recyclerView.setAdapter(rvLoadMoreWrapper);
+
+ refreshLayout.setOnLoadMoreListener(new LoadMoreListener() {
@Override
public void onLoadmore() {
new Handler().postDelayed(new Runnable() {
@@ -81,11 +84,13 @@ public void run() {
}, 2000);
}
});
+
+ addData();
}
private void addData() {
DataSource.addData(list);
- adapter.notifyItemRangeChanged(list.size() - COUNT, list.size());
+ rvLoadMoreWrapper.notifyItemRangeChanged(list.size() - COUNT, list.size());
}
@@ -108,7 +113,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
lottieView = new MyLottileView(this, R.layout.lottie_oval, R.id.animation_view);
break;
case R.id.item3: //截取指定部分动画
- lottieView = new LottieView(this, R.layout.lottie_loading, R.id.animation_view);
+ lottieView = new MyLottileView(this, R.layout.lottie_loading, R.id.animation_view);
lottieView.setPullProgressRange(0f, 0.7f); //设置下拉过程中动画变化范围(0f-1f)默认无动画
lottieView.setRefreshProgressRange(0.1f, 0.66f); //设置刷新过程中动画变化范围(0f-1f) 默认0f-1f
lottieView.setRefreshDuration(1200); //动画时长
@@ -131,7 +136,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.item6:
lottieView = new LottieView(this, R.layout.lottie_jump_loader, R.id.animation_view);
break;
-
case R.id.item7:
lottieView = new LottieView(this, R.layout.lottie_simple, R.id.animation_view);
lottieView.setPullProgressRange(0f, 1f);
@@ -151,7 +155,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
lottieView.setRefreshProgressRange(0f, 0.5f);
lottieView.setPullOriginProgress(0.45f);
break;
-
}
refreshLayout.setHeaderView(lottieView);
return true;
diff --git a/app/src/main/java/com/refreshDemo/MulRingProgressBar.java b/app/src/main/java/com/refreshDemo/MulRingProgressBar.java
index 685a1cf..0feb2ec 100644
--- a/app/src/main/java/com/refreshDemo/MulRingProgressBar.java
+++ b/app/src/main/java/com/refreshDemo/MulRingProgressBar.java
@@ -6,8 +6,11 @@
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.support.annotation.ColorRes;
+import android.support.v4.content.ContextCompat;
import android.support.v4.view.animation.PathInterpolatorCompat;
import android.util.AttributeSet;
+import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Interpolator;
@@ -36,9 +39,11 @@ public class MulRingProgressBar extends View {
private int mDuration = DEFAULT_DURATION;
private int mCount = DEFAULT_COUNT;
private float increment = DEFAULT_INCREMENT;
-
private Paint mPaint;
private List mList;
+ private Context context;
+ private int delay = 100;
+ private boolean canRun;
public MulRingProgressBar(Context context) {
this(context, null);
@@ -50,7 +55,7 @@ public MulRingProgressBar(Context context, AttributeSet attrs) {
public MulRingProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
-
+ this.context = context;
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MulRingProgressBar);
mBallColor = typedArray.getColor(R.styleable.MulRingProgressBar_progress_ball_color, mBallColor);
mRingColor = typedArray.getColor(R.styleable.MulRingProgressBar_progress_ring_color, mRingColor);
@@ -65,9 +70,10 @@ public MulRingProgressBar(Context context, AttributeSet attrs, int defStyleAttr)
for (int i = mCount; i > 0; i--) {
ProgressBean pb = new ProgressBean();
- pb.setAnimator(initAnimatior(pb));
pb.setmCurrentAngle(0);
pb.setmBallRadius(mBallRadius + increment * i);
+ pb.setDuration(mDuration - (mCount - i) * delay);
+ pb.setAnimator(initAnimatior(pb));
mList.add(pb);
}
@@ -80,25 +86,23 @@ public MulRingProgressBar(Context context, AttributeSet attrs, int defStyleAttr)
private ValueAnimator initAnimatior(final ProgressBean pb) {
- Interpolator pathInterpolatorCompat = PathInterpolatorCompat.create(0.8f, 0f, 0.2f, 1f);
+ Interpolator pathInterpolatorCompat = PathInterpolatorCompat.create(0.7f, 0f, 0.3f, 1f);
ValueAnimator mAnimator = ValueAnimator.ofInt(0, 359);
- mAnimator.setDuration(mDuration);
- mAnimator.setRepeatCount(-1);
+ mAnimator.setDuration(pb.getDuration());
mAnimator.setInterpolator(pathInterpolatorCompat);
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
+ Log.d("dur", animation.getAnimatedValue() + "====" + pb.getmBallRadius());
pb.setmCurrentAngle((int) animation.getAnimatedValue());
invalidate();
}
});
return mAnimator;
-
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
int height = measurehight(heightMeasureSpec);
int width = measurewidth(widthMeasureSpec);
setMeasuredDimension(width, height);
@@ -140,7 +144,7 @@ private int measurehight(int heightMeasureSpec) {
@Override
protected void onDraw(Canvas canvas) {
- for (int i = 0; i < mCount; i++) {
+ for (int i = mCount - 1; i >= 0; i--) {
drawBall(canvas, mList.get(i).getmCurrentAngle() * 2 * Math.PI / 360, i);
}
}
@@ -156,52 +160,96 @@ private void drawBall(Canvas canvas, double angle, int i) {
// 根据当前角度获取x、y坐标点
float x = (float) (getWidth() / 2 + mRingRadius * Math.sin(angle));
float y = (float) (getHeight() / 2 - mRingRadius * Math.cos(angle));
-
+ if (mList.get(i).getmBallColor() == -1) {
+ mPaint.setColor(mBallColor);
+ } else {
+ mPaint.setColor(mList.get(i).getmBallColor());
+ }
// 绘制圆
canvas.drawCircle(x, y, mList.get(i).getmBallRadius(), mPaint);
}
- public void startAnimation() {
-
- Runnable runnable = new Runnable() {
-
- @Override
- public void run() {
- try {
- if (i < mCount) {
- mList.get(i).getAnimator().start();
- postDelayed(this, 60);
- i = i + 1;
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ Runnable runnable1 = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ if (i < mCount) {
+ mList.get(i).getAnimator().start();
+ postDelayed(this, delay);
+ i = i + 1;
+ Log.d("dur", "开始donghua");
}
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
- };
- postDelayed(runnable, 0);
+ }
+ };
+ private void startAnimation() {
+ i = 0;
+ postDelayed(runnable1, 0);
}
+
private void stopAnimation() {
for (int i = 0; i < mCount; i++) {
mList.get(i).getAnimator().end();
+ Log.d("dur", "tingzhi" + i);
}
i = 0;
}
+ public void setColor(@ColorRes int colorResIds) {
+ for (int i = 0; i < mList.size(); i++) {
+ mList.get(i).setmBallColor( ContextCompat.getColor(context, colorResIds));
+ }
+ }
+
+ public void setColors(@ColorRes int... colorResIds) {
+ int colorsCount = Math.min(colorResIds.length, mCount);
+ int[] colorRes = new int[colorsCount];
+ for (int i = 0; i < colorRes.length; i++) {
+ colorRes[i] = ContextCompat.getColor(context, colorResIds[i]);
+ }
+ setColorSchemeColors(colorRes);
+ }
+
+ private void setColorSchemeColors(int[] colorRes) {
+ for (int i = 0; i < colorRes.length; i++) {
+ mList.get(i).setmBallColor(colorRes[i]);
+ }
+ }
+
+ private Runnable runnable2 = new Runnable() {
+ @Override
+ public void run() {
+ if (canRun) {
+ startAnimation();
+ Log.d("dur", "开始");
+ postDelayed(this, mDuration);
+ }
+ }
+ };
public void start() {
- startAnimation();
+ canRun = true;
+ postDelayed(runnable2, 0);
}
public void stop() {
+ canRun = false;
+ removeCallbacks(runnable1);
+ removeCallbacks(runnable2);
stopAnimation();
+ Log.d("dur", "完成");
}
//销毁页面时停止动画
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
+ removeCallbacks(runnable1);
+ removeCallbacks(runnable2);
stopAnimation();
}
@@ -212,14 +260,31 @@ private int dp2px(int dpVal) {
private class ProgressBean {
private Animator animator;
- private Paint paint;
+ private int duration;
private int mCurrentAngle;
private float mBallRadius;
+ private int mBallColor = -1;
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public void setDuration(int duration) {
+ this.duration = duration;
+ }
public Animator getAnimator() {
return animator;
}
+ public int getmBallColor() {
+ return mBallColor;
+ }
+
+ public void setmBallColor(int mBallColor) {
+ this.mBallColor = mBallColor;
+ }
+
public void setAnimator(Animator animator) {
this.animator = animator;
}
diff --git a/app/src/main/java/com/refreshDemo/MyLottileView.java b/app/src/main/java/com/refreshDemo/MyLottileView.java
index cd055d4..4c04627 100644
--- a/app/src/main/java/com/refreshDemo/MyLottileView.java
+++ b/app/src/main/java/com/refreshDemo/MyLottileView.java
@@ -16,6 +16,7 @@ public class MyLottileView extends LottieView {
public MyLottileView(Context context, int layoutId, int lottieViewId) {
super(context, layoutId, lottieViewId);
textView = getView().findViewById(R.id.tv);
+ textView.setText(R.string.pulltorefresh);
}
@Override
@@ -35,14 +36,14 @@ public void onChange(boolean isPull) {
if (isPull) {
textView.setText(R.string.release);
} else {
- textView.setText(R.string.pull);
+ textView.setText(R.string.pulltorefresh);
}
}
@Override
public void onRefresh() {
super.onRefresh();
- textView.setText(R.string.refrshing);
+ textView.setText(R.string.loading);
}
@Override
@@ -53,6 +54,6 @@ public void onRefreshFinish() {
@Override
public void onBackFinish() {
super.onBackFinish();
- textView.setText(R.string.pull);
+ textView.setText(R.string.pulltorefresh);
}
}
diff --git a/app/src/main/java/com/refreshDemo/RecyclerViewActivity.java b/app/src/main/java/com/refreshDemo/RecyclerViewActivity.java
index aa6b6e0..9cb06c0 100644
--- a/app/src/main/java/com/refreshDemo/RecyclerViewActivity.java
+++ b/app/src/main/java/com/refreshDemo/RecyclerViewActivity.java
@@ -3,8 +3,8 @@
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -13,8 +13,9 @@
import com.GoRefesh_core.LottieView;
import com.GoRefresh.GoRefreshLayout;
-import com.GoRefresh.LoadmoreListener;
-import com.GoRefresh.RefreshListener;
+import com.GoRefresh.RvLoadMoreWrapper;
+import com.GoRefresh.interfaces.LoadMoreListener;
+import com.GoRefresh.interfaces.RefreshListener;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
@@ -32,49 +33,69 @@ public class RecyclerViewActivity extends AppCompatActivity {
private final int COUNT = 10;
private LottieView lottieView;
private int page = 1;
-
+ private RvLoadMoreWrapper rvLoadMoreWrapper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
refreshLayout = this.findViewById(R.id.layout);
recyclerView = this.findViewById(R.id.rv);
- LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
- // StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
+ //LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
// GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
- recyclerView.setLayoutManager(linearLayoutManager);
+ recyclerView.setLayoutManager(staggeredGridLayoutManager);
adapter = new MyAdapter();
- recyclerView.setAdapter(adapter);
- addData();
+
+ //自定义header
CustomHeader customHeader = new CustomHeader(this);
refreshLayout.setHeaderView(customHeader);
+
+ //需要上拉刷新必须设置
refreshLayout.setHasFooter(true);
+
+
+ //自定义footer
+ CustomFooter customFooter = new CustomFooter(this);
+
+ //设置footerview方式1 直接设置
+ refreshLayout.setFooterView(customFooter);
+ //只设置加载状态的footerview
+ // refreshLayout.setLoadingView(R.layout.lottle_loading_animation_footer);
+
+ //上拉加载通过包装adapter实现 通过此方法获得包装后的adapter
+ rvLoadMoreWrapper=refreshLayout.buildRvLoadMoreAdapter(adapter);
+
+ //设置footerview方式2 通过包装后的adapter设置
+ rvLoadMoreWrapper.setFooterView(customFooter);
+
+ //只设置加载状态的footerview
+ // rvLoadMoreWrapper.setLoadingView(R.layout.lottle_loading_animation_footer);
+
+ recyclerView.setAdapter(rvLoadMoreWrapper);
+
+
refreshLayout.setOnRefreshListener(new RefreshListener() {
@Override
public void onRefresh() {
- adapter.notifyDataSetChanged();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
- adapter.notifyDataSetChanged();
refreshLayout.finishRefresh();
}
- }, 4000);
+ }, 2000);
}
});
- refreshLayout.setDurationFooterVisiable(200);
- refreshLayout.setDurationFooterHidden(200);
- refreshLayout.setOnLoadmoreListener(new LoadmoreListener() {
+
+ refreshLayout.setOnLoadMoreListener(new LoadMoreListener() {
@Override
public void onLoadmore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
-
page++;
if (page == 3) {
refreshLayout.finishLoadmoreWithError();
- page++;
+ return;
}
if (page == 4) {
refreshLayout.finishLoadmoreWithNoData();
@@ -88,12 +109,21 @@ public void run() {
}, 2000);
}
});
+// rvLoadMoreWrapper.setLoadMoreListener(new LoadMoreListener() {
+// @Override
+// public void onLoadmore() {
+//
+// }
+// });
+
+ //自动刷新
refreshLayout.startRefresh();
+ addData();
}
private void addData() {
DataSource.addData(list);
- adapter.notifyItemRangeChanged(list.size() - COUNT, list.size());
+ rvLoadMoreWrapper.notifyItemRangeChanged(list.size() - COUNT, list.size());
}
@@ -106,9 +136,8 @@ public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@Override
public void onBindViewHolder(MyHolder holder, final int position) {
Glide.with(holder.itemView.getContext()).load(list.get(position)).crossFade().into(holder.imageView);
-// int randomheight = (int) (1 + Math.random() * 600);
-// holder.itemView.getLayoutParams().height= randomheight;
-// holder.textView.setText(""+position);
+ int randomheight = (int) (400+ Math.random() * 200);
+ holder.imageView.getLayoutParams().height= randomheight;
// holder.itemView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
diff --git a/app/src/main/java/com/refreshDemo/ScrollerViewActivity.java b/app/src/main/java/com/refreshDemo/ScrollerViewActivity.java
index 70e79d2..44dd1a7 100644
--- a/app/src/main/java/com/refreshDemo/ScrollerViewActivity.java
+++ b/app/src/main/java/com/refreshDemo/ScrollerViewActivity.java
@@ -1,12 +1,11 @@
package com.refreshDemo;
-import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import com.GoRefresh.GoRefreshLayout;
-import com.GoRefresh.RefreshListener;
+import com.GoRefresh.interfaces.RefreshListener;
import com.GoRefresh.googleLayout.GoogleLayout;
/**
@@ -16,7 +15,6 @@
public class ScrollerViewActivity extends AppCompatActivity {
GoRefreshLayout goRefreshLayout;
- @SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -27,7 +25,6 @@ protected void onCreate(Bundle savedInstanceState) {
googleLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimaryDark);
goRefreshLayout.setFixedContent(true);
goRefreshLayout.setHasFooter(true);
- goRefreshLayout.setDurationFooterHidden(200 );
goRefreshLayout.setOnRefreshListener(new RefreshListener() {
@Override
public void onRefresh() {
diff --git a/app/src/main/java/com/refreshDemo/WebViewActivity.java b/app/src/main/java/com/refreshDemo/WebViewActivity.java
index 19de8ff..776c827 100644
--- a/app/src/main/java/com/refreshDemo/WebViewActivity.java
+++ b/app/src/main/java/com/refreshDemo/WebViewActivity.java
@@ -2,12 +2,15 @@
import android.annotation.SuppressLint;
import android.os.Bundle;
+import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
+import android.webkit.WebViewClient;
import android.widget.ListView;
import com.GoRefresh.GoRefreshLayout;
+import com.GoRefresh.interfaces.RefreshListener;
import com.GoRefresh.googleLayout.GoogleLayout;
/**
@@ -17,20 +20,38 @@
public class WebViewActivity extends AppCompatActivity {
ListView listview;
SwipeRefreshLayout swipeRefreshLayout;
- GoRefreshLayout layout;
+ GoRefreshLayout refreshlayout;
WebView mWebView;
+ Handler handler=new Handler();
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
- layout = (GoRefreshLayout) this.findViewById(R.id.cydRefreshLayout);
+ refreshlayout = (GoRefreshLayout) this.findViewById(R.id.cydRefreshLayout);
GoogleLayout googleLayout = new GoogleLayout(this);
- layout.setHeaderView(googleLayout);
+ refreshlayout.setHeaderView(googleLayout);
googleLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimaryDark);
mWebView= (WebView) this.findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.loadUrl("https://www.baidu.com");
-
+ refreshlayout.startRefresh();
+ refreshlayout.setOnRefreshListener(new RefreshListener() {
+ @Override
+ public void onRefresh() {
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ mWebView.loadUrl("https://www.baidu.com");
+ }
+ },1000);
+ }
+ });
+ mWebView.setWebViewClient(new WebViewClient(){
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ refreshlayout.finishRefresh();
+ super.onPageFinished(view, url);
+ }
+ });
}
}
diff --git a/app/src/main/res/layout/customheader.xml b/app/src/main/res/layout/customheader.xml
index ffeefde..db863e1 100644
--- a/app/src/main/res/layout/customheader.xml
+++ b/app/src/main/res/layout/customheader.xml
@@ -14,10 +14,10 @@
@@ -26,5 +26,6 @@
android:layout_marginLeft="10dp"
android:id="@+id/text"
android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:textColor="#9e9e9e" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/footer_lottie.xml b/app/src/main/res/layout/footer_lottie.xml
new file mode 100644
index 0000000..3509b84
--- /dev/null
+++ b/app/src/main/res/layout/footer_lottie.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/lottie_json.xml b/app/src/main/res/layout/lottie_json.xml
index 0b5217c..6ddb659 100644
--- a/app/src/main/res/layout/lottie_json.xml
+++ b/app/src/main/res/layout/lottie_json.xml
@@ -4,11 +4,12 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:background="@color/cardview_dark_background"
android:gravity="center">
\ No newline at end of file
diff --git a/app/src/main/res/layout/lottie_loading.xml b/app/src/main/res/layout/lottie_loading.xml
index a1d184a..bd91d00 100644
--- a/app/src/main/res/layout/lottie_loading.xml
+++ b/app/src/main/res/layout/lottie_loading.xml
@@ -11,4 +11,11 @@
android:layout_width="40dp"
android:layout_height="40dp"
app:lottie_fileName="splashy_loader.json" />
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/lottie_material_wave_loading.xml b/app/src/main/res/layout/lottie_material_wave_loading.xml
index 0ef4b52..1c18a13 100644
--- a/app/src/main/res/layout/lottie_material_wave_loading.xml
+++ b/app/src/main/res/layout/lottie_material_wave_loading.xml
@@ -8,13 +8,15 @@
+ android:layout_height="wrap_content"
+ android:textColor="#9e9e9e"
+ />
\ No newline at end of file
diff --git a/app/src/main/res/layout/lottle_loading_animation_footer.xml b/app/src/main/res/layout/lottle_loading_animation_footer.xml
new file mode 100644
index 0000000..c790dd9
--- /dev/null
+++ b/app/src/main/res/layout/lottle_loading_animation_footer.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ 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 3ab3e9c..6924009 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,4 +3,10 @@
#3F51B5
#303F9F
#FF4081
+
+ #d42d00
+ #777788
+ #ff4401
+ #FFD700
+ #FD9404
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 608f223..4fffa8d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,8 +1,5 @@
GoRefresh
- 释放刷新
- 下拉刷新
- 正在刷新
加载失败,请重试
diff --git a/build.gradle b/build.gradle
index 7bd27a9..9305d8e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -18,7 +18,6 @@ allprojects {
maven {
url "https://maven.google.com"
}
-
}
}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/DefaultFooterView.java b/refreshlayout/src/main/java/com/GoRefresh/DefaultFooterView.java
index 683eca3..d940706 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/DefaultFooterView.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/DefaultFooterView.java
@@ -6,6 +6,8 @@
import android.view.View;
import android.widget.TextView;
+import com.GoRefresh.interfaces.IFooterView;
+
/**
* Created by Administrator on 2017/9/30 0030.
@@ -16,7 +18,7 @@ public class DefaultFooterView implements IFooterView {
private View loadingView;
private View finishView;
private View errorView;
- private View retryView;
+ private int retryId;
public DefaultFooterView(Context context) {
this.context = context;
@@ -27,8 +29,9 @@ private void initView() {
loadingView = LayoutInflater.from(context).inflate(R.layout.footer_loading, null);
finishView = LayoutInflater.from(context).inflate(R.layout.footer_finish, null);
errorView = LayoutInflater.from(context).inflate(R.layout.footer_error, null);
- retryView = errorView.findViewById(R.id.tips);
- ((TextView) retryView).getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
+ retryId=R.id.tips;
+ TextView retryView = (TextView) errorView.findViewById(retryId);
+ retryView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
}
@Override
@@ -47,11 +50,16 @@ public View getFailureView() {
}
@Override
- public View getRetryView() {
-
- return retryView;
+ public int getRetryId() {
+ return retryId;
}
+// @Override
+// public View getRetryView() {
+//
+// return retryView;
+// }
+
public void setLoadingView(int layoutID) {
this.loadingView = LayoutInflater.from(context).inflate(layoutID, null);
}
@@ -68,8 +76,8 @@ public void setFinishView(View finishView) {
this.finishView = finishView;
}
- public void setErrorView(int layoutID) {
- View errorView = LayoutInflater.from(context).inflate(layoutID, null);
+ public void setErrorView(int errorLayoutID) {
+ View errorView = LayoutInflater.from(context).inflate(errorLayoutID, null);
this.errorView = errorView;
}
@@ -77,15 +85,16 @@ public void setErrorView(View errorView) {
this.errorView = errorView;
}
- public void setErrorView(int layoutID, int retryId) {
- View errorView = LayoutInflater.from(context).inflate(layoutID, null);
- View retryView = errorView.findViewById(retryId);
+ public void setErrorView(View errorView, int retryId) {
this.errorView = errorView;
- this.retryView = retryView;
+ this.retryId = retryId;
}
- public void setErrorView(View errorView, View retryView) {
+
+ public void setErrorView(int errorLayoutID, int retryId) {
+ View errorView = LayoutInflater.from(context).inflate(errorLayoutID, null);
this.errorView = errorView;
- this.retryView = retryView;
+ this.retryId = retryId;
}
+
}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/DefaultHeaderLayout.java b/refreshlayout/src/main/java/com/GoRefresh/DefaultHeaderLayout.java
index 3acedb8..a5f672c 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/DefaultHeaderLayout.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/DefaultHeaderLayout.java
@@ -7,29 +7,31 @@
import android.widget.ImageView;
import android.widget.TextView;
-
+import com.GoRefresh.interfaces.IHeaderView;
+import com.GoRefresh.weight.RingProgressBar;
/**
* Created by Administratoron 2017/9/25 0025.
*/
-public class DefaultHeaderLayout implements IHeaderView {
+public class DefaultHeaderLayout implements IHeaderView {
private View mHeaderView;
private ImageView icon;
private TextView text;
private Context context;
private RingProgressBar progressBar;
+
public DefaultHeaderLayout(@NonNull Context context) {
- this.context=context;
+ this.context = context;
initView();
}
private void initView() {
- mHeaderView=LayoutInflater.from(context).inflate(R.layout.headerview,null);
- icon= (ImageView) mHeaderView.findViewById(R.id.arrow);
- text= (TextView) mHeaderView.findViewById(R.id.text);
- progressBar= (RingProgressBar) mHeaderView.findViewById(R.id.progressbar);
+ mHeaderView = LayoutInflater.from(context).inflate(R.layout.headerview, null);
+ icon = (ImageView) mHeaderView.findViewById(R.id.arrow);
+ text = (TextView) mHeaderView.findViewById(R.id.text);
+ progressBar = (RingProgressBar) mHeaderView.findViewById(R.id.progressbar);
icon.setVisibility(View.VISIBLE);
icon.setImageResource(R.drawable.arrow);
}
@@ -50,18 +52,18 @@ public void onReady() {
@Override
public void onChange(boolean isPull) {
- if(isPull){
- text.setText("释放刷新");
+ if (isPull) {
+ text.setText(R.string.release);
arrowUp();
- }else{
- text.setText("下拉刷新");
+ } else {
+ text.setText(R.string.pulltorefresh);
arrowDown();
}
}
@Override
public void onRefresh() {
- text.setText("正在加载");
+ text.setText(R.string.loading);
iconChange();
}
@@ -74,12 +76,11 @@ public void onBackFinish() {
reset();
}
-
-
- private void arrowDown(){
+ private void arrowDown() {
icon.animate().rotation(0).setDuration(300).start();
}
- private void arrowUp(){
+
+ private void arrowUp() {
icon.animate().rotation(-180).setDuration(300).start();
}
@@ -90,7 +91,7 @@ private void iconChange() {
}
private void reset() {
- text.setText("下拉刷新");
+ text.setText(R.string.pulltorefresh);
icon.setVisibility(View.VISIBLE);
icon.setRotation(0);
progressBar.setVisibility(View.GONE);
diff --git a/refreshlayout/src/main/java/com/GoRefresh/GoRefreshLayout.java b/refreshlayout/src/main/java/com/GoRefresh/GoRefreshLayout.java
index 905a4fd..8eee665 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/GoRefreshLayout.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/GoRefreshLayout.java
@@ -11,13 +11,16 @@
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
-import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
-import android.view.animation.LinearInterpolator;
import android.widget.AbsListView;
import android.widget.ListView;
+import com.GoRefresh.interfaces.IFooterView;
+import com.GoRefresh.interfaces.IHeaderView;
+import com.GoRefresh.interfaces.LoadMoreListener;
+import com.GoRefresh.interfaces.RefreshListener;
+
import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_UP;
@@ -31,7 +34,7 @@ public class GoRefreshLayout extends ViewGroup {
//header高度
private float mHeaderHeight = 250;
//footer高度
- private float mFooterHeight = 100;
+ private float mFooterHeight;
//刷新高度
private float mRefreshHeight = 300;
//手指拖动距离与下拉距离之比
@@ -41,9 +44,9 @@ public class GoRefreshLayout extends ViewGroup {
//返回到刷新高度(头部高度)时长
private int duration_backtoRefreshHeight = 200;
//底部弹出时长
- private int duration_footerVisiable = 200;
+ private int duration_footerVisiable = 100;
//底部隐藏时长
- private int duration_footerHidden = 200;
+ private int duration_footerHidden = 100;
//自动刷新弹出时间
private int duration_autotoRefreshHeight = 500;
//当前状态
@@ -73,11 +76,13 @@ public class GoRefreshLayout extends ViewGroup {
private RefreshListener refresrhListener;
- private LoadmoreListener loadmoreListener;
+ private LoadMoreListener loadMoreListener;
private AbsListView.OnScrollListener mScrollListener;
//是否在加载状态
private boolean isLoadingMore;
+ // //footer显示时true
+// private boolean isLoadingMore2;
//是否显示hasHeader
private boolean hasHeader = true;
//是否显示footer
@@ -92,24 +97,23 @@ public class GoRefreshLayout extends ViewGroup {
private int mOrignY;
private int mLastY;
private float mCurrentLastY;
- private VelocityTracker velocityTracker;
private float velocity;
//内容固定状态下当前头部偏移
private float fixOffset;
- private ValueAnimator valueAnimatorTotop;
+ private ValueAnimator valueAnimatorToTop;
private ValueAnimator valueAnimatorToRefresh;
-
+ private float NONE = -1;
private int mFooterStatus = 1;
private int LOADING = 1; //加载状态
private int FINISH = 2; //完成状态
private int ERROR = 3; //错误状态
- private boolean isLoadingMore2;
-
private Context context;
+ private LoadMoreHelper loadMoreHelper = new LoadMoreHelper();
+
public GoRefreshLayout(@NonNull Context context) {
super(context);
init(context, null);
@@ -131,18 +135,18 @@ private void init(Context context, AttributeSet attrs) {
mMaxHeight = typedArray.getDimension(R.styleable.GoRefreshLayout_maxHeight, mMaxHeight);
mRefreshHeight = typedArray.getDimension(R.styleable.GoRefreshLayout_refreshHeight, mRefreshHeight);
mHeaderHeight = typedArray.getDimension(R.styleable.GoRefreshLayout_headerHeight, mHeaderHeight);
- mFooterHeight = typedArray.getDimension(R.styleable.GoRefreshLayout_footerHeight, mFooterHeight);
+ mFooterHeight = typedArray.getDimension(R.styleable.GoRefreshLayout_footerHeight, NONE);
isFixedContent = typedArray.getBoolean(R.styleable.GoRefreshLayout_isFixed, isFixedContent);
mDamping = typedArray.getFloat(R.styleable.GoRefreshLayout_damping, mDamping);
duration_backtoRefreshHeight = typedArray.getInt(R.styleable.GoRefreshLayout_duration_BacktorefreshHeight, duration_backtoRefreshHeight);
duration_top = typedArray.getInt(R.styleable.GoRefreshLayout_duration_BacktoTop, duration_top);
duration_footerVisiable = typedArray.getInt(R.styleable.GoRefreshLayout_duration_FooterVisibility, duration_footerVisiable);
duration_footerHidden = typedArray.getInt(R.styleable.GoRefreshLayout_duration_FooterHidden, duration_footerHidden);
- duration_autotoRefreshHeight=typedArray.getInt(R.styleable.GoRefreshLayout_duration_autotoRefreshHeight, duration_autotoRefreshHeight);
+ duration_autotoRefreshHeight = typedArray.getInt(R.styleable.GoRefreshLayout_duration_autotoRefreshHeight, duration_autotoRefreshHeight);
typedArray.recycle();
mHeader = new DefaultHeaderLayout(context);
mFooter = new DefaultFooterView(context);
- velocityTracker = VelocityTracker.obtain();
+
}
@@ -163,8 +167,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
- if (hasFooter)
- showFooter(ScrollingUtil.isViewToBottom(mContentView));
+ //loadMoreHelper.showFooter(ScrollingUtil.isViewToBottom(mContentView));
}
});
} else if (mContentView instanceof AbsListView) {
@@ -181,13 +184,13 @@ public void onScroll(AbsListView absListView, int i, int i1, int i2) {
if (mScrollListener != null) {
mScrollListener.onScroll(absListView, i, i1, i2);
}
- if (hasFooter)
- showFooterwithListView(absListView, ScrollingUtil.isViewToBottom(mContentView));
+ loadMoreHelper.showFooter(ScrollingUtil.isViewToBottom(mContentView));
}
});
}
addHeaderView(mHeader);
+ loadMoreHelper.setFooterView(getDefaultFooterView(), mContentView);
}
@@ -199,26 +202,6 @@ private void addHeaderView(IHeaderView view) {
}
- private void addFooterView(IFooterView view, int flag) {
- if (flag == LOADING) {
- mFooterView = view.getLoadingView();
- } else if (flag == FINISH) {
- mFooterView = view.getFinishView();
- } else if (flag == ERROR) {
- mFooterView = view.getFailureView();
- }
- if (mContentView instanceof AbsListView) {
- AbsListView.LayoutParams params = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, (int) mFooterHeight);
- mFooterView.setLayoutParams(params);
- ((ListView) mContentView).addFooterView(mFooterView);
- } else {
- LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, (int) mFooterHeight);
- mFooterView.setLayoutParams(params);
- addView(mFooterView);
- }
- }
-
-
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
@@ -252,43 +235,16 @@ protected void onLayout(boolean b, int i0, int i1, int i2, int i3) {
} else {
child.layout(0, -child.getMeasuredHeight(), child.getMeasuredWidth(), 0);
}
- } else if (child == mFooterView) {
- child.layout(0, getHeight(), child.getMeasuredWidth(), getHeight() + child.getMeasuredHeight());
- } else {
+ }
+// else if (child == mFooterView) {
+// child.layout(0, getHeight(), child.getMeasuredWidth(), getHeight() + child.getMeasuredHeight());
+// }
+ else {
child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight());
}
}
}
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- velocityTracker.addMovement(ev);
- velocityTracker.computeCurrentVelocity(100);
-
- switch (ev.getActionMasked()) {
- case MotionEvent.ACTION_DOWN:
- break;
- case MotionEvent.ACTION_MOVE:
- velocity = velocityTracker.getYVelocity();
- if (isLoadingMore2) {
- if (velocity < 50)
- return true;
- }
- if (isFooterVisibility) {
- if (velocity > 10) {
- finishLoadmoremanual();
- return true;
- } else {
- return true;
- }
- }
- break;
-
- }
-
- return super.dispatchTouchEvent(ev);
- }
-
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
@@ -296,6 +252,7 @@ public boolean onInterceptTouchEvent(MotionEvent event) {
int y = (int) event.getY();
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
+ Log.d("onInterceptTouchEvent", "onInterceptTouchEvent==ACTION_DOWN");
mLastY = 0;
mOrignY = y;
//有偏移时再次按下 ,计算得到mCurrentLastY
@@ -314,7 +271,7 @@ public boolean onInterceptTouchEvent(MotionEvent event) {
break;
case ACTION_MOVE:
int dy = y - mLastY;
- Log.d("onInterceptTouchEvent", "onInterceptTouchEvent==" + 0);
+ Log.d("onInterceptTouchEvent", "onInterceptTouchEvent==ACTION_MOVE");
// 内容固定时刷新状态不拦截滑动
// 下拉拦截滑动事件
// 刷新时Y方向有偏移时上拉拦截滑动事件
@@ -322,7 +279,7 @@ public boolean onInterceptTouchEvent(MotionEvent event) {
// Math.abs(velocity)>1是由于 在手机上点击操作ACTION_DOWN会伴随无意义的ACTION_MOVE的出现 但不会有滑动速度,不拦截
if (isFixedContent && mStatus == STATUS_REFRESH) {
return false;
- } else if (!canScrollUp() && dy > 0 && mStatus != STATUS_BACK && Math.abs(velocity) > 1) {
+ } else if (!canScrollUp() && dy > 0 && mStatus != STATUS_BACK ) {
return true;
} else if (dy < 0 && getScrollY() >= 0) {
return false;
@@ -487,7 +444,6 @@ private void startRefresh(final int offsetY, int duration) {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (int) valueAnimator.getAnimatedValue();
- Log.d("tag",value+"");
if (isFixedContent) {
mHeaderView.layout(0, value - mHeaderView.getMeasuredHeight(), mHeaderView.getMeasuredWidth(), value);
fixOffset = value;
@@ -516,9 +472,9 @@ private void finishRefresh(int offset) {
* @param offset
*/
private void scrollToTop(int offset) {
- valueAnimatorTotop = ValueAnimator.ofInt(offset, 0);
- valueAnimatorTotop.setDuration(duration_top);
- valueAnimatorTotop.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ valueAnimatorToTop = ValueAnimator.ofInt(offset, 0);
+ valueAnimatorToTop.setDuration(duration_top);
+ valueAnimatorToTop.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (int) valueAnimator.getAnimatedValue();
@@ -533,7 +489,7 @@ public void onAnimationUpdate(ValueAnimator valueAnimator) {
}
}
});
- valueAnimatorTotop.addListener(new Animator.AnimatorListener() {
+ valueAnimatorToTop.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@@ -552,15 +508,15 @@ public void onAnimationRepeat(Animator animator) {
}
});
- valueAnimatorTotop.start();
+ valueAnimatorToTop.start();
}
/**
* 取消返回顶部
*/
private void cancelscrollToTop() {
- if (valueAnimatorTotop != null && valueAnimatorTotop.isRunning()) {
- valueAnimatorTotop.cancel();
+ if (valueAnimatorToTop != null && valueAnimatorToTop.isRunning()) {
+ valueAnimatorToTop.cancel();
}
}
@@ -577,116 +533,6 @@ private void finishToTop() {
//------------------------------footer相关--------------------------------------
//--------------------------------------------------------------------------------
- private void showFooter(boolean isBottom) {
- if (isBottom && !isFooterVisibility && velocity <= 0) {
- showFooter();
- if (!isLoadingMore) {
- isLoadingMore = true;
- if (loadmoreListener != null) {
- loadmoreListener.onLoadmore();
- }
- }
- isFooterVisibility = true;
-
- }
- }
-
- private void showFooterwithListView(AbsListView absListView, boolean viewToBottom) {
- if (viewToBottom) {
- if (loadmoreListener != null) {
- if (!isLoadingMore) {
- loadmoreListener.onLoadmore();
- isLoadingMore = true;
- }
- }
- }
-
- }
-
- /**
- * 显示footerview
- */
- private void showFooter() {
- ValueAnimator valueAnimator = ValueAnimator.ofInt(0, (int) mFooterHeight);
- valueAnimator.setDuration(duration_footerVisiable);
- valueAnimator.setInterpolator(new LinearInterpolator());
- valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator valueAnimator) {
- int value = (int) valueAnimator.getAnimatedValue();
- scrollTo(0, value);
- }
- });
- valueAnimator.start();
- }
-
- /**
- * 隐藏footerview
- */
- private void hideFooter() {
- if (duration_footerHidden <= 0) {
- if (mContentView instanceof RecyclerView) {
- mContentView.post(new Runnable() {
- @Override
- public void run() {
- scrollTo(0, 0);
- mContentView.scrollBy(0, (int) mFooterHeight);
- }
- });
- } else if (mContentView instanceof AbsListView) {
- mContentView.post(new Runnable() {
- @Override
- public void run() {
- scrollTo(0, 0);
- ((AbsListView) mContentView).smoothScrollBy((int) mFooterHeight, 0);
- }
- });
- }
- } else {
- ValueAnimator valueAnimator = ValueAnimator.ofInt((int) mFooterHeight, 0);
- valueAnimator.setDuration(duration_footerHidden);
- valueAnimator.setInterpolator(new LinearInterpolator());
- valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator valueAnimator) {
- final int value = (int) valueAnimator.getAnimatedValue();
- final int dy = currentValue - value;
- if (value == 0) {
- isLoadingMore2 = false;
- }
- if (dy > 0) {
- if (mContentView instanceof RecyclerView) {
- mContentView.post(new Runnable() {
- @Override
- public void run() {
- scrollTo(0, value);
- mContentView.scrollBy(0, dy);
- }
- });
- } else if (mContentView instanceof AbsListView) {
- mContentView.post(new Runnable() {
- @Override
- public void run() {
- scrollTo(0, value);
- ((AbsListView) mContentView).smoothScrollBy(dy, 0);
- }
- });
- }
- }
-
- updateCurrentFooterHeight(valueAnimator);
- }
- });
- valueAnimator.start();
- }
- }
-
- private int currentValue;
-
- private void updateCurrentFooterHeight(ValueAnimator valueAnimator) {
- currentValue = (int) valueAnimator.getAnimatedValue();
- }
-
private void reset() {
hasY = false;
mOrignY = -1;
@@ -704,25 +550,10 @@ private void removeFooterView() {
if (mFooterView != null) {
if (mContentView instanceof AbsListView) {
((ListView) mContentView).removeFooterView(mFooterView);
- } else {
- removeView(mFooterView);
}
}
}
- /**
- * 切换footerview
- *
- * @param flag
- */
- private void switchFooterView(int flag) {
- if (valid(flag)) {
- mFooterStatus = flag;
- removeFooterView();
- addFooterView(mFooter, flag);
- }
- }
-
private boolean valid(int flag) {
if (mFooter != null) {
if (flag == LOADING) {
@@ -747,6 +578,18 @@ private boolean valid(int flag) {
//------------------------------对外提供api--------------------------------------
//--------------------------------------------------------------------------------
+ /**
+ * 设置是否显示header
+ */
+ public void setHasHeader(boolean hasHeader) {
+ this.hasHeader = hasHeader;
+ if (hasHeader) {
+ setHeaderView(mHeader);
+ } else {
+ removeHeaderView();
+ }
+ }
+
/**
* 设置header
*/
@@ -756,17 +599,6 @@ public void setHeaderView(IHeaderView view) {
addHeaderView(view);
}
- /**
- * 设置footer
- */
- public void setFooterView(IFooterView view) {
- if (hasFooter) {
- mFooter = view;
- removeFooterView();
- addFooterView(view, LOADING);
- }
- }
-
/**
* 设置是否显示footer
@@ -774,26 +606,14 @@ public void setFooterView(IFooterView view) {
* @param hasFooter
*/
public void setHasFooter(boolean hasFooter) {
- this.hasFooter = hasFooter;
- if (hasFooter) {
- if (mFooterView == null) {
- setFooterView(mFooter);
- }
- } else {
- removeFooterView();
- }
+ loadMoreHelper.setHasFooter(hasFooter, mContentView, getDefaultFooterView());
}
/**
- * 设置是否显示header
+ * 设置footer
*/
- public void setHasHeader(boolean hasHeader) {
- this.hasHeader = hasHeader;
- if (hasHeader) {
- setHeaderView(mHeader);
- } else {
- removeHeaderView();
- }
+ public void setFooterView(IFooterView view) {
+ loadMoreHelper.setFooterView(view, mContentView);
}
public boolean isHasFooter() {
@@ -814,8 +634,10 @@ public void setOnRefreshListener(RefreshListener listener) {
*
* @param listener
*/
- public void setOnLoadmoreListener(LoadmoreListener listener) {
- this.loadmoreListener = listener;
+ public void setOnLoadMoreListener(LoadMoreListener listener) {
+ loadMoreHelper.setListener(listener);
+ //this.loadMoreListener = listener;
+
}
@@ -856,57 +678,25 @@ public void finishRefresh() {
}
}
- /**
- * 隐藏footerview,手动下拉时调用
- */
- private void finishLoadmoremanual() {
- if (isFooterVisibility) {
- isLoadingMore2 = true;
- isFooterVisibility = false;
- hideFooter();
- }
- }
-
/**
* 隐藏footerview,加载数据完毕时调用
*/
public void finishLoadmore() {
- isLoadingMore = false;
- if (isFooterVisibility) {
- isFooterVisibility = false;
- hideFooter();
- }
+ loadMoreHelper.finishLoadMore(mContentView);
}
/**
* 加载数据完毕没有更多数据时调用
*/
public void finishLoadmoreWithNoData() {
- switchFooterView(FINISH);
+ loadMoreHelper.finishLoadmoreWithNoData(mContentView);
}
/**
* 加载数据出错时调用
*/
public void finishLoadmoreWithError() {
- switchFooterView(ERROR);
- if (mFooter.getRetryView() != null) {
- mFooter.getRetryView().setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (loadmoreListener != null) {
- if (mContentView instanceof AbsListView) {
- switchFooterView(LOADING);
- ((ListView) mContentView).setSelection(((ListView) mContentView).getAdapter().getCount() - 1);
- loadmoreListener.onLoadmore();
- return;
- }
- switchFooterView(LOADING);
- loadmoreListener.onLoadmore();
- }
- }
- });
- }
+ loadMoreHelper.finishLoadmoreWithError(mContentView);
}
/**
@@ -944,16 +734,6 @@ public void setHeaderHeight(float mHeaderHeight) {
this.mHeaderHeight = mHeaderHeight;
}
- public float getFooterHeight() {
- return mFooterHeight;
- }
-
- /**
- * 设置footer高度
- */
- public void setFooterHeight(float mFooterHeight) {
- this.mFooterHeight = mFooterHeight;
- }
public float getRefreshHeight() {
return mRefreshHeight;
@@ -1012,25 +792,12 @@ public void setDuration_autotoRefreshHeight(int duration_autotoRefreshHeight) {
}
/**
- * 设置footerview弹出时长
+ * 设置recyclerview添加上拉加载功能的adapter
+ *
+ * @param rvLoadMoreAdapter
*/
- public void setDurationFooterVisiable(int duration_footer) {
- this.duration_footerVisiable = duration_footer;
- }
-
- public int getDurationFooterVisiable() {
- return duration_footerVisiable;
- }
-
- /**
- * 设置footerview返回底部时间
- */
- public int getDurationFooterHidden() {
- return duration_footerHidden;
- }
-
- public void setDurationFooterHidden(int duration_footerHidden) {
- this.duration_footerHidden = duration_footerHidden;
+ public RvLoadMoreWrapper buildRvLoadMoreAdapter(RecyclerView.Adapter rvLoadMoreAdapter) {
+ return loadMoreHelper.buildRvAdapter(rvLoadMoreAdapter);
}
/**
@@ -1053,7 +820,6 @@ public DefaultFooterView getDefaultFooterView() {
} else {
return new DefaultFooterView(context);
}
-
}
/**
@@ -1062,17 +828,11 @@ public DefaultFooterView getDefaultFooterView() {
* @param layoutID
*/
public void setLoadingView(int layoutID) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setLoadingView(layoutID);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setLoadingView(layoutID);
}
public void setLoadingView(View view) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setLoadingView(view);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setLoadingView(view);
}
/**
@@ -1081,50 +841,32 @@ public void setLoadingView(View view) {
* @param layoutID
*/
public void setFinishWithNodataView(int layoutID) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setFinishView(layoutID);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setFinishWithNodataView(layoutID);
}
public void setFinishWithNodataView(View view) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setFinishView(view);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setFinishWithNodataView(view);
}
/**
* 设置加载失败状态的footerview
*/
public void setErrorView(int layoutID) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setErrorView(layoutID);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setErrorView(layoutID);
}
public void setErrorView(View errorView) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setErrorView(errorView);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setErrorView(errorView);
}
/**
* 设置加载失败状态的footerview ,同时添加触发重试的控件
*/
public void setErrorViewWithRetry(int layoutID, int retryId) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setErrorView(layoutID, retryId);
- setFooterView(mFooter);
- }
+ loadMoreHelper.setErrorViewWithRetry(layoutID, retryId);
}
- public void setErrorViewWithRetry(View errorView, View retryView) {
- if (mFooter instanceof DefaultFooterView) {
- ((DefaultFooterView) mFooter).setErrorView(errorView, retryView);
- setFooterView(mFooter);
- }
+ public void setErrorViewWithRetry(View errorView, int retryId) {
+ loadMoreHelper.setErrorViewWithRetry(errorView, retryId);
}
}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/IFooterView.java b/refreshlayout/src/main/java/com/GoRefresh/IFooterView.java
deleted file mode 100644
index 230ec00..0000000
--- a/refreshlayout/src/main/java/com/GoRefresh/IFooterView.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.GoRefresh;
-
-import android.view.View;
-
-/**
- * Created by Administrator on 2017/9/30 0030.
- */
-
-public interface IFooterView {
- View getLoadingView();
-
- View getFinishView();
-
- View getFailureView();
-
- View getRetryView();
-
-
-
-}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/LoadMoreHelper.java b/refreshlayout/src/main/java/com/GoRefresh/LoadMoreHelper.java
new file mode 100644
index 0000000..2d49fcd
--- /dev/null
+++ b/refreshlayout/src/main/java/com/GoRefresh/LoadMoreHelper.java
@@ -0,0 +1,272 @@
+package com.GoRefresh;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.AbsListView;
+import android.widget.ListView;
+
+import com.GoRefresh.interfaces.IFooterView;
+import com.GoRefresh.interfaces.LoadMoreListener;
+
+/**
+ * Created by Administrator on 2017/11/28 0028.
+ */
+
+public class LoadMoreHelper {
+ private LoadMoreListener listener;
+ private RvLoadMoreWrapper rvloadMoreWrapper;
+ public boolean isLoadingMore;
+ private IFooterView mFooter;
+ private View mFooterView;
+ private int mFooterStatus = 1;
+ private int LOADING = 1; //加载状态
+ private int FINISH = 2; //完成状态
+ private int ERROR = 3; //错误状态
+ private boolean hasFooter;
+ private View contentView;
+
+ public void setHasFooter(boolean hasFooter, View contentView, IFooterView defaultFooterView) {
+ this.hasFooter = hasFooter;
+ if (contentView instanceof RecyclerView) {
+ if (rvloadMoreWrapper != null) {
+ if (mFooter == null) {
+ rvloadMoreWrapper.setFooterView(defaultFooterView);
+ } else {
+ rvloadMoreWrapper.setFooterView(mFooter);
+ }
+ rvloadMoreWrapper.setHasFooter(hasFooter);
+ }
+ } else if (contentView instanceof AbsListView) {
+ if (hasFooter) {
+ if (mFooter == null) {
+ setFooterView(defaultFooterView, contentView);
+ }
+ } else {
+ removeFooterView((ListView) contentView);
+ }
+ }
+ }
+
+ public void setFooterView(IFooterView view, View contentView) {
+ this.contentView = contentView;
+ this.mFooter = view;
+ setFooterView();
+ }
+
+ private void setFooterView() {
+ if (contentView instanceof RecyclerView) {
+ if (rvloadMoreWrapper != null) {
+ rvloadMoreWrapper.setFooterView(mFooter);
+ }
+ } else if (contentView instanceof AbsListView) {
+ if (hasFooter) {
+ addListViewFooterView((ListView) contentView, LOADING);
+ }
+ }
+ }
+
+ public void setListener(LoadMoreListener listener) {
+ this.listener = listener;
+ if(rvloadMoreWrapper!=null){
+ rvloadMoreWrapper.setLoadMoreListener(listener);
+ }
+ }
+
+
+ public RvLoadMoreWrapper buildRvAdapter(RecyclerView.Adapter rvLoadMoreAdapter) {
+ rvloadMoreWrapper = new RvLoadMoreWrapper(rvLoadMoreAdapter);
+ rvloadMoreWrapper.setFooterView(mFooter);
+ rvloadMoreWrapper.setHasFooter(hasFooter);
+ return rvloadMoreWrapper;
+ }
+
+
+ public void showFooter(boolean isBottom) {
+ if (hasFooter) {
+ if (isBottom) {
+ if (listener != null) {
+ if (!isLoadingMore) {
+ listener.onLoadmore();
+ isLoadingMore = true;
+ }
+ }
+ }
+ }
+ }
+
+ public void finishLoadMore(View contentView) {
+ if (contentView instanceof RecyclerView) {
+ if (rvloadMoreWrapper != null) {
+ rvloadMoreWrapper.finishLoadMore();
+ }
+ }
+ isLoadingMore = false;
+ }
+
+ public void finishLoadmoreWithNoData(View contentView) {
+ if (contentView instanceof RecyclerView) {
+ if (valid(FINISH)) {
+ if (rvloadMoreWrapper != null) {
+ rvloadMoreWrapper.finishLoadMoreWithNoData();
+ }
+ }
+ } else if (contentView instanceof ListView) {
+ if (mFooterStatus != FINISH) {
+ switchFooterView((ListView) contentView, FINISH);
+ }
+ }
+ }
+
+
+ public void finishLoadmoreWithError(final View contentView) {
+ if (contentView instanceof RecyclerView) {
+ if (valid(ERROR)) {
+ if (rvloadMoreWrapper != null) {
+ rvloadMoreWrapper.finishLoadMoreWithError();
+ }
+ }
+ } else if (contentView instanceof ListView) {
+ if (mFooterStatus != ERROR) {
+ View view = mFooter.getFailureView().findViewById(mFooter.getRetryId());
+ if (view != null) {
+ view.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (listener != null) {
+ switchFooterView((ListView) contentView, LOADING);
+ ((ListView) contentView).setSelection(((ListView) contentView).getAdapter().getCount() - 1);
+ listener.onLoadmore();
+ return;
+ }
+ }
+ });
+ }
+ switchFooterView((ListView) contentView, ERROR);
+ }
+ }
+ }
+
+ private boolean valid(int flag) {
+ if (mFooter != null) {
+ if (flag == LOADING) {
+ if (mFooter.getLoadingView() != null) {
+ return true;
+ }
+ } else if (flag == FINISH) {
+ if (mFooter.getFinishView() != null) {
+ return true;
+ }
+
+ } else if (flag == ERROR) {
+ if (mFooter.getFailureView() != null) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private void switchFooterView(ListView listView, int flag) {
+ if (valid(flag)) {
+ mFooterStatus = flag;
+ addListViewFooterView(listView, flag);
+ }
+ }
+
+
+ public void addListViewFooterView(ListView listView, int flag) {
+ if (mFooterView != null && mFooterStatus != flag) {
+ return;
+ }
+ removeFooterView(listView);
+ if (flag == LOADING) {
+ mFooterView = mFooter.getLoadingView();
+ } else if (flag == FINISH) {
+ mFooterView = mFooter.getFinishView();
+ } else if (flag == ERROR) {
+ mFooterView = mFooter.getFailureView();
+ }
+ listView.addFooterView(mFooterView);
+ }
+
+ private void removeFooterView(ListView contentView) {
+ if (mFooterView != null) {
+ contentView.removeFooterView(mFooterView);
+ }
+ }
+
+ /**
+ * 设置加载状态的footerview
+ *
+ * @param layoutID
+ */
+ public void setLoadingView(int layoutID) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setLoadingView(layoutID);
+ setFooterView();
+ }
+
+ }
+
+ public void setLoadingView(View view) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setLoadingView(view);
+ setFooterView();
+ }
+ }
+
+ /**
+ * 设置完成状态的footerview
+ *
+ * @param layoutID
+ */
+ public void setFinishWithNodataView(int layoutID) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setFinishView(layoutID);
+ setFooterView();
+ }
+ }
+
+ public void setFinishWithNodataView(View view) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setFinishView(view);
+ setFooterView();
+ }
+ }
+
+ /**
+ * 设置加载失败状态的footerview
+ */
+ public void setErrorView(int layoutID) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setErrorView(layoutID);
+ setFooterView();
+ }
+ }
+
+ public void setErrorView(View errorView) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setErrorView(errorView);
+ setFooterView();
+ }
+ }
+
+ /**
+ * 设置加载失败状态的footerview ,同时添加触发重试的控件
+ */
+ public void setErrorViewWithRetry(int layoutID, int retryId) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setErrorView(layoutID, retryId);
+ setFooterView();
+ }
+ }
+
+ public void setErrorViewWithRetry(View errorView, int retryId) {
+ if (mFooter instanceof DefaultFooterView) {
+ ((DefaultFooterView) mFooter).setErrorView(errorView, retryId);
+ setFooterView();
+ }
+ }
+
+
+}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/RvLoadMoreWrapper.java b/refreshlayout/src/main/java/com/GoRefresh/RvLoadMoreWrapper.java
new file mode 100644
index 0000000..f12555c
--- /dev/null
+++ b/refreshlayout/src/main/java/com/GoRefresh/RvLoadMoreWrapper.java
@@ -0,0 +1,290 @@
+package com.GoRefresh;
+
+import android.content.Context;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.StaggeredGridLayoutManager;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.GoRefresh.interfaces.IFooterView;
+import com.GoRefresh.interfaces.LoadMoreListener;
+
+/**
+ * Created by Administrator on 2017/11/27 0027.
+ */
+
+public class RvLoadMoreWrapper extends RecyclerView.Adapter {
+ private View mLoadMoreView;
+ private View mFinishView;
+ private View mErrorView;
+ private boolean isRemove;
+ private int mlayoutID;
+ private int mFinishlayoutID;
+ private int mErrorlayoutID;
+ private int mErrorid;
+ private boolean isLoadingMore;
+ private RecyclerView.Adapter adapter;
+ private LoadMoreListener mLoadMoreListener;
+ public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2;
+ public static final int ITEM_TYPE_LOAD_MORE_END = Integer.MAX_VALUE - 3;
+ public static final int ITEM_TYPE_LOAD_MORE_ERROR = Integer.MAX_VALUE - 4;
+ public static final int ITEM_TYPE_NONE = Integer.MAX_VALUE - 5;
+ private int LOAD_MORE_STATUS;
+ private int NONE = 0;
+ private int LOADING = 1;
+ private int FINISH = 2;
+ private int ERROR = 3;
+ private boolean hasFooter;
+ private IFooterView mFooterView;
+
+ public RvLoadMoreWrapper(RecyclerView.Adapter adapter) {
+ this.adapter = adapter;
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ FooterViewHolder holder = null;
+ if (viewType == ITEM_TYPE_LOAD_MORE_END) {
+ if (mFinishlayoutID != 0) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(mFinishlayoutID, parent,
+ false);
+ holder = new FooterViewHolder(itemView);
+ } else {
+ ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ mFinishView.setLayoutParams(layoutParams);
+ holder = new FooterViewHolder(mFinishView);
+ }
+ return holder;
+ }
+ if (viewType == ITEM_TYPE_LOAD_MORE_ERROR) {
+ if (mErrorlayoutID != 0) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(mErrorlayoutID, parent,
+ false);
+ holder = new FooterViewHolder(itemView);
+ } else {
+ ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ mErrorView.setLayoutParams(layoutParams);
+ holder = new FooterViewHolder(mErrorView);
+ }
+ return holder;
+ }
+ if (viewType == ITEM_TYPE_LOAD_MORE) {
+ if (mlayoutID != 0) {
+ View itemView = LayoutInflater.from(parent.getContext()).inflate(mlayoutID, parent,
+ false);
+ holder = new FooterViewHolder(itemView);
+ } else {
+ ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ mLoadMoreView.setLayoutParams(layoutParams);
+ holder = new FooterViewHolder(mLoadMoreView);
+ }
+ return holder;
+ }
+ return adapter.onCreateViewHolder(parent, viewType);
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof FooterViewHolder) {
+ if (isShowFooter(position)) {
+ if (mLoadMoreListener != null) {
+ if (LOAD_MORE_STATUS == LOADING) {
+ if (!isLoadingMore) {
+ mLoadMoreListener.onLoadmore();
+ isLoadingMore = true;
+ }
+ } else if (LOAD_MORE_STATUS == ERROR) {
+ if (mErrorid == 0) {
+ return;
+ } else {
+ ((FooterViewHolder) holder).getView(mErrorid).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ LOAD_MORE_STATUS = LOADING;
+ notifyItemChanged(adapter.getItemCount() + 1);
+ mLoadMoreListener.onLoadmore();
+ }
+ });
+ }
+ }
+ }
+ }
+ } else {
+ adapter.onBindViewHolder(holder, position);
+ }
+ }
+
+
+ @Override
+ public int getItemViewType(int position) {
+ if (isShowFooter(position)) {
+ if (LOAD_MORE_STATUS == FINISH) {
+ return ITEM_TYPE_LOAD_MORE_END;
+ } else if (LOAD_MORE_STATUS == ERROR) {
+ return ITEM_TYPE_LOAD_MORE_ERROR;
+ } else if (LOAD_MORE_STATUS == LOADING) {
+ return ITEM_TYPE_LOAD_MORE;
+ }
+ }
+ return adapter.getItemViewType(position);
+ }
+
+ @Override
+ public int getItemCount() {
+ if (LOAD_MORE_STATUS == NONE) {
+ return adapter.getItemCount();
+ } else {
+ return adapter.getItemCount() + 1;
+ }
+ }
+
+ class FooterViewHolder extends RecyclerView.ViewHolder {
+
+ private SparseArray mViews;
+ private View mConvertView;
+ private Context mContext;
+
+ public FooterViewHolder(View itemView) {
+ super(itemView);
+ mConvertView = itemView;
+ mViews = new SparseArray();
+ }
+
+ public T getView(int viewId) {
+ View view = mViews.get(viewId);
+ if (view == null) {
+ view = mConvertView.findViewById(viewId);
+ mViews.put(viewId, view);
+ }
+ return (T) view;
+ }
+ }
+
+ public void setLoadMoreListener(LoadMoreListener loadMoreListener) {
+ this.mLoadMoreListener = loadMoreListener;
+ }
+
+ public void setFooterView(IFooterView loadMoreView) {
+ mFooterView = loadMoreView;
+ mLoadMoreView = mFooterView.getLoadingView();
+ mFinishView = mFooterView.getFinishView();
+ mErrorView = mFooterView.getFailureView();
+ mErrorid = mFooterView.getRetryId();
+ }
+
+
+ public RvLoadMoreWrapper setLoadingView(View loadMoreView) {
+ mLoadMoreView = loadMoreView;
+ return this;
+ }
+
+ public RvLoadMoreWrapper setLoadingView(int layoutID) {
+ this.mlayoutID = layoutID;
+ return this;
+ }
+
+
+ public RvLoadMoreWrapper setFinishView(View finishView) {
+ mFinishView = finishView;
+ return this;
+ }
+
+ public RvLoadMoreWrapper setFinishView(int finishlayoutID) {
+ mFinishlayoutID = finishlayoutID;
+ return this;
+ }
+
+
+ public RvLoadMoreWrapper setErrorView(int errorID, int retryOnclicklayoutid) {
+ mErrorlayoutID = errorID;
+ mErrorid = retryOnclicklayoutid;
+ return this;
+ }
+
+ public RvLoadMoreWrapper setErrorView(View errorView, int retryOnclicklayoutid) {
+ mErrorid = retryOnclicklayoutid;
+ mErrorView = errorView;
+ return this;
+ }
+
+ public RvLoadMoreWrapper setErrorView(View errorView) {
+ mErrorView = errorView;
+ return this;
+ }
+
+ public RvLoadMoreWrapper setErrorView(int errorID) {
+ mErrorlayoutID = errorID;
+ return this;
+ }
+
+
+ public void finishLoadMoreWithNoData() {
+ LOAD_MORE_STATUS = FINISH;
+ notifyItemChanged(adapter.getItemCount() + 1);
+ }
+
+ public void finishLoadMore() {
+ LOAD_MORE_STATUS = LOADING;
+ notifyItemChanged(adapter.getItemCount() + 1);
+ isLoadingMore = false;
+ }
+
+ public void finishLoadMoreWithError() {
+ LOAD_MORE_STATUS = ERROR;
+ notifyItemChanged(adapter.getItemCount() + 1);
+ }
+
+
+// public void finishLoadMore() {
+// if (getItemCount() - adapter.getItemCount() > 0) {
+// isRemove = true;
+// notifyItemRemoved(adapter.getItemCount() + 1);
+// }
+// }
+
+
+ private boolean isShowFooter(int position) {
+ return position >= adapter.getItemCount();
+ }
+
+ @Override
+ public void onAttachedToRecyclerView(RecyclerView recyclerView) {
+ super.onAttachedToRecyclerView(recyclerView);
+ RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
+ if (manager instanceof GridLayoutManager) {
+ final GridLayoutManager gridManager = ((GridLayoutManager) manager);
+ gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
+ @Override
+ public int getSpanSize(int position) {
+ return getItemViewType(position) == ITEM_TYPE_LOAD_MORE
+ ? gridManager.getSpanCount() : 1;
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
+ super.onViewAttachedToWindow(holder);
+ ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
+ if (lp != null
+ && lp instanceof StaggeredGridLayoutManager.LayoutParams
+ && holder.getLayoutPosition() == adapter.getItemCount()) {
+ StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
+ p.setFullSpan(true);
+ }
+ }
+
+ public void setHasFooter(boolean hasFooter) {
+ if (hasFooter) {
+ LOAD_MORE_STATUS = LOADING;
+ } else {
+ LOAD_MORE_STATUS = NONE;
+ }
+ }
+
+
+}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/ScrollingUtil.java b/refreshlayout/src/main/java/com/GoRefresh/ScrollingUtil.java
index fe667ec..267191e 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/ScrollingUtil.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/ScrollingUtil.java
@@ -16,7 +16,6 @@
package com.GoRefresh;
-import android.graphics.Rect;
import android.os.Build;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
@@ -24,13 +23,7 @@
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebView;
import android.widget.AbsListView;
-import android.widget.ScrollView;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
public class ScrollingUtil {
@@ -78,16 +71,7 @@ public static boolean canChildScrollDown(View mChildView) {
}
}
- public static boolean isScrollViewOrWebViewToTop(View view) {
- return view != null && view.getScrollY() == 0;
- }
-
- public static boolean isViewToTop(View view, int mTouchSlop) {
- if (view instanceof AbsListView) return isAbsListViewToTop((AbsListView) view);
- if (view instanceof RecyclerView) return isRecyclerViewToTop((RecyclerView) view);
- return (view != null && Math.abs(view.getScrollY()) <= 2 * mTouchSlop);
- }
-
+
public static boolean isViewToBottom(View view) {
if (view instanceof AbsListView) return isAbsListViewToBottom((AbsListView) view);
if (view instanceof RecyclerView) return isRecyclerViewToBottom((RecyclerView) view);
@@ -96,107 +80,7 @@ public static boolean isViewToBottom(View view) {
return false;
}
- public static boolean isAbsListViewToTop(AbsListView absListView) {
- if (absListView != null) {
- int firstChildTop = 0;
- if (absListView.getChildCount() > 0) {
- // 如果AdapterView的子控件数量不为0,获取第一个子控件的top
- firstChildTop = absListView.getChildAt(0).getTop() - absListView.getPaddingTop();
- }
- if (absListView.getFirstVisiblePosition() == 0 && firstChildTop == 0) {
- return true;
- }
- }
- return false;
- }
-
- public static boolean isRecyclerViewToTop(RecyclerView recyclerView) {
- if (recyclerView != null) {
- RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
- if (manager == null) {
- return true;
- }
- if (manager.getItemCount() == 0) {
- return true;
- }
-
- if (manager instanceof LinearLayoutManager) {
- LinearLayoutManager layoutManager = (LinearLayoutManager) manager;
-
- int firstChildTop = 0;
- if (recyclerView.getChildCount() > 0) {
- // 处理item高度超过一屏幕时的情况
- View firstVisibleChild = recyclerView.getChildAt(0);
- if (firstVisibleChild != null && firstVisibleChild.getMeasuredHeight() >= recyclerView.getMeasuredHeight()) {
- if (android.os.Build.VERSION.SDK_INT < 14) {
- return !(ViewCompat.canScrollVertically(recyclerView, -1) || recyclerView.getScrollY() > 0);
- } else {
- return !ViewCompat.canScrollVertically(recyclerView, -1);
- }
- }
-
- // 如果RecyclerView的子控件数量不为0,获取第一个子控件的top
-
- // 解决item的topMargin不为0时不能触发下拉刷新
- View firstChild = recyclerView.getChildAt(0);
- RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) firstChild.getLayoutParams();
- firstChildTop = firstChild.getTop() - layoutParams.topMargin - getRecyclerViewItemTopInset(layoutParams) - recyclerView.getPaddingTop();
- }
-
- if (layoutManager.findFirstCompletelyVisibleItemPosition() < 1 && firstChildTop == 0) {
- return true;
- }
- } else if (manager instanceof StaggeredGridLayoutManager) {
- StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) manager;
-
- int[] out = layoutManager.findFirstCompletelyVisibleItemPositions(null);
- if (out[0] < 1) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * 通过反射获取RecyclerView的item的topInset
- *
- * @param layoutParams
- * @return
- */
- private static int getRecyclerViewItemTopInset(RecyclerView.LayoutParams layoutParams) {
- try {
- Field field = RecyclerView.LayoutParams.class.getDeclaredField("mDecorInsets");
- field.setAccessible(true);
- // 开发者自定义的滚动监听器
- Rect decorInsets = (Rect) field.get(layoutParams);
- return decorInsets.top;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return 0;
- }
-
-
- public static boolean isWebViewToBottom(WebView webview, int mTouchSlop) {
- return webview != null && ((webview.getContentHeight() * webview.getScale() - (webview.getHeight() + webview.getScrollY())) <= 2 * mTouchSlop);
- }
-
- public static boolean isViewGroupToBottom(ViewGroup viewGroup) {
- View subChildView = viewGroup.getChildAt(0);
- return (subChildView != null && subChildView.getMeasuredHeight() <= viewGroup.getScrollY() + viewGroup.getHeight());
- }
- public static boolean isScrollViewToBottom(ScrollView scrollView) {
- if (scrollView != null) {
- int scrollContentHeight = scrollView.getScrollY() + scrollView.getMeasuredHeight() - scrollView.getPaddingTop() - scrollView.getPaddingBottom();
- int realContentHeight = scrollView.getChildAt(0).getMeasuredHeight();
- if (scrollContentHeight == realContentHeight) {
- return true;
- }
- }
- return false;
- }
public static boolean isAbsListViewToBottom(AbsListView absListView) {
if (absListView != null && absListView.getAdapter() != null && absListView.getChildCount() > 0 && absListView.getLastVisiblePosition() == absListView.getAdapter().getCount() - 1) {
@@ -247,63 +131,4 @@ public static boolean isRecyclerViewToBottom(RecyclerView recyclerView) {
return false;
}
- public static void scrollAViewBy(View view, int height) {
- if (view instanceof RecyclerView) ((RecyclerView) view).scrollBy(0, height);
- else if (view instanceof ScrollView) ((ScrollView) view).smoothScrollBy(0, height);
- else if (view instanceof AbsListView) ((AbsListView) view).smoothScrollBy(height, 0);
- else {
- try {
- Method method = view.getClass().getDeclaredMethod("smoothScrollBy", Integer.class, Integer.class);
- method.invoke(view, 0, height);
- } catch (Exception e) {
- view.scrollBy(0, height);
- }
- }
- }
-
-
- public static void scrollToBottom(final ScrollView scrollView) {
- if (scrollView != null) {
- scrollView.post(new Runnable() {
- @Override
- public void run() {
- scrollView.fullScroll(ScrollView.FOCUS_DOWN);
- }
- });
- }
- }
-
- public static void scrollToBottom(final AbsListView absListView) {
- if (absListView != null) {
- if (absListView.getAdapter() != null && absListView.getAdapter().getCount() > 0) {
- absListView.post(new Runnable() {
- @Override
- public void run() {
- absListView.setSelection(absListView.getAdapter().getCount() - 1);
- }
- });
- }
- }
- }
-
- public static void scrollToBottom(final RecyclerView recyclerView) {
- if (recyclerView != null) {
- if (recyclerView.getAdapter() != null && recyclerView.getAdapter().getItemCount() > 0) {
- recyclerView.post(new Runnable() {
- @Override
- public void run() {
- recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);
- }
- });
- }
- }
- }
-
- public static void scrollToBottom(View view) {
- if (view instanceof RecyclerView) scrollToBottom((RecyclerView) view);
- if (view instanceof AbsListView) scrollToBottom((AbsListView) view);
- if (view instanceof ScrollView) scrollToBottom((ScrollView) view);
- }
-
-
}
\ No newline at end of file
diff --git a/refreshlayout/src/main/java/com/GoRefresh/googleLayout/GoogleLayout.java b/refreshlayout/src/main/java/com/GoRefresh/googleLayout/GoogleLayout.java
index 33faf5d..a025c17 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/googleLayout/GoogleLayout.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/googleLayout/GoogleLayout.java
@@ -14,7 +14,7 @@
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import com.GoRefresh.IHeaderView;
+import com.GoRefresh.interfaces.IHeaderView;
/**
* Created by Administrator on 2017/9/27 0027.
diff --git a/refreshlayout/src/main/java/com/GoRefresh/interfaces/IFooterView.java b/refreshlayout/src/main/java/com/GoRefresh/interfaces/IFooterView.java
new file mode 100644
index 0000000..d770a3b
--- /dev/null
+++ b/refreshlayout/src/main/java/com/GoRefresh/interfaces/IFooterView.java
@@ -0,0 +1,33 @@
+package com.GoRefresh.interfaces;
+
+import android.view.View;
+
+/**
+ * Created by Administrator on 2017/9/30 0030.
+ */
+
+public interface IFooterView {
+ /**
+ * 加载状态view
+ * @return
+ */
+ View getLoadingView();
+ /**
+ * 完成状态view
+ * @return
+ */
+ View getFinishView();
+ /**
+ * 失败状态view
+ * @return
+ */
+ View getFailureView();
+ /**
+ * 点击重试view的id
+ * @return
+ */
+ int getRetryId();
+
+
+
+}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/IHeaderView.java b/refreshlayout/src/main/java/com/GoRefresh/interfaces/IHeaderView.java
similarity index 96%
rename from refreshlayout/src/main/java/com/GoRefresh/IHeaderView.java
rename to refreshlayout/src/main/java/com/GoRefresh/interfaces/IHeaderView.java
index 09cf063..2fe56a8 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/IHeaderView.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/interfaces/IHeaderView.java
@@ -1,4 +1,4 @@
-package com.GoRefresh;
+package com.GoRefresh.interfaces;
import android.view.View;
diff --git a/refreshlayout/src/main/java/com/GoRefresh/LoadmoreListener.java b/refreshlayout/src/main/java/com/GoRefresh/interfaces/LoadMoreListener.java
similarity index 54%
rename from refreshlayout/src/main/java/com/GoRefresh/LoadmoreListener.java
rename to refreshlayout/src/main/java/com/GoRefresh/interfaces/LoadMoreListener.java
index 5a227ae..10f5eb5 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/LoadmoreListener.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/interfaces/LoadMoreListener.java
@@ -1,9 +1,9 @@
-package com.GoRefresh;
+package com.GoRefresh.interfaces;
/**
* Created by Administrator on 2017/10/10 0010.
*/
-public interface LoadmoreListener {
+public interface LoadMoreListener {
void onLoadmore();
}
diff --git a/refreshlayout/src/main/java/com/GoRefresh/RefreshListener.java b/refreshlayout/src/main/java/com/GoRefresh/interfaces/RefreshListener.java
similarity index 77%
rename from refreshlayout/src/main/java/com/GoRefresh/RefreshListener.java
rename to refreshlayout/src/main/java/com/GoRefresh/interfaces/RefreshListener.java
index ee05725..10d2838 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/RefreshListener.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/interfaces/RefreshListener.java
@@ -1,4 +1,4 @@
-package com.GoRefresh;
+package com.GoRefresh.interfaces;
/**
* Created by Administrator on 2017/10/29 0029.
diff --git a/refreshlayout/src/main/java/com/GoRefresh/RingProgressBar.java b/refreshlayout/src/main/java/com/GoRefresh/weight/RingProgressBar.java
similarity index 99%
rename from refreshlayout/src/main/java/com/GoRefresh/RingProgressBar.java
rename to refreshlayout/src/main/java/com/GoRefresh/weight/RingProgressBar.java
index b94614c..e8cb754 100644
--- a/refreshlayout/src/main/java/com/GoRefresh/RingProgressBar.java
+++ b/refreshlayout/src/main/java/com/GoRefresh/weight/RingProgressBar.java
@@ -1,4 +1,4 @@
-package com.GoRefresh;
+package com.GoRefresh.weight;
import android.animation.ValueAnimator;
import android.content.Context;
@@ -11,6 +11,8 @@
import android.view.View;
import android.view.animation.Interpolator;
+import com.GoRefresh.R;
+
/**
* Created by Administrator on 2016/9/28 0028.
*/
diff --git a/refreshlayout/src/main/res/layout/footer_loading.xml b/refreshlayout/src/main/res/layout/footer_loading.xml
index 279aef4..b5b6fdf 100644
--- a/refreshlayout/src/main/res/layout/footer_loading.xml
+++ b/refreshlayout/src/main/res/layout/footer_loading.xml
@@ -3,9 +3,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="40dp"
android:gravity="center">
-
-
GoRefresh
- 正在加载中
+ 正在加载
+ 释放刷新
+ 下拉刷新
+ 正在加载
diff --git a/refreshlayout_lottie/src/main/java/com/GoRefesh_core/LottieView.java b/refreshlayout_lottie/src/main/java/com/GoRefesh_core/LottieView.java
index d206379..b67fc2e 100644
--- a/refreshlayout_lottie/src/main/java/com/GoRefesh_core/LottieView.java
+++ b/refreshlayout_lottie/src/main/java/com/GoRefesh_core/LottieView.java
@@ -5,7 +5,7 @@
import android.view.LayoutInflater;
import android.view.View;
-import com.GoRefresh.IHeaderView;
+import com.GoRefresh.interfaces.IHeaderView;
import com.airbnb.lottie.LottieAnimationView;
/**
@@ -34,11 +34,10 @@ private void initView(Context context, int layoutId, int lottieViewId) {
}
- public void setAnimation(String filename){
+ public void setAnimation(String filename) {
animationView.setAnimation(filename);
}
-
@Override
public View getView() {
return view;
@@ -50,23 +49,20 @@ public void onPull(float a) {
animationView.setProgress(progress);
}
-
@Override
public void onReady() {
}
-
@Override
public void onChange(boolean isPull) {
}
-
@Override
public void onRefresh() {
valueAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
- valueAnimator.setDuration(duration==0?animationView.getDuration():duration);
+ valueAnimator.setDuration(duration == 0 ? animationView.getDuration() : duration);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
@@ -77,7 +73,6 @@ public void onAnimationUpdate(ValueAnimator valueAnimator) {
valueAnimator.start();
}
-
@Override
public void onRefreshFinish() {
@@ -98,7 +93,7 @@ public LottieAnimationView getLottieView() {
}
private float culProgress(float from, float to, float percent) {
- return from +percent * (to - from);
+ return from + percent * (to - from);
}
public void setPullProgressRange(float from, float to) {
diff --git a/screenshots/gif.gif b/screenshots/gif.gif
new file mode 100644
index 0000000..5cce94d
Binary files /dev/null and b/screenshots/gif.gif differ
diff --git a/screenshots/gif2.gif b/screenshots/gif2.gif
new file mode 100644
index 0000000..c3601f4
Binary files /dev/null and b/screenshots/gif2.gif differ
diff --git a/screenshots/gif3.gif b/screenshots/gif3.gif
new file mode 100644
index 0000000..b21c02b
Binary files /dev/null and b/screenshots/gif3.gif differ
diff --git a/screenshots/gif4.gif b/screenshots/gif4.gif
new file mode 100644
index 0000000..3d9154a
Binary files /dev/null and b/screenshots/gif4.gif differ
diff --git a/screenshots/gif5.gif b/screenshots/gif5.gif
new file mode 100644
index 0000000..482df01
Binary files /dev/null and b/screenshots/gif5.gif differ
diff --git a/screenshots/gif6.gif b/screenshots/gif6.gif
new file mode 100644
index 0000000..15c2e2e
Binary files /dev/null and b/screenshots/gif6.gif differ
diff --git a/screenshots/gif7.gif b/screenshots/gif7.gif
new file mode 100644
index 0000000..84967ae
Binary files /dev/null and b/screenshots/gif7.gif differ
diff --git a/screenshots/gif8.gif b/screenshots/gif8.gif
new file mode 100644
index 0000000..f080f00
Binary files /dev/null and b/screenshots/gif8.gif differ
diff --git a/screenshots/gif9.gif b/screenshots/gif9.gif
new file mode 100644
index 0000000..538bf37
Binary files /dev/null and b/screenshots/gif9.gif differ