├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── gif │ └── device-2017-11-10-105244.gif ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── choose │ │ └── lm │ │ └── com │ │ └── choosefile │ │ └── MainActivity.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── fileselector ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── choose │ │ └── lm │ │ └── com │ │ └── fileselector │ │ ├── activitys │ │ └── ChooseFileActivity.java │ │ ├── adapters │ │ └── selectrecycleview │ │ │ ├── ChoosePhotoAdapter.java │ │ │ ├── SectionedRecyclerViewAdapter.java │ │ │ └── SectionedSpanSizeLookup.java │ │ ├── base │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ ├── MyApplication.java │ │ ├── abslistview │ │ │ ├── CommonAdapter.java │ │ │ ├── MultiItemTypeAdapter.java │ │ │ ├── ViewHolder.java │ │ │ └── base │ │ │ │ ├── ItemViewDelegate.java │ │ │ │ └── ItemViewDelegateManager.java │ │ └── recyclerview │ │ │ ├── CommonAdapter.java │ │ │ ├── MultiItemTypeAdapter.java │ │ │ ├── base │ │ │ ├── ItemViewDelegate.java │ │ │ ├── ItemViewDelegateManager.java │ │ │ └── ViewHolder.java │ │ │ ├── utils │ │ │ └── WrapperUtils.java │ │ │ └── wrapper │ │ │ ├── EmptyWrapper.java │ │ │ ├── HeaderAndFooterWrapper.java │ │ │ └── LoadmoreWrapper.java │ │ ├── fragments │ │ ├── FileFragment.java │ │ ├── OtherFragment.java │ │ ├── PhotoFragment.java │ │ └── VideoFragment.java │ │ ├── model │ │ ├── FileGroupInfo.java │ │ └── FileInfo.java │ │ ├── utils │ │ ├── DateUtil.java │ │ ├── FileUtil.java │ │ └── LoadFiles.java │ │ └── widget │ │ └── CustomTitleBar.java │ └── res │ ├── drawable-xhdpi │ ├── ico_excel.png │ ├── ico_mp3.png │ ├── ico_other.png │ ├── ico_pdf.png │ ├── ico_pic.png │ ├── ico_ppt.png │ ├── ico_rar.png │ ├── ico_sort_arrow_up.png │ ├── ico_staff_checked.png │ ├── ico_staff_unchecked.png │ ├── ico_txt.png │ ├── ico_video.png │ ├── ico_wj_jt.png │ ├── ico_wj_jt_on.png │ ├── ico_word.png │ ├── im_icon_camera.png │ ├── im_icon_images.png │ └── img_preloading.png │ ├── drawable │ ├── choose_file_up_down.xml │ ├── lib_choose_file_send.xml │ ├── lib_sl_single_choice.xml │ └── nav_ico_left.png │ ├── layout │ ├── lib_activity_choose_file.xml │ ├── lib_base_titlebar_layout.xml │ ├── lib_item_file_group.xml │ ├── lib_item_image_group.xml │ ├── lib_item_photo_fragment.xml │ ├── lib_item_video_fragment.xml │ ├── lib_photo_fragment.xml │ └── lib_video_fragment.xml │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChooseFile 2 | 高仿QQ文件选择器,支持单选和多选 3 | 4 | 5 | ![image](https://github.com/ax3726/ChooseFile/blob/master/app/gif/device-2017-11-10-105244.gif) 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "27.0.0" 6 | defaultConfig { 7 | applicationId "choose.lm.com.choosefile" 8 | minSdkVersion 15 9 | targetSdkVersion 22 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | dataBinding{ 21 | enabled true 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(include: ['*.jar'], dir: 'libs') 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | compile 'com.android.support:appcompat-v7:25.3.1' 31 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 32 | testCompile 'junit:junit:4.12' 33 | compile project(':fileselector') 34 | } 35 | -------------------------------------------------------------------------------- /app/gif/device-2017-11-10-105244.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ax3726/ChooseFile/4bcdfd0f945a4a8b55b4bc2083f2b823047d5d19/app/gif/device-2017-11-10-105244.gif -------------------------------------------------------------------------------- /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 D:\Android\sdk/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 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/choose/lm/com/choosefile/MainActivity.java: -------------------------------------------------------------------------------- 1 | package choose.lm.com.choosefile; 2 | 3 | import android.content.Intent; 4 | import android.view.View; 5 | 6 | import java.util.ArrayList; 7 | 8 | import choose.lm.com.choosefile.databinding.ActivityMainBinding; 9 | import choose.lm.com.fileselector.activitys.ChooseFileActivity; 10 | import choose.lm.com.fileselector.base.BaseActivity; 11 | import choose.lm.com.fileselector.model.FileInfo; 12 | 13 | public class MainActivity extends BaseActivity { 14 | 15 | 16 | @Override 17 | protected int getLayoutId() { 18 | return R.layout.activity_main; 19 | } 20 | 21 | @Override 22 | protected void initData() { 23 | super.initData(); 24 | mBinding.btnStart.setOnClickListener(new View.OnClickListener() { 25 | @Override 26 | public void onClick(View v) { 27 | //发送文件 28 | Intent intent = ChooseFileActivity.newIntent(aty, true);//第二个参数为是否多选 29 | startActivityForResult(intent, 1); 30 | } 31 | }); 32 | 33 | } 34 | 35 | @Override 36 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 37 | super.onActivityResult(requestCode, resultCode, data); 38 | 39 | if (data != null) { 40 | ArrayList list = data.getParcelableArrayListExtra(ChooseFileActivity.FILELISTDATA); 41 | 42 | StringBuilder str = new StringBuilder(); 43 | for (int i = 0; i < list.size(); i++) { 44 | FileInfo fileInfo = list.get(i); 45 | str.append(fileInfo.getFile_path() + "\n"); 46 | } 47 | mBinding.tvShow.setText(str.toString()); 48 | 49 | 50 | } 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 |