├── .gitignore
├── .idea
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── dictionaries
│ └── hcc.xml
├── encodings.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── io
│ │ └── netopen
│ │ └── hotbitmapgg
│ │ └── androideverydaypractice
│ │ └── ApplicationTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── io
│ │ │ └── netopen
│ │ │ └── hotbitmapgg
│ │ │ └── androideverydaypractice
│ │ │ ├── StudyApp.java
│ │ │ ├── activity
│ │ │ ├── CustomWidgetActivity.java
│ │ │ ├── FaceActivity.java
│ │ │ ├── MainActivity.java
│ │ │ ├── MdWidgetActivity.java
│ │ │ ├── PathDemoActivity.java
│ │ │ └── RxJavaActivity.java
│ │ │ ├── adapter
│ │ │ ├── DemoAdapter.java
│ │ │ └── FaceAdapter.java
│ │ │ ├── base
│ │ │ ├── AbsBaseActivity.java
│ │ │ └── LazyFragment.java
│ │ │ ├── demo
│ │ │ └── HeimaDemoActivity.java
│ │ │ ├── interfaces
│ │ │ ├── OnTextChange.java
│ │ │ ├── OneActivity.java
│ │ │ └── TwoActivity.java
│ │ │ ├── model
│ │ │ ├── ExpressionPackage.java
│ │ │ ├── GankMeiziInfo.java
│ │ │ └── GankMeiziResult.java
│ │ │ ├── network
│ │ │ ├── ExpressionPackageApi.java
│ │ │ ├── GankMeiziApi.java
│ │ │ └── RetrofitHelper.java
│ │ │ ├── recycleview
│ │ │ ├── AbsRecyclerViewAdapter.java
│ │ │ ├── AutoLoadOnScrollListener.java
│ │ │ ├── DividerGridItemDecoration.java
│ │ │ ├── DividerItemDecoration.java
│ │ │ ├── MyItemTouchHelper.java
│ │ │ ├── RecycleViewDemoActivity.java
│ │ │ ├── RecycleViewDemoAdapter.java
│ │ │ ├── RecycleViewDemoFragment_1.java
│ │ │ ├── RecycleViewDemoFragment_2.java
│ │ │ ├── RecycleViewItemTouchListener.java
│ │ │ └── loadmore
│ │ │ │ ├── EndlessRecyclerOnScrollListener.java
│ │ │ │ ├── GridSpacingItemDecoration.java
│ │ │ │ └── HeaderViewRecyclerAdapter.java
│ │ │ ├── rxjava
│ │ │ ├── RxBus.java
│ │ │ ├── RxBus2.java
│ │ │ ├── RxJavaDemoActivity.java
│ │ │ ├── RxJavaSampleActivity.java
│ │ │ └── RxTestActivity.java
│ │ │ ├── utils
│ │ │ ├── ACache.java
│ │ │ ├── GankMeiziDateUtil.java
│ │ │ ├── GlideDownloadImageUtil.java
│ │ │ ├── LogUtil.java
│ │ │ └── VibratorUtil.java
│ │ │ ├── widget
│ │ │ ├── image
│ │ │ │ ├── PhotoImageView.java
│ │ │ │ └── RatioImageView.java
│ │ │ ├── loading
│ │ │ │ ├── LoadCircular.java
│ │ │ │ └── LoadCircularCD.java
│ │ │ ├── lovelayout
│ │ │ │ ├── BezierEvaluator.java
│ │ │ │ └── LoveLikeLayout.java
│ │ │ ├── other
│ │ │ │ ├── Bezaer.java
│ │ │ │ ├── Bezaer1.java
│ │ │ │ ├── Bezaer2.java
│ │ │ │ ├── BezaerView.java
│ │ │ │ ├── CircleLoadingView.java
│ │ │ │ ├── CommonView.java
│ │ │ │ ├── CreditSesameNewView.java
│ │ │ │ ├── CustomProgressBar.java
│ │ │ │ ├── DragView.java
│ │ │ │ ├── HackyViewPager.java
│ │ │ │ ├── ItemArrowCardView.java
│ │ │ │ ├── MemoryClearView.java
│ │ │ │ ├── NestedSpringScrollView.java
│ │ │ │ ├── PathDemoView.java
│ │ │ │ ├── SearchViewAnim.java
│ │ │ │ ├── SesameCreditView.java
│ │ │ │ ├── SlackAnimView.java
│ │ │ │ └── SpringScrollView.java
│ │ │ ├── slidecard
│ │ │ │ ├── CardDataItem.java
│ │ │ │ ├── CardItemView.java
│ │ │ │ ├── CardSlidePanel.java
│ │ │ │ └── ViewDragHelper.java
│ │ │ └── tablayout
│ │ │ │ ├── TableView.java
│ │ │ │ └── YZBRate.java
│ │ │ └── widght_demo
│ │ │ ├── BezaerActivity.java
│ │ │ ├── BitmapStudyActivity.java
│ │ │ ├── CircleProgressBarActivity.java
│ │ │ ├── LoveActivity.java
│ │ │ ├── ScrollDemoActivity.java
│ │ │ ├── SlideGankMeiziActivity.java
│ │ │ └── TableActivity.java
│ └── res
│ │ ├── anim
│ │ └── slide_in_right.xml
│ │ ├── drawable-hdpi
│ │ ├── back.png
│ │ ├── ic_arrow.png
│ │ ├── ic_banana.png
│ │ ├── icon_arrow.jpg
│ │ ├── pl_blue.png
│ │ ├── pl_red.png
│ │ └── pl_yellow.png
│ │ ├── drawable
│ │ ├── back_shape.xml
│ │ ├── edit_bg.xml
│ │ ├── ignore_button.xml
│ │ ├── ignore_normal.png
│ │ ├── ignore_pressed.png
│ │ ├── like_button.xml
│ │ ├── like_normal.png
│ │ └── like_pressed.png
│ │ ├── layout
│ │ ├── activity_bitmap_study.xml
│ │ ├── activity_face.xml
│ │ ├── activity_main.xml
│ │ ├── activity_md.xml
│ │ ├── activity_one.xml
│ │ ├── activity_path_demo.xml
│ │ ├── activity_progress.xml
│ │ ├── activity_recycle.xml
│ │ ├── activity_rx_bus.xml
│ │ ├── activity_rx_test.xml
│ │ ├── activity_rxjava.xml
│ │ ├── activity_rxjava_demo.xml
│ │ ├── activity_scroll_demo.xml
│ │ ├── activity_slide_card.xml
│ │ ├── activity_two.xml
│ │ ├── activity_widget.xml
│ │ ├── activity_widget_bezaer.xml
│ │ ├── activity_widget_love.xml
│ │ ├── activity_widget_table.xml
│ │ ├── card_item.xml
│ │ ├── card_item_face.xml
│ │ ├── fragment_rxjava_1.xml
│ │ ├── item_test_1.xml
│ │ ├── layout_item_arrow_view.xml
│ │ ├── layout_line_view.xml
│ │ └── layout_toolbar.xml
│ │ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ │ ├── values-v21
│ │ └── styles.xml
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ └── values
│ │ ├── attr.xml
│ │ ├── circle_loading_style.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── io
│ └── netopen
│ └── hotbitmapgg
│ └── androideverydaypractice
│ └── ExampleUnitTest.java
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── projectFilesBackup
└── .idea
│ └── workspace.xml
└── 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 |
10 | .idea/gradle.xml
11 |
12 | .idea/gradle.xml
13 |
14 | .idea/misc.xml
15 |
16 | .idea/misc.xml
17 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/dictionaries/hcc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AndroidEveryDayPractice
2 |
3 | 个人每日安卓学习代码的提交的项目.
4 |
5 |
6 |
7 | ## 说明
8 |
9 | 该项目是个人学习时代码所提交的项目,感兴趣的可以star一波,共同学习交流.
10 |
11 | * 主要包括
12 | * 自定义控件的练习
13 | * RxJava系列类库的学习
14 | * 各种GitHub上比较火的库的学习与使用
15 | * MD新特性的使用(动画,控件,tips等)
16 | * 学习安卓过程遇到的坑
17 | * 各种Tips
18 |
19 | ## Other
20 |
21 | * 知了日报客户端: https://github.com/HotBitmapGG/RxZhiHu
22 |
23 | * 高仿BiliBili客户端: https://github.com/HotBitmapGG/OhMyBiliBili
24 |
25 | * Gank.IO客户端: https://github.com/HotBitmapGG/StudyProject
26 |
27 | * 妹子福利App: https://github.com/HotBitmapGG/MoeQuest
28 |
29 | * 圆环进度条:https://github.com/HotBitmapGG/RingProgressBar
30 |
31 | * 仿芝麻信用圆环进度: https://github.com/HotBitmapGG/CreditSesameRingView
32 |
33 | * 轻量级的RecycleViewAdapter辅助类库 :https://github.com/HotBitmapGG/EasyRecycleAdapterHelper
34 |
35 |
36 | ## License
37 |
38 | Copyright 2016 HotBitmapGG
39 |
40 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
41 |
42 | http://www.apache.org/licenses/LICENSE-2.0
43 |
44 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
45 |
46 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 | //apply plugin: 'realm-android'
3 |
4 | android {
5 | compileSdkVersion 23
6 | buildToolsVersion "23.0.3"
7 |
8 | defaultConfig {
9 | applicationId "io.netopen.hotbitmapgg.androideverydaypractice"
10 | minSdkVersion 22
11 | targetSdkVersion 23
12 | versionCode 1
13 | versionName "1.0"
14 | }
15 | buildTypes {
16 | release {
17 | minifyEnabled false
18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
19 | }
20 | }
21 | }
22 |
23 | dependencies {
24 | compile fileTree(dir: 'libs', include: ['*.jar'])
25 | testCompile 'junit:junit:4.12'
26 | compile 'com.android.support:support-v4:23.4.0'
27 | compile 'com.android.support:appcompat-v7:23.4.0'
28 | compile 'com.android.support:recyclerview-v7:23.4.0'
29 | compile 'com.android.support:cardview-v7:23.4.0'
30 | compile 'com.android.support:design:23.4.0'
31 | compile 'com.github.bumptech.glide:glide:3.7.0'
32 | compile 'com.jakewharton:butterknife:7.0.1'
33 | compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
34 | compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
35 | compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
36 | compile 'com.squareup.okhttp3:okhttp:3.2.0'
37 | compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
38 | compile 'io.reactivex:rxandroid:1.1.0'
39 | compile 'io.reactivex:rxjava:1.1.0'
40 | compile 'com.jakewharton.rxbinding:rxbinding:0.3.0'
41 | compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.3.0'
42 | compile 'com.jakewharton.rxbinding:rxbinding-design:0.3.0'
43 | compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.0.6@aar'
44 | compile 'com.android.support:support-v13:23.4.0'
45 | compile 'com.trello:rxlifecycle-components:0.6.1'
46 | compile 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
47 | }
48 |
--------------------------------------------------------------------------------
/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 /Users/hcc/Desktop/SDK/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 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/io/netopen/hotbitmapgg/androideverydaypractice/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase
10 | {
11 |
12 | public ApplicationTest()
13 | {
14 |
15 | super(Application.class);
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
26 |
27 |
30 |
31 |
34 |
35 |
36 |
39 |
40 |
41 |
44 |
45 |
46 |
49 |
50 |
51 |
54 |
55 |
56 |
59 |
60 |
61 |
64 |
65 |
66 |
69 |
70 |
71 |
74 |
75 |
76 |
79 |
80 |
81 |
84 |
85 |
86 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/StudyApp.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 |
6 |
7 | public class StudyApp extends Application
8 | {
9 |
10 | public static Context mAppContext;
11 |
12 | @Override
13 | public void onCreate()
14 | {
15 |
16 | super.onCreate();
17 | mAppContext = this;
18 | // // 配置Realm数据库
19 | // RealmConfiguration configuration = new RealmConfiguration.Builder(this).deleteRealmIfMigrationNeeded().schemaVersion(6).migration(new RealmMigration()
20 | // {
21 | //
22 | // @Override
23 | // public void migrate(DynamicRealm realm, long oldVersion, long newVersion)
24 | // {
25 | //
26 | // }
27 | // }).build();
28 | //
29 | // Realm.setDefaultConfiguration(configuration);
30 | }
31 |
32 |
33 | public static Context getContext()
34 | {
35 |
36 | return mAppContext;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/activity/CustomWidgetActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.activity;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.Toolbar;
6 | import android.view.View;
7 |
8 | import butterknife.Bind;
9 | import butterknife.OnClick;
10 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
11 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
12 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.BezaerActivity;
13 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.CircleProgressBarActivity;
14 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.LoveActivity;
15 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.SlideGankMeiziActivity;
16 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.TableActivity;
17 |
18 |
19 | public class CustomWidgetActivity extends AbsBaseActivity
20 | {
21 |
22 | @Bind(R.id.toolbar)
23 | Toolbar mToolbar;
24 |
25 | @Override
26 | public int getLayoutId()
27 | {
28 |
29 | return R.layout.activity_widget;
30 | }
31 |
32 | @Override
33 | public void initViews(Bundle savedInstanceState)
34 | {
35 |
36 | mToolbar.setTitle("自定义控件相关");
37 | mToolbar.setNavigationIcon(R.drawable.back);
38 | mToolbar.setNavigationOnClickListener(new View.OnClickListener()
39 | {
40 |
41 | @Override
42 | public void onClick(View v)
43 | {
44 |
45 | onBackPressed();
46 | }
47 | });
48 | }
49 |
50 | @Override
51 | public void initToolBar()
52 | {
53 |
54 | }
55 |
56 | @OnClick(R.id.widget_1)
57 | void startLoveAnimLayout()
58 | {
59 |
60 | startActivity(new Intent(this, LoveActivity.class));
61 | }
62 |
63 | @OnClick(R.id.widget_2)
64 | void startCircleProgress()
65 | {
66 |
67 | startActivity(new Intent(this, CircleProgressBarActivity.class));
68 | }
69 |
70 | @OnClick(R.id.widget_3)
71 | void startTableView()
72 | {
73 |
74 | startActivity(new Intent(this, TableActivity.class));
75 | }
76 |
77 | @OnClick(R.id.widget_4)
78 | void startBezaerDemo()
79 | {
80 |
81 | startActivity(new Intent(this, BezaerActivity.class));
82 | }
83 |
84 | @OnClick(R.id.widget_5)
85 | void startTanTan()
86 | {
87 |
88 | startActivity(new Intent(this, SlideGankMeiziActivity.class));
89 | }
90 |
91 | @OnClick(R.id.widget_6)
92 | void startPathDemo()
93 | {
94 |
95 | startActivity(new Intent(this, PathDemoActivity.class));
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/activity/MainActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.activity;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.Toolbar;
6 |
7 | import butterknife.Bind;
8 | import butterknife.OnClick;
9 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
10 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
11 |
12 | public class MainActivity extends AbsBaseActivity
13 | {
14 |
15 | @Bind(R.id.toolbar)
16 | Toolbar mToolbar;
17 |
18 | @Override
19 | public int getLayoutId()
20 | {
21 |
22 | return R.layout.activity_main;
23 | }
24 |
25 | @Override
26 | public void initViews(Bundle savedInstanceState)
27 | {
28 |
29 | }
30 |
31 | @Override
32 | public void initToolBar()
33 | {
34 |
35 | mToolbar.setTitle(R.string.app_name);
36 | }
37 |
38 |
39 | @OnClick(R.id.main_btn_1)
40 | void startCustomWidgetActivity()
41 | {
42 |
43 | startActivity(new Intent(MainActivity.this, CustomWidgetActivity.class));
44 | }
45 |
46 |
47 | @OnClick(R.id.main_btn_2)
48 | void startMdWidgetActivity()
49 | {
50 |
51 | startActivity(new Intent(MainActivity.this, MdWidgetActivity.class));
52 | }
53 |
54 |
55 | @OnClick(R.id.main_btn_3)
56 | void startRxJavaActivity()
57 | {
58 |
59 | startActivity(new Intent(MainActivity.this, RxJavaActivity.class));
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/activity/MdWidgetActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.activity;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.Toolbar;
6 | import android.view.View;
7 |
8 | import butterknife.Bind;
9 | import butterknife.OnClick;
10 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
11 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
12 | import io.netopen.hotbitmapgg.androideverydaypractice.recycleview.RecycleViewDemoActivity;
13 | import io.netopen.hotbitmapgg.androideverydaypractice.widght_demo.ScrollDemoActivity;
14 |
15 |
16 | public class MdWidgetActivity extends AbsBaseActivity
17 | {
18 |
19 | @Bind(R.id.toolbar)
20 | Toolbar mToolbar;
21 |
22 | @Override
23 | public int getLayoutId()
24 | {
25 |
26 | return R.layout.activity_md;
27 | }
28 |
29 | @Override
30 | public void initViews(Bundle savedInstanceState)
31 | {
32 |
33 | }
34 |
35 | @Override
36 | public void initToolBar()
37 | {
38 | mToolbar.setTitle("MaterialDesignDemo相关");
39 | mToolbar.setNavigationIcon(R.drawable.back);
40 | mToolbar.setNavigationOnClickListener(new View.OnClickListener()
41 | {
42 |
43 | @Override
44 | public void onClick(View v)
45 | {
46 |
47 | onBackPressed();
48 | }
49 | });
50 | }
51 |
52 |
53 | @OnClick(R.id.md_btn_1)
54 | void startRecycleViewDemo()
55 | {
56 |
57 | startActivity(new Intent(this, RecycleViewDemoActivity.class));
58 | }
59 |
60 | @OnClick(R.id.md_btn_2)
61 | void startScrollDemo()
62 | {
63 |
64 | startActivity(new Intent(this, ScrollDemoActivity.class));
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/activity/PathDemoActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.activity;
2 |
3 | import android.os.Bundle;
4 |
5 | import butterknife.Bind;
6 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
7 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
8 | import io.netopen.hotbitmapgg.androideverydaypractice.widget.other.SlackAnimView;
9 |
10 | /**
11 | * Created by hcc on 16/7/27 21:11
12 | * 100332338@qq.com
13 | */
14 | public class PathDemoActivity extends AbsBaseActivity
15 | {
16 |
17 |
18 | @Bind(R.id.slack_view)
19 | SlackAnimView slackView;
20 |
21 | @Override
22 | public int getLayoutId()
23 | {
24 |
25 | return R.layout.activity_path_demo;
26 | }
27 |
28 | @Override
29 | public void initViews(Bundle savedInstanceState)
30 | {
31 |
32 | slackView.reset();
33 | slackView.start();
34 | }
35 |
36 | @Override
37 | public void initToolBar()
38 | {
39 |
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/activity/RxJavaActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.activity;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.v7.widget.Toolbar;
6 | import android.view.View;
7 |
8 | import butterknife.Bind;
9 | import butterknife.OnClick;
10 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
11 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
12 | import io.netopen.hotbitmapgg.androideverydaypractice.rxjava.RxJavaSampleActivity;
13 | import io.netopen.hotbitmapgg.androideverydaypractice.utils.LogUtil;
14 | import io.netopen.hotbitmapgg.androideverydaypractice.widget.other.ItemArrowCardView;
15 |
16 | public class RxJavaActivity extends AbsBaseActivity
17 | {
18 |
19 | @Bind(R.id.toolbar)
20 | Toolbar mToolbar;
21 |
22 | @Bind(R.id.btn_2)
23 | ItemArrowCardView mRxjavaSample;
24 |
25 |
26 | @Override
27 | public int getLayoutId()
28 | {
29 |
30 | return R.layout.activity_rxjava;
31 | }
32 |
33 | String s1 = "hcc";
34 |
35 | String s2 = new String("hcc");
36 |
37 | String s3 = "h" + "cc";
38 |
39 | @Override
40 | public void initViews(Bundle savedInstanceState)
41 | {
42 |
43 | LogUtil.all(String.valueOf(s1 == s2));
44 | LogUtil.all(String.valueOf(s1 == s3));
45 | LogUtil.all(String.valueOf(s1 == s1.intern()));
46 | }
47 |
48 | @Override
49 | public void initToolBar()
50 | {
51 |
52 | mToolbar.setTitle("RxJava相关");
53 | mToolbar.setNavigationIcon(R.drawable.back);
54 | mToolbar.setNavigationOnClickListener(new View.OnClickListener()
55 | {
56 |
57 | @Override
58 | public void onClick(View v)
59 | {
60 |
61 | onBackPressed();
62 | }
63 | });
64 | }
65 |
66 |
67 | @OnClick(R.id.btn_2)
68 | void startRxJavaSample()
69 | {
70 |
71 | startActivity(new Intent(this, RxJavaSampleActivity.class));
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/adapter/DemoAdapter.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.adapter;
2 |
3 | import android.content.Context;
4 | import android.view.View;
5 | import android.view.ViewGroup;
6 | import android.widget.BaseAdapter;
7 | import android.widget.ImageView;
8 | import android.widget.TextView;
9 |
10 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
11 |
12 | /**
13 | * Created by hcc on 2016/11/25 22:24
14 | * 100332338@qq.com
15 | */
16 |
17 | public class DemoAdapter extends BaseAdapter
18 | {
19 |
20 | Context context;
21 |
22 | @Override
23 | public int getCount()
24 | {
25 |
26 | return 0;
27 | }
28 |
29 | @Override
30 | public Object getItem(int position)
31 | {
32 |
33 | return null;
34 | }
35 |
36 | @Override
37 | public long getItemId(int position)
38 | {
39 |
40 | return 0;
41 | }
42 |
43 | @Override
44 | public View getView(int position, View convertView, ViewGroup parent)
45 | {
46 | ViewHolder viewHolder = null;
47 | if(convertView == null) {
48 | convertView = View.inflate(context, R.layout.item_test_1, null);
49 | viewHolder = new ViewHolder();
50 | viewHolder.mTextView= (TextView) convertView.findViewById(R.id.tab_layout);
51 |
52 | convertView.setTag(viewHolder);
53 |
54 |
55 | }
56 | else
57 | {
58 | viewHolder = (ViewHolder) convertView.getTag();
59 | }
60 |
61 |
62 | return convertView;
63 | }
64 |
65 | private static class ViewHolder
66 | {
67 | public TextView mTextView;
68 |
69 | public ImageView mImageView;
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/adapter/FaceAdapter.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.adapter;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.ImageView;
8 | import android.widget.TextView;
9 |
10 | import com.bumptech.glide.Glide;
11 |
12 | import java.util.ArrayList;
13 | import java.util.List;
14 |
15 | import butterknife.Bind;
16 | import butterknife.ButterKnife;
17 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
18 | import io.netopen.hotbitmapgg.androideverydaypractice.model.ExpressionPackage;
19 | import io.netopen.hotbitmapgg.androideverydaypractice.recycleview.AbsRecyclerViewAdapter;
20 |
21 | /**
22 | * Created by 11 on 2016/4/5.
23 | */
24 | public class FaceAdapter extends AbsRecyclerViewAdapter
25 | {
26 | private List datas = new ArrayList<>();
27 |
28 | public FaceAdapter(RecyclerView recyclerView, List datas)
29 | {
30 | super(recyclerView);
31 | this.datas = datas;
32 | }
33 |
34 | @Override
35 | public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
36 | {
37 | bindContext(parent.getContext());
38 | return new ItemViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.card_item_face, parent, false));
39 | }
40 |
41 | @Override
42 | public void onBindViewHolder(ClickableViewHolder holder, int position)
43 | {
44 | if (holder instanceof ItemViewHolder)
45 | {
46 | ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
47 | Glide.with(getContext()).load(datas.get(position).image_url).into(itemViewHolder.mImg);
48 | itemViewHolder.mTv.setText(datas.get(position).description);
49 | }
50 |
51 | super.onBindViewHolder(holder, position);
52 | }
53 |
54 | @Override
55 | public int getItemCount()
56 | {
57 | return datas == null ? 0 : datas.size();
58 | }
59 |
60 | public class ItemViewHolder extends AbsRecyclerViewAdapter.ClickableViewHolder
61 | {
62 | @Bind(R.id.item_img)
63 | ImageView mImg;
64 |
65 | @Bind(R.id.item_tv)
66 | TextView mTv;
67 |
68 | public ItemViewHolder(View itemView)
69 | {
70 | super(itemView);
71 | ButterKnife.bind(this, itemView);
72 | }
73 | }
74 |
75 | }
76 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/base/AbsBaseActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.base;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 |
6 | import butterknife.ButterKnife;
7 |
8 | public abstract class AbsBaseActivity extends AppCompatActivity
9 | {
10 |
11 | @Override
12 | protected void onCreate(Bundle savedInstanceState)
13 | {
14 |
15 | super.onCreate(savedInstanceState);
16 | //设置布局内容
17 | setContentView(getLayoutId());
18 | //初始化黄油刀控件绑定框架
19 | ButterKnife.bind(this);
20 | //初始化控件
21 | initViews(savedInstanceState);
22 | //初始化ToolBar
23 | initToolBar();
24 | }
25 |
26 |
27 | @Override
28 | protected void onDestroy()
29 | {
30 |
31 | super.onDestroy();
32 | ButterKnife.unbind(this);
33 | }
34 |
35 | public abstract int getLayoutId();
36 |
37 | public abstract void initViews(Bundle savedInstanceState);
38 |
39 | public abstract void initToolBar();
40 | }
41 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/base/LazyFragment.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.base;
2 |
3 | import android.app.Fragment;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.view.LayoutInflater;
7 | import android.view.View;
8 | import android.view.ViewGroup;
9 |
10 | import butterknife.ButterKnife;
11 |
12 | /**
13 | * Tips:
14 | * 这里没有使用V4包下的Fragment 使用了V13下的Fragment
15 | * 都是可以向下兼容的
16 | */
17 | public abstract class LazyFragment extends Fragment
18 | {
19 |
20 | private View rootView;
21 |
22 | @Nullable
23 | @Override
24 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
25 | {
26 |
27 | rootView = inflater.inflate(getLayoutId(), container, false);
28 |
29 | return rootView;
30 | }
31 |
32 | @Override
33 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
34 | {
35 |
36 | super.onViewCreated(view, savedInstanceState);
37 | ButterKnife.bind(this, view);
38 | initViews();
39 | }
40 |
41 | @Override
42 | public void onDetach()
43 | {
44 |
45 | super.onDetach();
46 | }
47 |
48 | public abstract int getLayoutId();
49 |
50 | public abstract void initViews();
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/demo/HeimaDemoActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.demo;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 |
7 | /**
8 | * Created by hcc on 2016/11/19 13:46
9 | * 100332338@qq.com
10 | */
11 |
12 | public class HeimaDemoActivity extends AppCompatActivity
13 | {
14 |
15 | @Override
16 | protected void onCreate(@Nullable Bundle savedInstanceState)
17 | {
18 |
19 | super.onCreate(savedInstanceState);
20 | init();
21 | }
22 |
23 | private void init()
24 | {
25 | //初始化管理员
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/interfaces/OnTextChange.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.interfaces;
2 |
3 | /**
4 | * Created by hcc on 2016/11/16 14:58
5 | * 100332338@qq.com
6 | *
7 | * 接口回调的演示demo
8 | */
9 |
10 | public interface OnTextChange
11 | {
12 |
13 | void textChange(String text);
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/interfaces/OneActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.interfaces;
2 |
3 | import android.content.Intent;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.view.View;
8 | import android.widget.Button;
9 |
10 | import butterknife.Bind;
11 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
12 |
13 | /**
14 | * Created by hcc on 2016/11/16 15:03
15 | * 100332338@qq.com
16 | */
17 |
18 | public class OneActivity extends AppCompatActivity
19 | {
20 |
21 | @Bind(R.id.btn)
22 | Button mButton;
23 |
24 | //把这个接口当做OneActivity的一个变量
25 | private OnTextChange onTextChange;
26 |
27 | //重写set方法
28 | public void setOnTextChange(OnTextChange onTextChange)
29 | {
30 |
31 | this.onTextChange = onTextChange;
32 | }
33 |
34 | @Override
35 | protected void onCreate(@Nullable Bundle savedInstanceState)
36 | {
37 |
38 | super.onCreate(savedInstanceState);
39 | setContentView(R.layout.activity_one);
40 |
41 |
42 | mButton.setOnClickListener(new View.OnClickListener()
43 | {
44 |
45 | @Override
46 | public void onClick(View v)
47 | {
48 | //点击这个按钮回调第二个activity里的文字改变方法
49 | if(onTextChange != null)
50 | onTextChange.textChange("接口回调改变的内容");
51 |
52 | }
53 | });
54 |
55 |
56 | }
57 |
58 | @Override
59 | protected void onActivityResult(int requestCode, int resultCode, Intent data)
60 | {
61 |
62 | super.onActivityResult(requestCode, resultCode, data);
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/interfaces/TwoActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.interfaces;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.widget.TextView;
7 |
8 | import butterknife.Bind;
9 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
10 |
11 | /**
12 | * Created by hcc on 2016/11/16 15:08
13 | * 100332338@qq.com
14 | */
15 |
16 | public class TwoActivity extends AppCompatActivity implements OnTextChange
17 | {
18 |
19 | @Bind(R.id.text_change)
20 | TextView mTv;
21 |
22 | @Override
23 | protected void onCreate(@Nullable Bundle savedInstanceState)
24 | {
25 |
26 | super.onCreate(savedInstanceState);
27 | setContentView(R.layout.activity_two);
28 |
29 | //第二个界面实现文本改变接口 回调textchange方法
30 | new OneActivity().setOnTextChange(this);
31 | }
32 |
33 |
34 | /**
35 | * 这个就是接口回调方法
36 | *
37 | * @param text
38 | */
39 | @Override
40 | public void textChange(String text)
41 | {
42 |
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/model/ExpressionPackage.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.model;
2 |
3 | public class ExpressionPackage
4 | {
5 | public String description;
6 |
7 | public String image_url;
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/model/GankMeiziInfo.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.model;
2 |
3 |
4 | public class GankMeiziInfo
5 | {
6 |
7 | public String _id;
8 |
9 | public String createdAt;
10 |
11 | public String desc;
12 |
13 | public String publishedAt;
14 |
15 | public String source;
16 |
17 | public String type;
18 |
19 | public String url;
20 |
21 | public boolean used;
22 |
23 | public String who;
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/model/GankMeiziResult.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.model;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | import java.util.List;
6 |
7 | public class GankMeiziResult
8 | {
9 |
10 | public boolean error;
11 |
12 | @SerializedName("results")
13 | public List gankMeizis;
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/network/ExpressionPackageApi.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.network;
2 |
3 |
4 | import java.util.List;
5 |
6 | import io.netopen.hotbitmapgg.androideverydaypractice.model.ExpressionPackage;
7 | import retrofit2.http.GET;
8 | import retrofit2.http.Query;
9 | import rx.Observable;
10 |
11 | public interface ExpressionPackageApi
12 | {
13 |
14 | @GET("search")
15 | Observable> search(@Query("q") String query);
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/network/GankMeiziApi.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.network;
2 |
3 |
4 | import io.netopen.hotbitmapgg.androideverydaypractice.model.GankMeiziResult;
5 | import retrofit2.http.GET;
6 | import retrofit2.http.Path;
7 | import rx.Observable;
8 |
9 | public interface GankMeiziApi
10 | {
11 |
12 | @GET("data/福利/{number}/{page}")
13 | Observable getGankMeizi(@Path("number") int number, @Path("page") int page);
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/network/RetrofitHelper.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.network;
2 |
3 | import okhttp3.OkHttpClient;
4 | import retrofit2.Retrofit;
5 | import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
6 | import retrofit2.converter.gson.GsonConverterFactory;
7 |
8 |
9 | public class RetrofitHelper
10 | {
11 |
12 | public static final String BASE_GANK_URL = "http://gank.io/api/";
13 |
14 | public static final String BASE_ZHUANGBI_URL = "http://zhuangbi.info/";
15 |
16 |
17 | /**
18 | * Gank妹子Api
19 | *
20 | * @return
21 | */
22 | public static GankMeiziApi getGankMeiziApi()
23 | {
24 |
25 | Retrofit mRetrofit = new Retrofit.Builder()
26 | .baseUrl(BASE_GANK_URL)
27 | .client(new OkHttpClient())
28 | .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
29 | .addConverterFactory(GsonConverterFactory.create())
30 | .build();
31 |
32 | GankMeiziApi gankMeiziApi = mRetrofit.create(GankMeiziApi.class);
33 |
34 | return gankMeiziApi;
35 | }
36 |
37 | /**
38 | * 表情包搜索Api
39 | *
40 | * @return
41 | */
42 | public static ExpressionPackageApi getExpressionPackageApi()
43 | {
44 |
45 |
46 | Retrofit retrofit = new Retrofit.Builder()
47 | .baseUrl(BASE_ZHUANGBI_URL)
48 | .client(new OkHttpClient())
49 | .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
50 | .addConverterFactory(GsonConverterFactory.create())
51 | .build();
52 |
53 | ExpressionPackageApi expressionPackageApi = retrofit.create(ExpressionPackageApi.class);
54 |
55 | return expressionPackageApi;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/AbsRecyclerViewAdapter.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.IdRes;
5 | import android.support.v7.widget.RecyclerView;
6 | import android.view.View;
7 | import android.view.animation.Animation;
8 | import android.view.animation.AnimationUtils;
9 |
10 | import java.util.ArrayList;
11 | import java.util.List;
12 |
13 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
14 |
15 | /**
16 | * RecycleView通用适配器
17 | */
18 | public abstract class AbsRecyclerViewAdapter extends RecyclerView.Adapter
19 | {
20 |
21 | private Context context;
22 |
23 | protected RecyclerView mRecyclerView;
24 |
25 | private int mLastPosition = -1;
26 |
27 | private static final int DELAY = 138;
28 |
29 | protected List mListeners = new ArrayList();
30 |
31 | public AbsRecyclerViewAdapter(RecyclerView recyclerView)
32 | {
33 |
34 | this.mRecyclerView = recyclerView;
35 | this.mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
36 | {
37 |
38 | @Override
39 | public void onScrollStateChanged(RecyclerView rv, int newState)
40 | {
41 |
42 | for (RecyclerView.OnScrollListener listener : mListeners)
43 | {
44 | listener.onScrollStateChanged(rv, newState);
45 | }
46 | }
47 |
48 | @Override
49 | public void onScrolled(RecyclerView rv, int dx, int dy)
50 | {
51 |
52 | for (RecyclerView.OnScrollListener listener : mListeners)
53 | {
54 | listener.onScrolled(rv, dx, dy);
55 | }
56 | }
57 | });
58 | }
59 |
60 | public void addOnScrollListener(RecyclerView.OnScrollListener listener)
61 | {
62 |
63 | mListeners.add(listener);
64 | }
65 |
66 | public void showItemAnim(final View view, final int position)
67 | {
68 |
69 | if (position > mLastPosition)
70 | {
71 | view.setAlpha(0);
72 | view.postDelayed(new Runnable()
73 | {
74 |
75 | @Override
76 | public void run()
77 | {
78 |
79 | Animation animation = AnimationUtils.loadAnimation(view.getContext(),
80 | R.anim.slide_in_right);
81 | animation.setAnimationListener(new Animation.AnimationListener()
82 | {
83 |
84 | @Override
85 | public void onAnimationStart(Animation animation)
86 | {
87 |
88 | view.setAlpha(1);
89 | }
90 |
91 |
92 | @Override
93 | public void onAnimationEnd(Animation animation)
94 | {
95 |
96 | }
97 |
98 |
99 | @Override
100 | public void onAnimationRepeat(Animation animation)
101 | {
102 |
103 | }
104 | });
105 | view.startAnimation(animation);
106 | }
107 | }, position);
108 | mLastPosition = position;
109 | }
110 | }
111 |
112 | public interface OnItemClickListener
113 | {
114 |
115 | public void onItemClick(int position, ClickableViewHolder holder);
116 | }
117 |
118 | public interface OnItemLongClickListener
119 | {
120 |
121 | public boolean onItemLongClick(int position, ClickableViewHolder holder);
122 | }
123 |
124 | private OnItemClickListener itemClickListener;
125 |
126 | private OnItemLongClickListener itemLongClickListener;
127 |
128 | public void setOnItemClickListener(OnItemClickListener listener)
129 | {
130 |
131 | this.itemClickListener = listener;
132 | }
133 |
134 | public void setOnItemLongClickListener(OnItemLongClickListener listener)
135 | {
136 |
137 | this.itemLongClickListener = listener;
138 | }
139 |
140 | public void bindContext(Context context)
141 | {
142 |
143 | this.context = context;
144 | }
145 |
146 | public Context getContext()
147 | {
148 |
149 | return this.context;
150 | }
151 |
152 | @Override
153 | public void onBindViewHolder(final ClickableViewHolder holder, final int position)
154 | {
155 |
156 | holder.getParentView().setOnClickListener(new View.OnClickListener()
157 | {
158 |
159 | @Override
160 | public void onClick(View v)
161 | {
162 |
163 | if (itemClickListener != null)
164 | {
165 | itemClickListener.onItemClick(position, holder);
166 | }
167 | }
168 | });
169 | holder.getParentView().setOnLongClickListener(new View.OnLongClickListener()
170 | {
171 |
172 | @Override
173 | public boolean onLongClick(View v)
174 | {
175 |
176 | if (itemLongClickListener != null)
177 | {
178 | return itemLongClickListener.onItemLongClick(position, holder);
179 | } else
180 | {
181 | return false;
182 | }
183 | }
184 | });
185 | }
186 |
187 | public class ClickableViewHolder extends RecyclerView.ViewHolder
188 | {
189 |
190 | private View parentView;
191 |
192 | public ClickableViewHolder(View itemView)
193 | {
194 |
195 | super(itemView);
196 | this.parentView = itemView;
197 | }
198 |
199 | public View getParentView()
200 | {
201 |
202 | return parentView;
203 | }
204 |
205 | public T $(@IdRes int id)
206 | {
207 |
208 | return (T) parentView.findViewById(id);
209 | }
210 | }
211 | }
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/AutoLoadOnScrollListener.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.support.v7.widget.LinearLayoutManager;
4 | import android.support.v7.widget.RecyclerView;
5 |
6 | /**
7 | * RecycleView上拉加载更多
8 | */
9 | public abstract class AutoLoadOnScrollListener extends RecyclerView.OnScrollListener
10 | {
11 | private int previousTotal = 0;
12 |
13 | private boolean loading = false;
14 |
15 | int totalItemCount, lastVisibleItem;
16 |
17 | private int currentPage = 1;
18 |
19 | private LinearLayoutManager mLinearLayoutManager;
20 |
21 | public AutoLoadOnScrollListener(LinearLayoutManager linearLayoutManager)
22 | {
23 | this.mLinearLayoutManager = linearLayoutManager;
24 | }
25 |
26 | @Override
27 | public void onScrolled(RecyclerView recyclerView, int dx, int dy)
28 | {
29 | super.onScrolled(recyclerView, dx, dy);
30 |
31 | totalItemCount = mLinearLayoutManager.getItemCount();
32 | lastVisibleItem = mLinearLayoutManager.findLastVisibleItemPosition();
33 |
34 | if (!loading && (lastVisibleItem > totalItemCount - 3) && dy > 0)
35 | {
36 | currentPage++;
37 | onLoadMore(currentPage);
38 | loading = true;
39 | }
40 | }
41 |
42 | public abstract void onLoadMore(int currentPage);
43 |
44 | public boolean isLoading()
45 | {
46 | return loading;
47 | }
48 |
49 | public void setLoading(boolean loading)
50 | {
51 | this.loading = loading;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/DividerItemDecoration.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.content.Context;
4 | import android.content.res.TypedArray;
5 | import android.graphics.Canvas;
6 | import android.graphics.Rect;
7 | import android.graphics.drawable.Drawable;
8 | import android.support.v7.widget.LinearLayoutManager;
9 | import android.support.v7.widget.RecyclerView;
10 | import android.view.View;
11 |
12 |
13 | public class DividerItemDecoration extends RecyclerView.ItemDecoration
14 | {
15 |
16 | private static final int[] ATTRS = new int[]{
17 | android.R.attr.listDivider
18 | };
19 |
20 | public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
21 |
22 | public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
23 |
24 | private Drawable mDivider;
25 |
26 | private int mOrientation;
27 |
28 | public DividerItemDecoration(Context context, int orientation)
29 | {
30 |
31 | final TypedArray a = context.obtainStyledAttributes(ATTRS);
32 | mDivider = a.getDrawable(0);
33 | a.recycle();
34 | setOrientation(orientation);
35 | }
36 |
37 | public void setOrientation(int orientation)
38 | {
39 |
40 | if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
41 | {
42 | throw new IllegalArgumentException("invalid orientation");
43 | }
44 | mOrientation = orientation;
45 | }
46 |
47 | @Override
48 | public void onDraw(Canvas c, RecyclerView parent)
49 | {
50 |
51 | if (mOrientation == VERTICAL_LIST)
52 | {
53 | drawVertical(c, parent);
54 | } else
55 | {
56 | drawHorizontal(c, parent);
57 | }
58 | }
59 |
60 |
61 | public void drawVertical(Canvas c, RecyclerView parent)
62 | {
63 |
64 | final int left = parent.getPaddingLeft();
65 | final int right = parent.getWidth() - parent.getPaddingRight();
66 |
67 | final int childCount = parent.getChildCount();
68 | for (int i = 0; i < childCount; i++)
69 | {
70 | final View child = parent.getChildAt(i);
71 | android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
72 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
73 | .getLayoutParams();
74 | final int top = child.getBottom() + params.bottomMargin;
75 | final int bottom = top + mDivider.getIntrinsicHeight();
76 | mDivider.setBounds(left, top, right, bottom);
77 | mDivider.draw(c);
78 | }
79 | }
80 |
81 | public void drawHorizontal(Canvas c, RecyclerView parent)
82 | {
83 |
84 | final int top = parent.getPaddingTop();
85 | final int bottom = parent.getHeight() - parent.getPaddingBottom();
86 |
87 | final int childCount = parent.getChildCount();
88 | for (int i = 0; i < childCount; i++)
89 | {
90 | final View child = parent.getChildAt(i);
91 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
92 | .getLayoutParams();
93 | final int left = child.getRight() + params.rightMargin;
94 | final int right = left + mDivider.getIntrinsicHeight();
95 | mDivider.setBounds(left, top, right, bottom);
96 | mDivider.draw(c);
97 | }
98 | }
99 |
100 | @Override
101 | public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent)
102 | {
103 |
104 | if (mOrientation == VERTICAL_LIST)
105 | {
106 | outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
107 | } else
108 | {
109 | outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
110 | }
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/RecycleViewDemoActivity.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.app.Fragment;
4 | import android.app.FragmentManager;
5 | import android.os.Bundle;
6 | import android.support.v13.app.FragmentStatePagerAdapter;
7 | import android.support.v4.view.ViewPager;
8 | import android.support.v7.app.ActionBar;
9 | import android.support.v7.widget.Toolbar;
10 | import android.view.MenuItem;
11 |
12 | import com.flyco.tablayout.SlidingTabLayout;
13 |
14 | import java.util.ArrayList;
15 | import java.util.Arrays;
16 | import java.util.List;
17 |
18 | import butterknife.Bind;
19 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
20 | import io.netopen.hotbitmapgg.androideverydaypractice.base.AbsBaseActivity;
21 |
22 | public class RecycleViewDemoActivity extends AbsBaseActivity
23 | {
24 |
25 |
26 | @Bind(R.id.toolbar)
27 | Toolbar mToolBar;
28 |
29 | @Bind(R.id.tab_layout)
30 | SlidingTabLayout mTabLayout;
31 |
32 | @Bind(R.id.viewpager)
33 | ViewPager mViewPager;
34 |
35 | private List titles = Arrays.asList("测试1", "测试2");
36 |
37 | private List fragments = new ArrayList<>();
38 |
39 |
40 | @Override
41 | public int getLayoutId()
42 | {
43 | return R.layout.activity_recycle;
44 | }
45 |
46 | @Override
47 | public void initViews(Bundle savedInstanceState)
48 | {
49 | fragments.add(RecycleViewDemoFragment_1.newInstance());
50 | fragments.add(RecycleViewDemoFragment_2.newInstance());
51 |
52 |
53 | mViewPager.setAdapter(new SamplePagerAdapter(getFragmentManager()));
54 | mTabLayout.setViewPager(mViewPager);
55 |
56 | }
57 |
58 | @Override
59 | public void initToolBar()
60 | {
61 | setSupportActionBar(mToolBar);
62 | ActionBar actionBar = getSupportActionBar();
63 | if (actionBar != null)
64 | actionBar.setDisplayHomeAsUpEnabled(true);
65 | actionBar.setTitle("RecycleView各种用法");
66 | }
67 |
68 | @Override
69 | public boolean onOptionsItemSelected(MenuItem item)
70 | {
71 | if(item.getItemId() == android.R.id.home)
72 | onBackPressed();
73 | return super.onOptionsItemSelected(item);
74 | }
75 |
76 | private class SamplePagerAdapter extends FragmentStatePagerAdapter
77 | {
78 | public SamplePagerAdapter(FragmentManager fm)
79 | {
80 | super(fm);
81 | }
82 |
83 | @Override
84 | public Fragment getItem(int position)
85 | {
86 | return fragments.get(position);
87 | }
88 |
89 | @Override
90 | public CharSequence getPageTitle(int position)
91 | {
92 | return titles.get(position);
93 | }
94 |
95 | @Override
96 | public int getCount()
97 | {
98 | return titles.size();
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/RecycleViewDemoAdapter.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import java.util.ArrayList;
10 | import java.util.Collections;
11 | import java.util.List;
12 |
13 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
14 |
15 |
16 | public class RecycleViewDemoAdapter extends AbsRecyclerViewAdapter implements MyItemTouchHelper.ItemTouchAdapter
17 | {
18 |
19 | private List datas = new ArrayList<>();
20 |
21 | public RecycleViewDemoAdapter(RecyclerView recyclerView, List datas)
22 | {
23 | super(recyclerView);
24 | this.datas = datas;
25 | }
26 |
27 | @Override
28 | public ClickableViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
29 | {
30 | bindContext(parent.getContext());
31 | return new RxjavaDemoViewHolder_1(LayoutInflater.from(getContext()).inflate(R.layout.item_test_1, parent, false));
32 | }
33 |
34 | @Override
35 | public void onBindViewHolder(ClickableViewHolder holder, int position)
36 | {
37 | if (holder instanceof RxjavaDemoViewHolder_1)
38 | {
39 | RxjavaDemoViewHolder_1 viewHolder_1 = (RxjavaDemoViewHolder_1) holder;
40 | viewHolder_1.mTextView.setText(datas.get(position));
41 | }
42 |
43 | super.onBindViewHolder(holder, position);
44 | }
45 |
46 | @Override
47 | public int getItemCount()
48 | {
49 | return datas.size();
50 | }
51 |
52 | @Override
53 | public void onMove(int fromPosition, int toPosition)
54 | {
55 | if (fromPosition < toPosition)
56 | {
57 |
58 | for (int i = fromPosition; i < toPosition; i++)
59 | {
60 | Collections.swap(datas, i, i + 1);
61 | }
62 | }
63 | else
64 | {
65 | for (int i = fromPosition; i > toPosition; i--)
66 | {
67 | Collections.swap(datas, i, i - 1);
68 | }
69 | }
70 |
71 | notifyItemMoved(fromPosition, toPosition);
72 | }
73 |
74 | @Override
75 | public void onSwiped(int position)
76 | {
77 | datas.remove(position);
78 | notifyItemRemoved(position);
79 | }
80 |
81 |
82 | private class RxjavaDemoViewHolder_1 extends AbsRecyclerViewAdapter.ClickableViewHolder
83 | {
84 |
85 | public TextView mTextView;
86 |
87 | public RxjavaDemoViewHolder_1(View itemView)
88 | {
89 | super(itemView);
90 | mTextView = $(R.id.item_text);
91 | }
92 |
93 |
94 | }
95 |
96 | }
97 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/RecycleViewDemoFragment_1.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.graphics.Color;
4 | import android.os.Handler;
5 | import android.support.design.widget.Snackbar;
6 | import android.support.v4.widget.SwipeRefreshLayout;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.support.v7.widget.helper.ItemTouchHelper;
10 | import android.view.View;
11 | import android.view.ViewTreeObserver;
12 |
13 | import java.util.Arrays;
14 | import java.util.List;
15 |
16 | import butterknife.Bind;
17 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
18 | import io.netopen.hotbitmapgg.androideverydaypractice.base.LazyFragment;
19 | import io.netopen.hotbitmapgg.androideverydaypractice.utils.VibratorUtil;
20 |
21 | /**
22 | * RecycleView练习 各种用法汇总
23 | *
24 | * 结合Api 以及Rxjava的使用
25 | *
26 | * 线性列表布局
27 | */
28 | public class RecycleViewDemoFragment_1 extends LazyFragment
29 | {
30 |
31 | @Bind(R.id.recycle)
32 | RecyclerView mRecycleView;
33 |
34 | @Bind(R.id.swipe_refresh)
35 | SwipeRefreshLayout mRefreshLayout;
36 |
37 | private List datas = Arrays.asList("A", "B", "C", "D", "E", "F", "G",
38 | "H", "J", "K", "L", "M", "N",
39 | "O", "P", "Q", "R", "S", "T",
40 | "U", "V", "W", "X", "Y", "Z");
41 | private ItemTouchHelper itemTouchHelper;
42 |
43 | public static RecycleViewDemoFragment_1 newInstance()
44 | {
45 | return new RecycleViewDemoFragment_1();
46 | }
47 |
48 | @Override
49 | public int getLayoutId()
50 | {
51 | return R.layout.fragment_rxjava_1;
52 | }
53 |
54 | @Override
55 | public void initViews()
56 | {
57 |
58 | mRecycleView.setVisibility(View.GONE);
59 | mRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorPrimaryDark);
60 | mRefreshLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
61 | {
62 | @Override
63 | public void onGlobalLayout()
64 | {
65 | mRefreshLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
66 | mRefreshLayout.setRefreshing(true);
67 | loadData();
68 | }
69 | });
70 | mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
71 | {
72 | @Override
73 | public void onRefresh()
74 | {
75 |
76 | mRefreshLayout.setRefreshing(false);
77 | }
78 | });
79 |
80 |
81 | }
82 |
83 | private void loadData()
84 | {
85 | mRecycleView.setHasFixedSize(true);
86 | mRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
87 | RecycleViewDemoAdapter mAdapter = new RecycleViewDemoAdapter(mRecycleView, datas);
88 | itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelper(mAdapter));
89 | itemTouchHelper.attachToRecyclerView(mRecycleView);
90 | mRecycleView.setAdapter(mAdapter);
91 | mRecycleView.addOnItemTouchListener(
92 | new RecycleViewItemTouchListener(mRecycleView)
93 | {
94 |
95 | @Override
96 | public void onLongClick(RecyclerView.ViewHolder vh)
97 | {
98 | itemTouchHelper.startDrag(vh);
99 | //设置长按拖拽震动
100 | VibratorUtil.vibrator(getActivity(), 100);
101 | }
102 |
103 | @Override
104 | public void onItemClick(RecyclerView.ViewHolder vh)
105 | {
106 | int layoutPosition = vh.getLayoutPosition();
107 | Snackbar.make(mRecycleView, datas.get(layoutPosition), Snackbar.LENGTH_SHORT)
108 | .setActionTextColor(Color.YELLOW)
109 | .show();
110 | }
111 | }
112 | );
113 |
114 |
115 | new Handler().postDelayed(new Runnable()
116 | {
117 | @Override
118 | public void run()
119 | {
120 | mRefreshLayout.setRefreshing(false);
121 | mRecycleView.setVisibility(View.VISIBLE);
122 | }
123 | }, 2000);
124 |
125 | }
126 |
127 | }
128 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/RecycleViewDemoFragment_2.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.graphics.Color;
4 | import android.os.Handler;
5 | import android.support.design.widget.Snackbar;
6 | import android.support.v4.widget.SwipeRefreshLayout;
7 | import android.support.v7.widget.GridLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.support.v7.widget.helper.ItemTouchHelper;
10 | import android.view.View;
11 | import android.view.ViewTreeObserver;
12 |
13 | import java.util.Arrays;
14 | import java.util.List;
15 |
16 | import butterknife.Bind;
17 | import io.netopen.hotbitmapgg.androideverydaypractice.R;
18 | import io.netopen.hotbitmapgg.androideverydaypractice.base.LazyFragment;
19 | import io.netopen.hotbitmapgg.androideverydaypractice.utils.VibratorUtil;
20 |
21 | /**
22 | * RecycleView练习 各种用法汇总
23 | *
24 | * 结合Api 以及Rxjava的使用
25 | *
26 | * 表格布局
27 | */
28 | public class RecycleViewDemoFragment_2 extends LazyFragment
29 | {
30 |
31 | @Bind(R.id.recycle)
32 | RecyclerView mRecycleView;
33 |
34 | @Bind(R.id.swipe_refresh)
35 | SwipeRefreshLayout mRefreshLayout;
36 |
37 | private List datas = Arrays.asList("A", "B", "C", "D", "E", "F", "G",
38 | "H", "J", "K", "L", "M", "N",
39 | "O", "P", "Q", "R", "S", "T",
40 | "U", "V", "W", "X", "Y", "Z");
41 | private ItemTouchHelper itemTouchHelper;
42 |
43 | public static RecycleViewDemoFragment_2 newInstance()
44 | {
45 | return new RecycleViewDemoFragment_2();
46 | }
47 |
48 | @Override
49 | public int getLayoutId()
50 | {
51 | return R.layout.fragment_rxjava_1;
52 | }
53 |
54 | @Override
55 | public void initViews()
56 | {
57 |
58 | mRecycleView.setVisibility(View.GONE);
59 | mRefreshLayout.setColorSchemeResources(R.color.colorPrimary, R.color.colorPrimaryDark);
60 | mRefreshLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
61 | {
62 | @Override
63 | public void onGlobalLayout()
64 | {
65 | mRefreshLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
66 | mRefreshLayout.setRefreshing(true);
67 | loadData();
68 | }
69 | });
70 | mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
71 | {
72 | @Override
73 | public void onRefresh()
74 | {
75 |
76 | mRefreshLayout.setRefreshing(false);
77 | }
78 | });
79 |
80 |
81 | }
82 |
83 | private void loadData()
84 | {
85 | mRecycleView.setHasFixedSize(true);
86 | mRecycleView.setLayoutManager(new GridLayoutManager(getActivity(), 3));
87 | mRecycleView.addItemDecoration(new DividerGridItemDecoration());
88 | RecycleViewDemoAdapter mAdapter = new RecycleViewDemoAdapter(mRecycleView, datas);
89 | itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelper(mAdapter));
90 | itemTouchHelper.attachToRecyclerView(mRecycleView);
91 | mRecycleView.setAdapter(mAdapter);
92 | mRecycleView.addOnItemTouchListener(
93 | new RecycleViewItemTouchListener(mRecycleView)
94 | {
95 |
96 | @Override
97 | public void onLongClick(RecyclerView.ViewHolder vh)
98 | {
99 | itemTouchHelper.startDrag(vh);
100 | //设置长按拖拽震动
101 | VibratorUtil.vibrator(getActivity(), 100);
102 | }
103 |
104 | @Override
105 | public void onItemClick(RecyclerView.ViewHolder vh)
106 | {
107 | int layoutPosition = vh.getLayoutPosition();
108 | Snackbar.make(mRecycleView, datas.get(layoutPosition), Snackbar.LENGTH_SHORT)
109 | .setActionTextColor(Color.YELLOW)
110 | .show();
111 | }
112 | }
113 | );
114 |
115 |
116 | new Handler().postDelayed(new Runnable()
117 | {
118 | @Override
119 | public void run()
120 | {
121 | mRefreshLayout.setRefreshing(false);
122 | mRecycleView.setVisibility(View.VISIBLE);
123 | }
124 | }, 2000);
125 |
126 | }
127 |
128 | }
129 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/RecycleViewItemTouchListener.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview;
2 |
3 | import android.support.v4.view.GestureDetectorCompat;
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 | public class RecycleViewItemTouchListener implements RecyclerView.OnItemTouchListener
11 | {
12 | private GestureDetectorCompat mGestureDetector;
13 |
14 | private RecyclerView mRcycleView;
15 |
16 | public RecycleViewItemTouchListener(RecyclerView mRcycleView)
17 | {
18 | this.mRcycleView = mRcycleView;
19 | mGestureDetector = new GestureDetectorCompat(mRcycleView.getContext(),
20 | new ItemTouchHelperGestureLisener());
21 | }
22 |
23 | @Override
24 | public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e)
25 | {
26 | mGestureDetector.onTouchEvent(e);
27 | return false;
28 | }
29 |
30 | @Override
31 | public void onTouchEvent(RecyclerView rv, MotionEvent e)
32 | {
33 | mGestureDetector.onTouchEvent(e);
34 | }
35 |
36 | @Override
37 | public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept)
38 | {
39 |
40 | }
41 |
42 |
43 | /**
44 | * 监听手执触摸事件回调
45 | *
46 | * 单击事件 和 长按事件
47 | */
48 | private class ItemTouchHelperGestureLisener extends GestureDetector.SimpleOnGestureListener
49 | {
50 |
51 |
52 | @Override
53 | public boolean onSingleTapUp(MotionEvent e)
54 | {
55 | View childViewUnder = mRcycleView.findChildViewUnder(e.getX(), e.getY());
56 | if (childViewUnder != null)
57 | {
58 | RecyclerView.ViewHolder viewHolder = mRcycleView.getChildViewHolder(childViewUnder);
59 | onItemClick(viewHolder);
60 | }
61 |
62 | return true;
63 | }
64 |
65 | @Override
66 | public void onLongPress(MotionEvent e)
67 | {
68 | View childViewUnder = mRcycleView.findChildViewUnder(e.getX(), e.getY());
69 | if (childViewUnder != null)
70 | {
71 | RecyclerView.ViewHolder viewHolder = mRcycleView.getChildViewHolder(childViewUnder);
72 | onLongClick(viewHolder);
73 | }
74 |
75 | super.onLongPress(e);
76 | }
77 |
78 |
79 | }
80 |
81 |
82 | public void onLongClick(RecyclerView.ViewHolder vh)
83 | {
84 | }
85 |
86 | public void onItemClick(RecyclerView.ViewHolder vh)
87 | {
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/loadmore/EndlessRecyclerOnScrollListener.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview.loadmore;
2 |
3 | import android.support.v7.widget.LinearLayoutManager;
4 | import android.support.v7.widget.RecyclerView;
5 |
6 | /**
7 | * RecycleView上拉加载更多
8 | */
9 | public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener
10 | {
11 |
12 | public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();
13 |
14 | private int previousTotal = 0;
15 |
16 | private boolean loading = true;
17 |
18 | int lastCompletelyVisiableItemPosition, visibleItemCount, totalItemCount;
19 |
20 | private int currentPage = 1;
21 |
22 | private LinearLayoutManager mLinearLayoutManager;
23 |
24 | public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager)
25 | {
26 |
27 | this.mLinearLayoutManager = linearLayoutManager;
28 | }
29 |
30 | @Override
31 | public void onScrolled(RecyclerView recyclerView, int dx, int dy)
32 | {
33 |
34 | super.onScrolled(recyclerView, dx, dy);
35 |
36 | visibleItemCount = recyclerView.getChildCount();
37 | totalItemCount = mLinearLayoutManager.getItemCount();
38 | lastCompletelyVisiableItemPosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
39 |
40 | if (loading)
41 | {
42 | if (totalItemCount > previousTotal)
43 | {
44 | loading = false;
45 | previousTotal = totalItemCount;
46 | }
47 | }
48 | if (!loading
49 | && (visibleItemCount > 0)
50 | && (lastCompletelyVisiableItemPosition >= totalItemCount - 1))
51 | {
52 | currentPage++;
53 | onLoadMore(currentPage);
54 | loading = true;
55 | }
56 | }
57 |
58 | public abstract void onLoadMore(int currentPage);
59 | }
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/recycleview/loadmore/GridSpacingItemDecoration.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.recycleview.loadmore;
2 |
3 | import android.graphics.Rect;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.View;
6 |
7 | /**
8 | * Grid分割线
9 | */
10 | public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration
11 | {
12 |
13 | private int spanCount;
14 |
15 | private int spacing;
16 |
17 | private boolean includeEdge;
18 |
19 | private int headerNum;
20 |
21 | public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge, int headerNum)
22 | {
23 |
24 | this.spanCount = spanCount;
25 | this.spacing = spacing;
26 | this.includeEdge = includeEdge;
27 | this.headerNum = headerNum;
28 | }
29 |
30 | @Override
31 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
32 | {
33 |
34 | int position = parent.getChildAdapterPosition(view) - headerNum; // item position
35 |
36 | if (position >= 0)
37 | {
38 | int column = position % spanCount; // item column
39 |
40 | if (includeEdge)
41 | {
42 | outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
43 | outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)
44 |
45 | if (position < spanCount)
46 | { // top edge
47 | outRect.top = spacing;
48 | }
49 | outRect.bottom = spacing; // item bottom
50 | } else
51 | {
52 | outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing)
53 | outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing)
54 | if (position >= spanCount)
55 | {
56 | outRect.top = spacing; // item top
57 | }
58 | }
59 | } else
60 | {
61 | outRect.left = 0;
62 | outRect.right = 0;
63 | outRect.top = 0;
64 | outRect.bottom = 0;
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/app/src/main/java/io/netopen/hotbitmapgg/androideverydaypractice/rxjava/RxBus.java:
--------------------------------------------------------------------------------
1 | package io.netopen.hotbitmapgg.androideverydaypractice.rxjava;
2 |
3 | import android.support.annotation.NonNull;
4 |
5 | import java.util.HashMap;
6 | import java.util.Map;
7 |
8 | import rx.Observable;
9 | import rx.subjects.PublishSubject;
10 | import rx.subjects.Subject;
11 |
12 | /**
13 | * Rxbus
14 | * 如果项目中已使用Rxjava
15 | * 可以使用Rxbus这种思想来替换掉EventBus 或者 Otto
16 | * 这类事件总线的开源库, 毕竟65535方法数还是很容易达到的
17 | */
18 | public class RxBus
19 | {
20 |
21 | private static Map