├── .gitignore
├── .idea
├── .name
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── encodings.xml
├── gradle.xml
├── misc.xml
├── modules.xml
├── scopes
│ └── scope_settings.xml
└── vcs.xml
├── AndroidPractice.iml
├── README.md
├── app
├── .gitignore
├── app.iml
├── build.gradle
├── hs_err_pid11732.log
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── szu
│ │ └── androidpractice
│ │ └── ApplicationTest.java
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── szu
│ │ └── androidpractice
│ │ ├── App.java
│ │ ├── adapter
│ │ ├── BaseListAdapter.java
│ │ ├── DrawerListAdapter.java
│ │ ├── HideToolbarOnScrollAdapter.java
│ │ ├── MainAdapter.java
│ │ ├── RecyclerHeadViewHolder.java
│ │ ├── RecyclerItemClickListener.java
│ │ └── RecyclerItemViewHolder.java
│ │ ├── callback
│ │ └── RecyclerStateListener.java
│ │ └── ui
│ │ ├── BaseActivity.java
│ │ ├── MainActivity.java
│ │ ├── SampleActivity.java
│ │ ├── SearchActivity.java
│ │ └── fragments
│ │ ├── BaseFragment.java
│ │ ├── HideToolbarOnScrollFragment.java
│ │ └── SlideMenuFragment.java
│ └── res
│ ├── drawable-xhdpi
│ ├── action_more.png
│ └── action_search.png
│ ├── drawable
│ └── activated_background.xml
│ ├── layout
│ ├── activity_main.xml
│ ├── activity_sample.xml
│ ├── activity_search_result.xml
│ ├── fragment_hide_toolbar_onscroll.xml
│ ├── fragment_slide_menu.xml
│ ├── recycler_head_layout.xml
│ ├── recycler_item_layout.xml
│ └── simple_list_item_layout.xml
│ ├── menu
│ ├── menu_main.xml
│ ├── menu_options.xml
│ ├── menu_search.xml
│ └── menu_slide.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── values
│ ├── colors.xml
│ ├── strings.xml
│ └── styles.xml
│ └── xml
│ └── searchable.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/workspace.xml
4 | /.idea/libraries
5 | .DS_Store
6 | /build
7 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | AndroidPractice
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 1.7
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/scopes/scope_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/AndroidPractice.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ###练习Android的例子
2 | 
3 | 
4 | 
5 |
6 | [简书博客](http://www.jianshu.com/users/f612d54d668e/latest_articles)
7 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/app.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 21
5 | buildToolsVersion "21.1.2"
6 |
7 | defaultConfig {
8 | applicationId "com.szu.androidpractice"
9 | minSdkVersion 14
10 | targetSdkVersion 21
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | compile 'com.android.support:appcompat-v7:22.0.0'
25 | compile "com.android.support:recyclerview-v7:21.0.0"
26 | compile 'com.android.support:cardview-v7:21.0.3'
27 | compile 'com.jakewharton:butterknife:6.1.0'
28 | compile 'com.nineoldandroids:library:2.4.0'
29 | compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
30 | }
31 |
--------------------------------------------------------------------------------
/app/hs_err_pid11732.log:
--------------------------------------------------------------------------------
1 | #
2 | # There is insufficient memory for the Java Runtime Environment to continue.
3 | # Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate
4 | # Possible reasons:
5 | # The system is out of physical RAM or swap space
6 | # In 32 bit mode, the process size limit was hit
7 | # Possible solutions:
8 | # Reduce memory load on the system
9 | # Increase physical memory or swap space
10 | # Check if swap backing store is full
11 | # Use 64 bit Java on a 64 bit OS
12 | # Decrease Java heap size (-Xmx/-Xms)
13 | # Decrease number of Java threads
14 | # Decrease Java thread stack sizes (-Xss)
15 | # Set larger code cache with -XX:ReservedCodeCacheSize=
16 | # This output file may be truncated or incomplete.
17 | #
18 | # Out of Memory Error (allocation.cpp:211), pid=11732, tid=13732
19 | #
20 | # JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43)
21 | # Java VM: Java HotSpot(TM) 64-Bit Server VM (24.0-b56 mixed mode windows-amd64 compressed oops)
22 | # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
23 | #
24 |
25 | --------------- T H R E A D ---------------
26 |
27 | Current thread (0x0000000008266800): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=13732, stack(0x00000000097d0000,0x00000000098d0000)]
28 |
29 | Stack: [0x00000000097d0000,0x00000000098d0000]
30 |
31 | Current CompileTask:
32 | C2: 1545 13 sun.net.www.ParseUtil::encodePath (336 bytes)
33 |
34 |
35 | --------------- P R O C E S S ---------------
36 |
37 | Java Threads: ( => current thread )
38 | 0x0000000008273000 JavaThread "Service Thread" daemon [_thread_blocked, id=14160, stack(0x00000000099d0000,0x0000000009ad0000)]
39 | 0x000000000826e000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=3796, stack(0x00000000098d0000,0x00000000099d0000)]
40 | =>0x0000000008266800 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=13732, stack(0x00000000097d0000,0x00000000098d0000)]
41 | 0x0000000008265800 JavaThread "Attach Listener" daemon [_thread_blocked, id=13944, stack(0x00000000096d0000,0x00000000097d0000)]
42 | 0x0000000008263000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=9964, stack(0x00000000095d0000,0x00000000096d0000)]
43 | 0x000000000821e000 JavaThread "Finalizer" daemon [_thread_blocked, id=13320, stack(0x00000000094d0000,0x00000000095d0000)]
44 | 0x0000000008213000 JavaThread "Reference Handler" daemon [_thread_blocked, id=11672, stack(0x00000000093d0000,0x00000000094d0000)]
45 | 0x00000000022bd800 JavaThread "main" [_thread_blocked, id=12268, stack(0x0000000002100000,0x0000000002200000)]
46 |
47 | Other Threads:
48 | 0x0000000008210800 VMThread [stack: 0x00000000092d0000,0x00000000093d0000] [id=13840]
49 | 0x000000000828b800 WatcherThread [stack: 0x0000000009ad0000,0x0000000009bd0000] [id=13792]
50 |
51 | VM state:not at safepoint (normal execution)
52 |
53 | VM Mutex/Monitor currently owned by a thread: None
54 |
55 | Heap
56 | PSYoungGen total 28672K, used 5539K [0x00000000eaa80000, 0x00000000eca00000, 0x0000000100000000)
57 | eden space 25088K, 22% used [0x00000000eaa80000,0x00000000eafe8c98,0x00000000ec300000)
58 | from space 3584K, 0% used [0x00000000ec680000,0x00000000ec680000,0x00000000eca00000)
59 | to space 3584K, 0% used [0x00000000ec300000,0x00000000ec300000,0x00000000ec680000)
60 | ParOldGen total 64000K, used 0K [0x00000000c0000000, 0x00000000c3e80000, 0x00000000eaa80000)
61 | object space 64000K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000c3e80000)
62 | PSPermGen total 21504K, used 4303K [0x00000000bae00000, 0x00000000bc300000, 0x00000000c0000000)
63 | object space 21504K, 20% used [0x00000000bae00000,0x00000000bb233d00,0x00000000bc300000)
64 |
65 | Card table byte_map: [0x0000000005480000,0x00000000056b0000] byte_map_base: 0x0000000004ea9000
66 |
67 | Polling page: 0x00000000005f0000
68 |
69 | Code Cache [0x00000000023c0000, 0x0000000002630000, 0x00000000053c0000)
70 | total_blobs=217 nmethods=13 adapters=158 free_code_cache=48742Kb largest_free_block=49899648
71 |
72 | Compilation events (10 events):
73 | Event: 1.200 Thread 0x000000000826e000 nmethod 8 0x0000000002420390 code [0x00000000024204e0, 0x0000000002420938]
74 | Event: 1.271 Thread 0x0000000008266800 9 java.lang.String::length (6 bytes)
75 | Event: 1.272 Thread 0x0000000008266800 nmethod 9 0x000000000241f990 code [0x000000000241fac0, 0x000000000241fb18]
76 | Event: 1.288 Thread 0x000000000826e000 10 java.lang.Object:: (1 bytes)
77 | Event: 1.289 Thread 0x000000000826e000 nmethod 10 0x0000000002424e10 code [0x0000000002424f40, 0x0000000002424fb8]
78 | Event: 1.323 Thread 0x0000000008266800 11 java.lang.String::startsWith (72 bytes)
79 | Event: 1.323 Thread 0x000000000826e000 12 java.lang.String::equals (81 bytes)
80 | Event: 1.330 Thread 0x0000000008266800 nmethod 11 0x0000000002424750 code [0x00000000024248a0, 0x0000000002424a38]
81 | Event: 1.333 Thread 0x000000000826e000 nmethod 12 0x0000000002425e90 code [0x0000000002425fe0, 0x0000000002426218]
82 | Event: 1.394 Thread 0x0000000008266800 13 sun.net.www.ParseUtil::encodePath (336 bytes)
83 |
84 | GC Heap History (0 events):
85 | No events
86 |
87 | Deoptimization events (0 events):
88 | No events
89 |
90 | Internal exceptions (10 events):
91 | Event: 1.426 Thread 0x00000000022bd800 Threw 0x00000000eaf89968 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
92 | Event: 1.428 Thread 0x00000000022bd800 Threw 0x00000000eaf8f458 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
93 | Event: 1.430 Thread 0x00000000022bd800 Threw 0x00000000eaf92ee8 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
94 | Event: 1.432 Thread 0x00000000022bd800 Threw 0x00000000eaf95ea0 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
95 | Event: 1.433 Thread 0x00000000022bd800 Threw 0x00000000eaf9f568 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
96 | Event: 1.435 Thread 0x00000000022bd800 Threw 0x00000000eafa23e0 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
97 | Event: 1.437 Thread 0x00000000022bd800 Threw 0x00000000eafa5a88 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
98 | Event: 1.438 Thread 0x00000000022bd800 Threw 0x00000000eafaabd8 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
99 | Event: 1.440 Thread 0x00000000022bd800 Threw 0x00000000eafb3b08 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
100 | Event: 1.441 Thread 0x00000000022bd800 Threw 0x00000000eafb9498 at C:\jdk7u2_64p\jdk7u40\hotspot\src\share\vm\prims\jvm.cpp:1244
101 |
102 | Events (10 events):
103 | Event: 1.436 loading class 0x000000000232c550 done
104 | Event: 1.436 loading class 0x0000000002333f40 done
105 | Event: 1.437 loading class 0x0000000009ce22c0
106 | Event: 1.437 loading class 0x0000000009ce22c0 done
107 | Event: 1.438 loading class 0x0000000009ce2d80
108 | Event: 1.438 loading class 0x0000000009ce2d80 done
109 | Event: 1.440 loading class 0x0000000009d38530
110 | Event: 1.440 loading class 0x0000000009d38530 done
111 | Event: 1.441 loading class 0x0000000009ce6a30
112 | Event: 1.441 loading class 0x0000000009ce6a30 done
113 |
114 |
115 | Dynamic libraries:
116 | 0x00007ff68e8d0000 - 0x00007ff68e903000 E:\jdk\bin\java.exe
117 | 0x00007ffa11330000 - 0x00007ffa114dc000 C:\Windows\SYSTEM32\ntdll.dll
118 | 0x00007ffa0f020000 - 0x00007ffa0f15a000 C:\Windows\system32\KERNEL32.DLL
119 | 0x00007ffa0e2d0000 - 0x00007ffa0e3df000 C:\Windows\system32\KERNELBASE.dll
120 | 0x00007ffa0ce60000 - 0x00007ffa0cee8000 C:\Windows\system32\apphelp.dll
121 | 0x00007ffa06000000 - 0x00007ffa0604f000 C:\Windows\AppPatch\AppPatch64\AcGenral.DLL
122 | 0x00007ffa0f5d0000 - 0x00007ffa0f677000 C:\Windows\system32\msvcrt.dll
123 | 0x00007ffa0e030000 - 0x00007ffa0e05b000 C:\Windows\SYSTEM32\SspiCli.dll
124 | 0x00007ffa0efc0000 - 0x00007ffa0f011000 C:\Windows\system32\SHLWAPI.dll
125 | 0x00007ffa10fb0000 - 0x00007ffa11121000 C:\Windows\system32\USER32.dll
126 | 0x00007ffa10dd0000 - 0x00007ffa10f48000 C:\Windows\system32\ole32.dll
127 | 0x00007ffa0f680000 - 0x00007ffa10b98000 C:\Windows\system32\SHELL32.dll
128 | 0x00007ffa0d830000 - 0x00007ffa0d84e000 C:\Windows\SYSTEM32\USERENV.dll
129 | 0x00007ffa0edc0000 - 0x00007ffa0ee65000 C:\Windows\system32\ADVAPI32.dll
130 | 0x00007ffa05e30000 - 0x00007ffa05e4b000 C:\Windows\SYSTEM32\MPR.dll
131 | 0x00007ffa0e8a0000 - 0x00007ffa0e9d7000 C:\Windows\system32\RPCRT4.dll
132 | 0x00007ffa10c10000 - 0x00007ffa10c67000 C:\Windows\SYSTEM32\sechost.dll
133 | 0x00007ffa11130000 - 0x00007ffa11306000 C:\Windows\SYSTEM32\combase.dll
134 | 0x00007ffa0ee70000 - 0x00007ffa0efb4000 C:\Windows\system32\GDI32.dll
135 | 0x00007ffa0e1a0000 - 0x00007ffa0e1b4000 C:\Windows\SYSTEM32\profapi.dll
136 | 0x00007ffa0c6a0000 - 0x00007ffa0c73f000 C:\Windows\SYSTEM32\SHCORE.dll
137 | 0x00007ffa0f3b0000 - 0x00007ffa0f3e4000 C:\Windows\system32\IMM32.DLL
138 | 0x00007ffa0ec60000 - 0x00007ffa0edb2000 C:\Windows\system32\MSCTF.dll
139 | 0x00007ffa0c040000 - 0x00007ffa0c29a000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.17031_none_6242a4b3ecbb55a1\COMCTL32.dll
140 | 0x0000000071e60000 - 0x0000000071f31000 E:\jdk\jre\bin\msvcr100.dll
141 | 0x00000000722e0000 - 0x0000000072aa9000 E:\jdk\jre\bin\server\jvm.dll
142 | 0x00007ffa08860000 - 0x00007ffa08869000 C:\Windows\SYSTEM32\WSOCK32.dll
143 | 0x00007ffa0e720000 - 0x00007ffa0e73f000 C:\Windows\system32\WINMM.dll
144 | 0x00007ffa10c00000 - 0x00007ffa10c07000 C:\Windows\system32\PSAPI.DLL
145 | 0x00007ffa10f50000 - 0x00007ffa10fa8000 C:\Windows\system32\WS2_32.dll
146 | 0x00007ffa0e2a0000 - 0x00007ffa0e2ca000 C:\Windows\system32\WINMMBASE.dll
147 | 0x00007ffa0f260000 - 0x00007ffa0f269000 C:\Windows\system32\NSI.dll
148 | 0x00007ffa0e6d0000 - 0x00007ffa0e71a000 C:\Windows\SYSTEM32\cfgmgr32.dll
149 | 0x00007ffa0e250000 - 0x00007ffa0e276000 C:\Windows\system32\DEVOBJ.dll
150 | 0x00000000722d0000 - 0x00000000722df000 E:\jdk\jre\bin\verify.dll
151 | 0x00000000722a0000 - 0x00000000722c8000 E:\jdk\jre\bin\java.dll
152 | 0x0000000072280000 - 0x0000000072295000 E:\jdk\jre\bin\zip.dll
153 |
154 | VM Arguments:
155 | jvm_args: -Xmx1024M -Dfile.encoding=GBK -Duser.country=CN -Duser.language=zh -Duser.variant
156 | java_command: com.android.dx.command.Main --dex --output E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\dex\debug E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\classes\debug E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\support-annotations-22.0.0-1b89459f12f6812f7d1eceb43c124062d6b382a2.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\classes-4deacb5d199d363616a39551de6251552d5e3ad9.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\butterknife-6.1.0-e20f47cf3b9dd8efee4946ba2565b6818087430d.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\library-2.4.0-095c62ac9c8ec950fc0a67655a242e1c15cd6a2d.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\internal_impl-22.0.0-8ecd6513119882ff546ecdaf6c373f560c3f6f19.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\classes-e3095a69e7e42bc327d8de516a88d36e1445ea6c.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\classes-41d7b887eefbdc0f0fd90fd79292f6070e5af498.jar E:\Android-Studio-WorkDir\AndroidPractice\app\build\intermediates\pre-dexed\debug\classes-1e942915a0c9166cbd17c93af0b98196250f2aa6.jar
157 | Launcher Type: SUN_STANDARD
158 |
159 | Environment Variables:
160 | JAVA_HOME=E:\jdk
161 | CLASSPATH=.;E:\jdk\lib\rt.jar;E:\jdk\lib\tools.jar;E:\mysql-connector-java-5.0.8\mysql-connector-java-5.0.8-bin.jar;E:\Tomcat\lib\jsp-api.jar;E:\Tomcat\lib\servlet-api.jar;E:\mysql-connector-java-5.0.8\mysql-connector-java-5.0.8-bin.jar;
162 | PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;D:\MATLAB\bin;D:\MATLAB\bin\win64;D:\NetWork Monitor\;C:\Go\bin;E:\nodejs\;E:\jdk\bin;E:\jdk\jre\bin;E:\adt-bundle-windows-x86_64-20131030\tools;E:\adt-bundle-windows-x86_64-20131030\platform-tools;E:\mysql-5.6.17-winx64\bin;E:\android-ndk-r10;;E:\cygwin64\bin;C:\Users\lgp\AppData\Local\GitHub\PortableGit_054f2e797ebafd44a30203088cd3d58663c627ef\bin;;C:\Users\lgp\.gradle\wrapper\dists\gradle-2.2.1-all\c64ydeuardnfqctvr1gm30w53\gradle-2.2.1\bin;C:\Users\lgp\AppData\Roaming\npm;E:\apache-ant-1.9.4\bin;
163 | USERNAME=lgp
164 | OS=Windows_NT
165 | PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 5, GenuineIntel
166 |
167 |
168 |
169 | --------------- S Y S T E M ---------------
170 |
171 | OS: Windows 8 , 64 bit Build 9200
172 |
173 | CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 37 stepping 5, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, ht, tsc, tscinvbit
174 |
175 | Memory: 4k page, physical 6141472k(964256k free), swap 9287200k(5080k free)
176 |
177 | vm_info: Java HotSpot(TM) 64-Bit Server VM (24.0-b56) for windows-amd64 JRE (1.7.0_40-b43), built on Aug 26 2013 22:38:32 by "java_re" with unknown MS VC++:1600
178 |
179 | time: Mon Apr 06 23:16:55 2015
180 | elapsed time: 1 seconds
181 |
182 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in E:\adt-bundle-windows-x86_64-20131030/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/szu/androidpractice/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 |
21 |
22 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/App.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice;
2 |
3 | import android.app.Application;
4 |
5 | /**
6 | * Created by lgp on 2015/4/6.
7 | */
8 | public class App extends Application{
9 | @Override
10 | public void onCreate() {
11 | super.onCreate();
12 | }
13 |
14 | @Override
15 | public void onTerminate() {
16 | super.onTerminate();
17 | }
18 |
19 | @Override
20 | public void onLowMemory() {
21 | super.onLowMemory();
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/BaseListAdapter.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.View.OnClickListener;
8 | import android.view.ViewGroup;
9 | import android.widget.BaseAdapter;
10 |
11 | import java.util.HashMap;
12 | import java.util.List;
13 | import java.util.Map;
14 |
15 |
16 | @SuppressLint("UseSparseArrays")
17 | public abstract class BaseListAdapter extends BaseAdapter {
18 |
19 | public List list;
20 |
21 | public Context mContext;
22 |
23 | public LayoutInflater mInflater;
24 |
25 | public List getList() {
26 | return list;
27 | }
28 |
29 | public void setList(List list) {
30 | this.list = list;
31 | notifyDataSetChanged();
32 | }
33 |
34 | public void add(E e) {
35 | this.list.add(e);
36 | notifyDataSetChanged();
37 | }
38 |
39 | public void addAll(List list) {
40 | this.list.addAll(list);
41 | notifyDataSetChanged();
42 | }
43 |
44 | public void remove(int position) {
45 | this.list.remove(position);
46 | notifyDataSetChanged();
47 | }
48 |
49 | public BaseListAdapter(Context context, List list) {
50 | super();
51 | this.mContext = context;
52 | this.list = list;
53 | mInflater = LayoutInflater.from(context);
54 | }
55 |
56 | @Override
57 | public int getCount() {
58 | return list.size();
59 | }
60 |
61 | @Override
62 | public E getItem(int position) {
63 | return list.get(position);
64 | }
65 |
66 | @Override
67 | public long getItemId(int position) {
68 | return position;
69 | }
70 |
71 | public View getView(int position, View convertView, ViewGroup parent) {
72 | convertView = bindView(position, convertView, parent);
73 | addInternalClickListener(convertView, position, list.get(position));
74 | return convertView;
75 | }
76 |
77 | public abstract View bindView(int position, View convertView,
78 | ViewGroup parent);
79 |
80 | public Map> canClickItem;
81 |
82 | private void addInternalClickListener(final View itemV, final Integer position, final E valuesMap) {
83 | if (canClickItem != null) {
84 | for (Integer key : canClickItem.keySet()) {
85 | View inView = itemV.findViewById(key);
86 | final onInternalClickListener listener = canClickItem.get(key);
87 | if (inView != null && listener != null) {
88 | inView.setOnClickListener(new OnClickListener() {
89 |
90 | public void onClick(View v) {
91 | listener.OnClickListener(itemV, v, position,
92 | valuesMap);
93 | }
94 | });
95 | inView.setOnLongClickListener(new View.OnLongClickListener() {
96 | @Override
97 | public boolean onLongClick(View v) {
98 | listener.OnLongClickListener(itemV, v, position,
99 | valuesMap);
100 | return true;
101 | }
102 | });
103 | }
104 | }
105 | }
106 | }
107 |
108 | public void setOnInViewClickListener(Integer key,
109 | onInternalClickListener onClickListener) {
110 | if (canClickItem == null)
111 | canClickItem = new HashMap<>();
112 | canClickItem.put(key, onClickListener);
113 | }
114 |
115 | public interface onInternalClickListener {
116 | public void OnClickListener(View parentV, View v, Integer position,
117 | T values);
118 | public void OnLongClickListener(View parentV, View v, Integer position,
119 | T values);
120 | }
121 |
122 | public static class onInternalClickListenerImpl implements onInternalClickListener{
123 | @Override
124 | public void OnClickListener(View parentV, View v, Integer position, T values) {
125 |
126 | }
127 |
128 | @Override
129 | public void OnLongClickListener(View parentV, View v, Integer position, T values) {
130 |
131 | }
132 | }
133 |
134 | }
135 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/DrawerListAdapter.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.szu.androidpractice.R;
10 |
11 | import java.util.List;
12 |
13 | /**
14 | * Created by lgp on 2014/8/27.
15 | */
16 | public class DrawerListAdapter extends BaseListAdapter {
17 |
18 | public DrawerListAdapter(Context mContext, List list) {
19 | super(mContext, list);
20 | }
21 |
22 | @Override
23 | public View bindView(int position, View convertView, ViewGroup parent) {
24 | Holder holder;
25 | if (convertView == null){
26 | convertView = LayoutInflater.from(mContext).inflate(R.layout.simple_list_item_layout, null);
27 | holder = new Holder();
28 | holder.textView = (TextView)convertView.findViewById(R.id.textView);
29 | convertView.setTag(holder);
30 | }else{
31 | holder = (Holder)convertView.getTag();
32 | }
33 | holder.textView.setText(list.get(position));
34 | return convertView;
35 | }
36 |
37 | static class Holder {
38 | TextView textView;
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/HideToolbarOnScrollAdapter.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.content.Context;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.szu.androidpractice.R;
10 |
11 | import java.util.List;
12 |
13 | /**
14 | * Created by lgp on 2015/4/6.
15 | */
16 |
17 | public class HideToolbarOnScrollAdapter extends RecyclerView.Adapter {
18 | private static final int TYPE_HEADER = 0;
19 | private static final int TYPE_ITEM = 1;
20 | private List mItemList;
21 |
22 | public HideToolbarOnScrollAdapter(List itemList) {
23 | this.mItemList = itemList;
24 | }
25 |
26 | @Override
27 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
28 | Context context = parent.getContext();
29 | if (viewType == TYPE_ITEM) {
30 | final View view = LayoutInflater.from(context).inflate(R.layout.recycler_item_layout, parent, false);
31 | return new RecyclerItemViewHolder(view);
32 | } else if (viewType == TYPE_HEADER) {
33 | final View view = LayoutInflater.from(context).inflate(R.layout.recycler_head_layout, parent, false);
34 | return new RecyclerHeadViewHolder(view);
35 | }
36 | return null;
37 | }
38 |
39 | @Override
40 | public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
41 | if (position >= 1){
42 | RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
43 | holder.setItemText(mItemList.get(position - 1));
44 | }
45 | }
46 |
47 | @Override
48 | public int getItemViewType(int position) {
49 | if (position == 0)
50 | return TYPE_HEADER;
51 | return TYPE_ITEM;
52 | }
53 |
54 | @Override
55 | public int getItemCount() {
56 | return (mItemList == null ? 0 : mItemList.size()) + 1;
57 | }
58 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/MainAdapter.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.content.Context;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.szu.androidpractice.R;
10 |
11 | import java.util.List;
12 |
13 | /**
14 | * Created by lgp on 2015/4/6.
15 | */
16 | public class MainAdapter extends RecyclerView.Adapter{
17 | private List mItemList;
18 | public MainAdapter(List itemList) {
19 | this.mItemList = itemList;
20 | }
21 |
22 | @Override
23 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
24 | Context context = parent.getContext();
25 | final View view = LayoutInflater.from(context).inflate(R.layout.recycler_item_layout, parent, false);
26 | return new RecyclerItemViewHolder(view);
27 | }
28 |
29 | @Override
30 | public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
31 | RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
32 | holder.setItemText(mItemList.get(position));
33 | }
34 |
35 | @Override
36 | public int getItemViewType(int position) {
37 | return 0;
38 | }
39 |
40 | @Override
41 | public int getItemCount() {
42 | return mItemList == null ? 0: mItemList.size();
43 | }
44 |
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/RecyclerHeadViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.View;
5 |
6 | /**
7 | * Created by lgp on 2015/4/6.
8 | */
9 | public class RecyclerHeadViewHolder extends RecyclerView.ViewHolder{
10 | public RecyclerHeadViewHolder(View itemView) {
11 | super(itemView);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/RecyclerItemClickListener.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.content.Context;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.GestureDetector;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 |
9 | /**
10 | * Created by lgp on 2015/4/6.
11 | */
12 | public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
13 | private OnItemClickListener mListener;
14 |
15 | public interface OnItemClickListener {
16 | public void onItemClick(View view, int position);
17 | }
18 |
19 | GestureDetector mGestureDetector;
20 |
21 | public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
22 | mListener = listener;
23 | mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
24 | @Override public boolean onSingleTapUp(MotionEvent e) {
25 | return true;
26 | }
27 | });
28 | }
29 |
30 | @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
31 | View childView = view.findChildViewUnder(e.getX(), e.getY());
32 | if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
33 | mListener.onItemClick(childView, view.getChildPosition(childView));
34 | return true;
35 | }
36 | return false;
37 | }
38 |
39 | @Override
40 | public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
41 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/adapter/RecyclerItemViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.adapter;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.View;
5 | import android.widget.TextView;
6 |
7 | import com.szu.androidpractice.R;
8 |
9 | /**
10 | * Created by lgp on 2015/4/6.
11 | */
12 | public class RecyclerItemViewHolder extends RecyclerView.ViewHolder{
13 |
14 | private final TextView mItemTextView;
15 | public RecyclerItemViewHolder(View parent) {
16 | super(parent);
17 | mItemTextView = (TextView) parent.findViewById(R.id.itemTextView);
18 | }
19 | public void setItemText(CharSequence text){
20 | if (mItemTextView != null)
21 | mItemTextView.setText(text);
22 | }
23 | public void setItemText(int text){
24 | if (mItemTextView != null)
25 | mItemTextView.setText(text);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/callback/RecyclerStateListener.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.callback;
2 |
3 | import android.support.v7.widget.LinearLayoutManager;
4 | import android.support.v7.widget.RecyclerView;
5 |
6 | /**
7 | * Created by lgp on 2015/4/6.
8 | */
9 | public abstract class RecyclerStateListener extends RecyclerView.OnScrollListener {
10 |
11 | private static final int HIDE_THRESHOLD = 100;
12 |
13 | private int mScrolledDistance = 0;
14 | private boolean mControlsVisible = true;
15 | private boolean isFirstVisible;
16 | @Override
17 | public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
18 | super.onScrolled(recyclerView, dx, dy);
19 |
20 | int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
21 | if (firstVisibleItem == 0) {
22 | isFirstVisible = true;
23 | if(!mControlsVisible) {
24 | onShow();
25 | mControlsVisible = true;
26 | }
27 | } else {
28 | isFirstVisible = false;
29 | if (mScrolledDistance > HIDE_THRESHOLD && mControlsVisible) {
30 | onHide();
31 | mControlsVisible = false;
32 | mScrolledDistance = 0;
33 | } else if (mScrolledDistance < -HIDE_THRESHOLD && !mControlsVisible) {
34 | onShow();
35 | mControlsVisible = true;
36 | mScrolledDistance = 0;
37 | }
38 | }
39 | if((mControlsVisible && dy>0) || (!mControlsVisible && dy<0)) {
40 | mScrolledDistance += dy;
41 | }
42 | }
43 |
44 | public boolean isFirstVisible() {
45 | return isFirstVisible;
46 | }
47 |
48 | public abstract void onHide();
49 | public abstract void onShow();
50 | }
51 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/BaseActivity.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui;
2 |
3 | import android.annotation.TargetApi;
4 | import android.os.Build;
5 | import android.os.Bundle;
6 | import android.support.v7.app.ActionBarActivity;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.View;
9 | import android.view.WindowManager;
10 |
11 | import com.readystatesoftware.systembartint.SystemBarTintManager;
12 | import com.szu.androidpractice.R;
13 |
14 | /**
15 | * Created by lgp on 2015/4/6.
16 | */
17 | public abstract class BaseActivity extends ActionBarActivity{
18 | private SystemBarTintManager tintManager;
19 |
20 | private View mDecorView;
21 |
22 | private boolean hasHideSystemUi;
23 | @Override
24 | protected void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | initWindow();
27 | }
28 |
29 | protected int getColor(int res){
30 | if (res <= 0)
31 | throw new IllegalArgumentException("resource id can not be less 0");
32 | return getResources().getColor(res);
33 | }
34 |
35 | @TargetApi(19)
36 | private void initWindow(){
37 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
38 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
39 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
40 | tintManager = new SystemBarTintManager(this);
41 | tintManager.setStatusBarTintColor(getColor(R.color.app_main_color));
42 | tintManager.setStatusBarTintEnabled(true);
43 | }
44 | mDecorView = getWindow().getDecorView();
45 | }
46 |
47 | @TargetApi(19)
48 | public void hideSystemUI() {
49 | hasHideSystemUi = true;
50 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
51 | WindowManager.LayoutParams.FLAG_FULLSCREEN);
52 | if (mDecorView != null){
53 | mDecorView.setSystemUiVisibility(
54 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
55 | | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
56 | | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
57 | | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
58 | | View.SYSTEM_UI_FLAG_IMMERSIVE);
59 | }
60 |
61 | if (tintManager != null){
62 | tintManager.setStatusBarTintEnabled(false);
63 | }
64 | }
65 |
66 | @TargetApi(16)
67 | public void showSystemUI() {
68 | hasHideSystemUi = false;
69 | getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
70 | if (mDecorView != null){
71 | mDecorView.setSystemUiVisibility(
72 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
73 | | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
74 | | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
75 | }
76 | if (tintManager != null){
77 | tintManager.setStatusBarTintEnabled(true);
78 | }
79 | }
80 |
81 | public boolean hasNavBar(){
82 | if (tintManager == null)
83 | return false;
84 | SystemBarTintManager.SystemBarConfig config = tintManager.getConfig();
85 | return config.hasNavigtionBar();
86 | }
87 |
88 | public abstract Toolbar getToolbar();
89 | }
90 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.LinearLayoutManager;
6 | import android.support.v7.widget.RecyclerView;
7 | import android.support.v7.widget.Toolbar;
8 | import android.view.MenuItem;
9 | import android.view.View;
10 |
11 | import com.szu.androidpractice.R;
12 | import com.szu.androidpractice.adapter.MainAdapter;
13 | import com.szu.androidpractice.adapter.RecyclerItemClickListener;
14 |
15 | import java.util.ArrayList;
16 | import java.util.List;
17 |
18 | import butterknife.ButterKnife;
19 | import butterknife.InjectView;
20 |
21 | /**
22 | * Created by lgp on 2015/4/6.
23 | */
24 | public class MainActivity extends BaseActivity implements RecyclerItemClickListener.OnItemClickListener {
25 |
26 | @InjectView(R.id.toolbar)
27 | Toolbar toolbar;
28 | @InjectView(R.id.recyclerView)
29 | RecyclerView recyclerView;
30 |
31 | public static final String ITEM_CLICK_KEY = "ITEM_CLICK_KEY";
32 | @Override
33 | protected void onCreate(Bundle savedInstanceState) {
34 | super.onCreate(savedInstanceState);
35 | setContentView(R.layout.activity_main);
36 | ButterKnife.inject(this);
37 | initToolbar();
38 | initRecyclerView();
39 | }
40 |
41 | private void initToolbar(){
42 | toolbar.setTitle(R.string.app_name);
43 | toolbar.setTitleTextColor(getColor(R.color.action_bar_title_color));
44 |
45 | toolbar.inflateMenu(R.menu.menu_main);
46 | toolbar.collapseActionView();
47 | toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
48 | @Override
49 | public boolean onMenuItemClick(MenuItem item) {
50 | // Handle the menu item
51 | switch (item.getItemId()) {
52 | case R.id.setting:
53 | return true;
54 | case R.id.exit:
55 | MainActivity.this.finish();
56 | return true;
57 | case android.R.id.home:
58 | return true;
59 | default:
60 | return false;
61 | }
62 | }
63 | });
64 | //setSupportActionBar(toolbar);
65 | }
66 |
67 | private void initRecyclerView(){
68 | recyclerView.setLayoutManager(new LinearLayoutManager(this));
69 | MainAdapter recyclerAdapter = new MainAdapter(createItemList());
70 | recyclerView.setAdapter(recyclerAdapter);
71 | recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, this));
72 | }
73 |
74 | @Override
75 | public void onItemClick(View view, int position) {
76 | Intent intent = new Intent(this, SampleActivity.class);
77 | Bundle bundle = new Bundle();
78 | bundle.putInt(ITEM_CLICK_KEY, position);
79 | intent.putExtras(bundle);
80 | startActivity(intent);
81 | }
82 |
83 | @Override
84 | public Toolbar getToolbar() {
85 | return toolbar;
86 | }
87 |
88 | private List createItemList() {
89 | List itemList = new ArrayList<>();
90 | itemList.add(getString(R.string.hide_toolbar_onscroll));
91 | itemList.add(getString(R.string.slide_menu));
92 | return itemList;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/SampleActivity.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.widget.Toolbar;
5 | import android.view.KeyEvent;
6 | import android.view.Menu;
7 | import android.view.MenuItem;
8 | import android.view.View;
9 |
10 | import com.szu.androidpractice.R;
11 | import com.szu.androidpractice.ui.fragments.BaseFragment;
12 | import com.szu.androidpractice.ui.fragments.HideToolbarOnScrollFragment;
13 | import com.szu.androidpractice.ui.fragments.SlideMenuFragment;
14 |
15 | import butterknife.ButterKnife;
16 | import butterknife.InjectView;
17 |
18 | /**
19 | * Created by lgp on 2015/4/6.
20 | */
21 | public class SampleActivity extends BaseActivity{
22 | @InjectView(R.id.toolbar)
23 | Toolbar toolbar;
24 | private BaseFragment mFragment;
25 | private int mClickPosition;
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | parseBundle(getIntent().getExtras());
30 | setContentView(R.layout.activity_sample);
31 | ButterKnife.inject(this);
32 | initToolbar();
33 | initFragment();
34 | }
35 |
36 | @Override
37 | public void onWindowFocusChanged(boolean hasFocus) {
38 | super.onWindowFocusChanged(hasFocus);
39 | }
40 |
41 | @Override
42 | public Toolbar getToolbar() {
43 | return toolbar;
44 | }
45 |
46 | private void initToolbar(){
47 | toolbar.setTitle(R.string.app_name);
48 | toolbar.setTitleTextColor(getColor(R.color.action_bar_title_color));
49 | setSupportActionBar(toolbar);
50 | getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
51 | getSupportActionBar().setDisplayHomeAsUpEnabled(true);
52 | }
53 |
54 | private void parseBundle(Bundle bundle){
55 | if (bundle != null){
56 | mClickPosition = bundle.getInt(MainActivity.ITEM_CLICK_KEY);
57 | }
58 | }
59 |
60 | @Override
61 | public boolean onCreateOptionsMenu(Menu menu) {
62 | return true;
63 | }
64 |
65 | @Override
66 | public boolean onOptionsItemSelected(MenuItem item) {
67 | switch (item.getItemId()){
68 | case android.R.id.home:
69 | finish();
70 | break;
71 | default:
72 | return super.onOptionsItemSelected(item);
73 | }
74 | }
75 |
76 | @Override
77 | public boolean onKeyDown(int keyCode, KeyEvent event) {
78 | if (mFragment != null){
79 | if (mFragment.onKeyDown(keyCode, event))
80 | return true;
81 | }
82 | return super.onKeyDown(keyCode, event);
83 | }
84 |
85 | private void initFragment(){
86 | switch (mClickPosition){
87 | case 0:
88 | mFragment = HideToolbarOnScrollFragment.newInstance();
89 | break;
90 | case 1:
91 | mFragment = SlideMenuFragment.newInstance();
92 | break;
93 | default:
94 | break;
95 | }
96 | if (mFragment != null){
97 | getSupportFragmentManager().beginTransaction().replace(R.id.fragment_content, mFragment).commit();
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/SearchActivity.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui;
2 |
3 | import android.app.SearchManager;
4 | import android.content.ComponentName;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.os.Bundle;
8 | import android.support.v4.view.MenuItemCompat;
9 | import android.support.v7.widget.SearchView;
10 | import android.support.v7.widget.Toolbar;
11 | import android.util.Log;
12 | import android.view.Menu;
13 | import android.view.MenuItem;
14 | import android.view.View;
15 |
16 | import com.szu.androidpractice.R;
17 |
18 | import butterknife.ButterKnife;
19 | import butterknife.InjectView;
20 |
21 | /**
22 | * Created by lgp on 2015/4/9.
23 | */
24 | public class SearchActivity extends BaseActivity{
25 | @InjectView(R.id.toolbar)
26 | Toolbar toolbar;
27 | @Override
28 | protected void onCreate(Bundle savedInstanceState) {
29 | super.onCreate(savedInstanceState);
30 | setContentView(R.layout.activity_search_result);
31 | ButterKnife.inject(this);
32 | initToolbar();
33 | }
34 |
35 | @Override
36 | protected void onNewIntent(Intent intent) {
37 | super.onNewIntent(intent);
38 | Log.d("onNewIntent", intent.getAction());
39 | if (Intent.ACTION_SEARCH.equals(intent.getAction())){
40 | handleQuery(intent.getStringExtra(SearchManager.QUERY));
41 | }
42 | }
43 |
44 | @Override
45 | public boolean onCreateOptionsMenu(Menu menu) {
46 | getMenuInflater().inflate(R.menu.menu_search, menu);
47 | SearchManager searchManager =
48 | (SearchManager) getSystemService(Context.SEARCH_SERVICE);
49 | MenuItem searchItem = menu.findItem(R.id.action_search);
50 | searchItem.expandActionView();
51 | SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
52 | ComponentName componentName = getComponentName();
53 |
54 | searchView.setSearchableInfo(
55 | searchManager.getSearchableInfo(componentName));
56 | searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
57 | @Override
58 | public boolean onQueryTextSubmit(String s) {
59 |
60 | return false;
61 | }
62 |
63 | @Override
64 | public boolean onQueryTextChange(String s) {
65 | return false;
66 | }
67 | });
68 | return true;
69 | }
70 |
71 | @Override
72 | public boolean onOptionsItemSelected(MenuItem item) {
73 | return false;
74 | }
75 |
76 | private void initToolbar(){
77 | toolbar.setTitle("");
78 | toolbar.setTitleTextColor(getColor(R.color.action_bar_title_color));
79 | setSupportActionBar(toolbar);
80 | getSupportActionBar().setHomeAsUpIndicator(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
81 | getSupportActionBar().setDisplayHomeAsUpEnabled(true);
82 | toolbar.setNavigationOnClickListener(new View.OnClickListener() {
83 | @Override
84 | public void onClick(View view) {
85 | finish();
86 | }
87 | });
88 | }
89 |
90 | private void handleQuery(String query){
91 | Log.d("handleQuery", query);
92 | }
93 |
94 | @Override
95 | public Toolbar getToolbar() {
96 | return toolbar;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/fragments/BaseFragment.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui.fragments;
2 |
3 | import android.app.Activity;
4 | import android.content.ComponentName;
5 | import android.support.v4.app.Fragment;
6 | import android.view.KeyEvent;
7 |
8 | import com.szu.androidpractice.ui.BaseActivity;
9 |
10 | /**
11 | * Created by lgp on 2015/4/6.
12 | */
13 | public abstract class BaseFragment extends Fragment{
14 | protected BaseActivity activity;
15 | @Override
16 | public void onAttach(Activity activity) {
17 | super.onAttach(activity);
18 | if (activity instanceof BaseActivity){
19 | this.activity = ((BaseActivity)activity);
20 | }
21 | }
22 |
23 | @Override
24 | public void onDetach() {
25 | super.onDetach();
26 | activity = null;
27 | }
28 |
29 | public boolean onKeyDown(int keyCode, KeyEvent event){
30 | return false;
31 | }
32 |
33 | protected void hideSystemUI(){
34 | if (activity != null)
35 | activity.hideSystemUI();
36 | }
37 |
38 | protected void showSystemUI() {
39 | if (activity != null)
40 | activity.showSystemUI();
41 | }
42 |
43 | protected Object getSystemService(String service){
44 | if (activity != null){
45 | return activity.getSystemService(service);
46 | }
47 | return null;
48 | }
49 |
50 | protected ComponentName getComponentName(){
51 | if (activity != null){
52 | return activity.getComponentName();
53 | }
54 | return null;
55 | }
56 |
57 | protected int getColor(int res){
58 | if (res <= 0)
59 | throw new IllegalArgumentException("resource id can not be less 0");
60 | return getResources().getColor(res);
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/fragments/HideToolbarOnScrollFragment.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui.fragments;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.support.v7.widget.Toolbar;
10 | import android.view.LayoutInflater;
11 | import android.view.Menu;
12 | import android.view.MenuInflater;
13 | import android.view.MenuItem;
14 | import android.view.View;
15 | import android.view.ViewGroup;
16 | import android.view.animation.AccelerateInterpolator;
17 | import android.view.animation.DecelerateInterpolator;
18 |
19 | import com.nineoldandroids.animation.Animator;
20 | import com.nineoldandroids.view.ViewPropertyAnimator;
21 | import com.szu.androidpractice.R;
22 | import com.szu.androidpractice.adapter.HideToolbarOnScrollAdapter;
23 | import com.szu.androidpractice.callback.RecyclerStateListener;
24 | import com.szu.androidpractice.ui.BaseActivity;
25 | import com.szu.androidpractice.ui.SearchActivity;
26 |
27 | import java.util.ArrayList;
28 | import java.util.List;
29 |
30 | import butterknife.ButterKnife;
31 | import butterknife.InjectView;
32 |
33 | /**
34 | * Created by lgp on 2015/4/6.
35 | */
36 | public class HideToolbarOnScrollFragment extends BaseFragment{
37 | @InjectView(R.id.recyclerView)
38 | RecyclerView recyclerView;
39 | private Toolbar mToolbar;
40 | private View rootView;
41 |
42 | public static BaseFragment newInstance() {
43 | return new HideToolbarOnScrollFragment();
44 | }
45 |
46 | @Override
47 | public void onCreate(Bundle savedInstanceState) {
48 | super.onCreate(savedInstanceState);
49 | setHasOptionsMenu(true);
50 | }
51 |
52 | @Override
53 | public void onAttach(Activity activity) {
54 | super.onAttach(activity);
55 | if (activity instanceof BaseActivity){
56 | mToolbar = ((BaseActivity)activity).getToolbar();
57 | }
58 | }
59 |
60 | @Override
61 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
62 | super.onActivityCreated(savedInstanceState);
63 | initToolbar();
64 | }
65 |
66 | @Override
67 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
68 | rootView = inflater.inflate(R.layout.fragment_hide_toolbar_onscroll, container, false);
69 | ButterKnife.inject(this, rootView);
70 | initRecyclerView();
71 | return rootView;
72 | }
73 |
74 |
75 | @Override
76 | public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
77 | inflater.inflate(R.menu.menu_options, menu);
78 | }
79 |
80 | @Override
81 | public boolean onOptionsItemSelected(MenuItem item) {
82 | int id = item.getItemId();
83 | switch (id){
84 | case R.id.action_search:
85 | Intent intent = new Intent(getActivity(), SearchActivity.class);
86 | startActivity(intent);
87 | return true;
88 | default:
89 | return super.onOptionsItemSelected(item);
90 | }
91 |
92 | }
93 |
94 | @Override
95 | public void onPause() {
96 | super.onPause();
97 | }
98 |
99 | @Override
100 | public void onResume() {
101 | super.onResume();
102 | }
103 |
104 | private void initRecyclerView(){
105 |
106 | recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
107 | HideToolbarOnScrollAdapter recyclerAdapter = new HideToolbarOnScrollAdapter(createItemList());
108 | recyclerView.setAdapter(recyclerAdapter);
109 | recyclerView.setOnScrollListener(new RecyclerStateListener() {
110 | @Override
111 | public void onHide() {
112 | hideToolbarAndSystemUi();
113 | }
114 |
115 | @Override
116 | public void onShow() {
117 | showToolbarAndSystemUi();
118 | }
119 | });
120 | }
121 |
122 | private void initToolbar(){
123 | if (mToolbar != null){
124 | mToolbar.setTitle(R.string.hide_toolbar_onscroll);
125 | }
126 | }
127 |
128 | private void hideToolbarAndSystemUi() {
129 | if (mToolbar == null)
130 | return;
131 |
132 | ViewPropertyAnimator.animate(mToolbar).translationY(-mToolbar.getHeight())
133 | .setInterpolator(new AccelerateInterpolator(1))
134 | .setListener(new SimpleAnimatorListener(){
135 | @Override
136 | public void onAnimationStart(Animator animation) {
137 | super.onAnimationStart(animation);
138 | hideSystemUI();
139 | }
140 | });
141 |
142 | }
143 |
144 | private void showToolbarAndSystemUi() {
145 | if (mToolbar == null)
146 | return;
147 | ViewPropertyAnimator.animate(mToolbar).translationY(0)
148 | .setInterpolator(new DecelerateInterpolator(1))
149 | .setListener(new SimpleAnimatorListener(){
150 | @Override
151 | public void onAnimationStart(Animator animation) {
152 | super.onAnimationStart(animation);
153 | showSystemUI();
154 | }
155 | });
156 | }
157 | @Override
158 | public void onDetach() {
159 | super.onDetach();
160 | }
161 |
162 | private List createItemList() {
163 | List itemList = new ArrayList<>();
164 | for(int i=0; i<20; i++) {
165 | itemList.add("Item "+i);
166 | }
167 | return itemList;
168 | }
169 |
170 | private void setRecyclerViewPadding(int top){
171 | int left = recyclerView.getPaddingLeft();
172 | int bottom = recyclerView.getPaddingBottom();
173 | int right = recyclerView.getPaddingRight();
174 | recyclerView.setPadding(left, top, right, bottom);
175 | }
176 |
177 | private void setToolbarPadding(int top){
178 | int left = mToolbar.getPaddingLeft();
179 | int bottom = mToolbar.getPaddingBottom();
180 | int right = mToolbar.getPaddingRight();
181 | mToolbar.setPadding(left, top, right, bottom);
182 | }
183 |
184 | public static class SimpleAnimatorListener implements Animator.AnimatorListener{
185 | @Override
186 | public void onAnimationStart(Animator animation) {
187 |
188 | }
189 |
190 | @Override
191 | public void onAnimationEnd(Animator animation) {
192 |
193 | }
194 |
195 | @Override
196 | public void onAnimationCancel(Animator animation) {
197 |
198 | }
199 |
200 | @Override
201 | public void onAnimationRepeat(Animator animation) {
202 |
203 | }
204 | }
205 |
206 | }
207 |
--------------------------------------------------------------------------------
/app/src/main/java/com/szu/androidpractice/ui/fragments/SlideMenuFragment.java:
--------------------------------------------------------------------------------
1 | package com.szu.androidpractice.ui.fragments;
2 |
3 | import android.app.Activity;
4 | import android.content.res.Configuration;
5 | import android.os.Bundle;
6 | import android.support.v4.widget.DrawerLayout;
7 | import android.support.v7.app.ActionBarDrawerToggle;
8 | import android.support.v7.widget.Toolbar;
9 | import android.view.Gravity;
10 | import android.view.KeyEvent;
11 | import android.view.LayoutInflater;
12 | import android.view.Menu;
13 | import android.view.MenuInflater;
14 | import android.view.MenuItem;
15 | import android.view.View;
16 | import android.view.ViewGroup;
17 | import android.widget.AdapterView;
18 | import android.widget.ListView;
19 |
20 | import com.szu.androidpractice.R;
21 | import com.szu.androidpractice.adapter.DrawerListAdapter;
22 | import com.szu.androidpractice.ui.BaseActivity;
23 |
24 | import java.util.ArrayList;
25 | import java.util.List;
26 |
27 | import butterknife.ButterKnife;
28 | import butterknife.InjectView;
29 |
30 | /**
31 | * Created by lgp on 2015/4/13.
32 | */
33 | public class SlideMenuFragment extends BaseFragment{
34 |
35 | @InjectView(R.id.drawer_layout)
36 | DrawerLayout mDrawerLayout;
37 |
38 | @InjectView(R.id.left_drawer)
39 | ListView mDrawerMenuListView;
40 |
41 | private Toolbar mToolbar;
42 |
43 | private ActionBarDrawerToggle mDrawerToggle;
44 |
45 | private int mCurrentTitlePosition = 0;
46 |
47 | public static BaseFragment newInstance() {
48 | return new SlideMenuFragment();
49 | }
50 |
51 | @Override
52 | public void onCreate(Bundle savedInstanceState) {
53 | super.onCreate(savedInstanceState);
54 | setHasOptionsMenu(true);
55 | }
56 |
57 | @Override
58 | public void onAttach(Activity activity) {
59 | super.onAttach(activity);
60 | if (activity instanceof BaseActivity){
61 | mToolbar = ((BaseActivity)activity).getToolbar();
62 | }
63 | }
64 |
65 | @Override
66 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
67 | View view = inflater.inflate(R.layout.fragment_slide_menu, container, false);
68 | ButterKnife.inject(this, view);
69 | init();
70 | return view;
71 | }
72 |
73 | private void init(){
74 | final List list = new ArrayList<>();
75 | list.add("Spring");
76 | list.add("Summer");
77 | list.add("Autumn");
78 | list.add("Winter");
79 | DrawerListAdapter adapter = new DrawerListAdapter(getActivity(), list);
80 | mDrawerMenuListView.setAdapter(adapter);
81 | mDrawerMenuListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
82 | @Override
83 | public void onItemClick(AdapterView> parent, View view, int position, long id) {
84 | mCurrentTitlePosition = position;
85 | mDrawerMenuListView.setItemChecked(position, true);
86 | mDrawerLayout.closeDrawer(parent);
87 |
88 | }
89 | });
90 | mDrawerMenuListView.setItemChecked(mCurrentTitlePosition, true);
91 | setTitle(list.get(mCurrentTitlePosition));
92 | mDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, 0, 0){
93 | @Override
94 | public void onDrawerOpened(View drawerView) {
95 | super.onDrawerOpened(drawerView);
96 | activity.invalidateOptionsMenu();
97 | setTitle(R.string.slide_menu);
98 | }
99 |
100 | @Override
101 | public void onDrawerClosed(View drawerView) {
102 | super.onDrawerClosed(drawerView);
103 | activity.invalidateOptionsMenu();
104 | setTitle(list.get(mCurrentTitlePosition));
105 | }
106 | };
107 | mDrawerToggle.setDrawerIndicatorEnabled(true);
108 | mDrawerLayout.setDrawerListener(mDrawerToggle);
109 | mDrawerLayout.setScrimColor(getColor(R.color.window_background));
110 | }
111 |
112 | @Override
113 | public void onConfigurationChanged(Configuration newConfig) {
114 | super.onConfigurationChanged(newConfig);
115 | mDrawerToggle.onConfigurationChanged(newConfig);
116 | }
117 |
118 | @Override
119 | public void onActivityCreated(Bundle savedInstanceState) {
120 | super.onActivityCreated(savedInstanceState);
121 | mDrawerToggle.syncState();
122 | if (mToolbar != null){
123 | mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
124 | @Override
125 | public void onClick(View v) {
126 | openOrCloseDrawer();
127 | }
128 | });
129 | }
130 | }
131 |
132 | @Override
133 | public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
134 | inflater.inflate(R.menu.menu_slide, menu);
135 | }
136 |
137 | @Override
138 | public boolean onOptionsItemSelected(MenuItem item) {
139 |
140 | if(mDrawerToggle.onOptionsItemSelected(item)) {
141 | return true;
142 | }
143 |
144 | int id = item.getItemId();
145 | switch (id){
146 | case R.id.slide_left:
147 | setMenuListViewGravity(Gravity.START);
148 | return true;
149 | case R.id.slide_right:
150 | setMenuListViewGravity(Gravity.END);
151 | default:
152 | return super.onOptionsItemSelected(item);
153 | }
154 | }
155 |
156 | @Override
157 | public boolean onKeyDown(int keyCode, KeyEvent event) {
158 | if (keyCode == KeyEvent.KEYCODE_BACK && mDrawerLayout.isDrawerOpen(mDrawerMenuListView)){
159 | mDrawerLayout.closeDrawer(mDrawerMenuListView);
160 | return true;
161 | }
162 | return super.onKeyDown(keyCode, event);
163 | }
164 |
165 | private void openOrCloseDrawer() {
166 | if (mDrawerLayout.isDrawerOpen(mDrawerMenuListView)) {
167 | mDrawerLayout.closeDrawer(mDrawerMenuListView);
168 | } else {
169 | mDrawerLayout.openDrawer(mDrawerMenuListView);
170 | }
171 | }
172 |
173 | private void setTitle(int res){
174 | if (mToolbar != null){
175 | mToolbar.setTitle(res);
176 | }
177 | }
178 |
179 | private void setTitle(CharSequence title){
180 | if (mToolbar != null){
181 | mToolbar.setTitle(title);
182 | }
183 | }
184 |
185 | private void setMenuListViewGravity(int gravity){
186 | DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerMenuListView.getLayoutParams();
187 | params.gravity = gravity;
188 | mDrawerMenuListView.setLayoutParams(params);
189 | }
190 | }
191 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/action_more.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/drawable-xhdpi/action_more.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/action_search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/drawable-xhdpi/action_search.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/activated_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_sample.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
10 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_search_result.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_hide_toolbar_onscroll.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_slide_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/recycler_head_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/recycler_item_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/simple_list_item_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_options.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | -
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | -
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_slide.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | -
9 |
10 |
13 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF6347
4 | @android:color/white
5 | #ffbebebe
6 | #fff1f1f1
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | AndroidPractice
3 | HideToolbarOnScroll
4 | Settings
5 | Exit
6 | Search
7 | Sample
8 | SlideMenu
9 | Slide Left
10 | Slide Right
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
19 |
20 |
22 |
23 |
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/searchable.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:1.1.0'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lguipeng/AndroidPractice/faa946abca19126754e0ab8d514546fbdcdb43fa/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Apr 10 15:27:10 PDT 2013
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------