├── .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 | 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 | 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 | 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AndroidPractice.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ###练习Android的例子 2 | ![沉浸式状态栏](http://upload-images.jianshu.io/upload_images/291805-40e8b65486270cd7.png) 3 | ![向下滑动隐藏,向上显示toolbar和状态栏](http://upload-images.jianshu.io/upload_images/291805-655beb2d748a15b4.png) 4 | ![滑动菜单栏](http://upload-images.jianshu.io/upload_images/291805-32a752ef3a2464c3.png) 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 | 8 | 9 | 10 | 11 | 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 | 5 | 9 | 10 | 13 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------