├── .gitignore ├── .travis.yml ├── README-cn.md ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── cc │ │ └── solart │ │ └── turbo │ │ └── simple │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── cc │ │ │ └── solart │ │ │ └── turbo │ │ │ └── simple │ │ │ ├── CursorActivity.java │ │ │ ├── EmptyActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── MultiTypeActivity.java │ │ │ ├── SimpleActivity.java │ │ │ ├── adapter │ │ │ ├── MovieCursorAdapter.java │ │ │ ├── MultiTypeAdapter.java │ │ │ └── SimpleAdapter.java │ │ │ ├── model │ │ │ └── MultiModel.java │ │ │ └── provider │ │ │ ├── MovieContentProvider.java │ │ │ ├── MovieContract.java │ │ │ └── MyDatabaseHelper.java │ └── res │ │ ├── drawable │ │ ├── bed_1.jpeg │ │ └── cover_1.jpeg │ │ ├── layout │ │ ├── activity_cursor.xml │ │ ├── activity_empty.xml │ │ ├── activity_main.xml │ │ ├── activity_multi_type.xml │ │ ├── activity_simple.xml │ │ ├── empty.xml │ │ ├── item_footer.xml │ │ ├── item_header.xml │ │ ├── item_simple.xml │ │ ├── item_type_1.xml │ │ ├── item_type_2.xml │ │ └── item_type_3.xml │ │ ├── menu │ │ └── simple.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-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── cc │ └── solart │ └── turbo │ └── simple │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── preview ├── example.jpg ├── multi.gif ├── simple.gif └── turbo_demo.apk ├── settings.gradle └── turbo-recyclerview-helper ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── cc │ └── solart │ └── turbo │ └── ApplicationTest.java ├── main ├── AndroidManifest.xml ├── java │ └── cc │ │ └── solart │ │ └── turbo │ │ ├── AbsTurboAdapter.java │ │ ├── BaseCursorAdapter.java │ │ ├── BaseTurboAdapter.java │ │ ├── BaseViewHolder.java │ │ ├── CursorFilter.java │ │ ├── OnItemClickListener.java │ │ ├── OnItemLongClickListener.java │ │ ├── OnLoadMoreListener.java │ │ ├── TurboRecyclerView.java │ │ └── decoration │ │ ├── BaseGridItemDecoration.java │ │ ├── BaseItemDecoration.java │ │ ├── GridOffsetsItemDecoration.java │ │ ├── GridSpanOffsetsItemDecoration.java │ │ ├── LinearDividerItemDecoration.java │ │ └── LinearOffsetsItemDecoration.java └── res │ ├── drawable │ ├── sample_footer_loading.png │ └── sample_footer_loading_progress.xml │ ├── layout │ └── footer_item_default_loading.xml │ └── values │ ├── attrs.xml │ ├── dimens.xml │ └── strings.xml └── test └── java └── cc └── solart └── turbo └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - platform-tools 5 | - tools 6 | - build-tools-23.0.2 7 | - android-23 8 | - extra-android-m2repository 9 | 10 | branches: 11 | only: 12 | - master 13 | 14 | notifications: 15 | email: false 16 | 17 | before_install: 18 | 19 | # for gradle output style 20 | - export TERM=dumb 21 | 22 | # environment info 23 | - ./gradlew -v 24 | - uname -a 25 | 26 | # Let's try to build... 27 | 28 | script: 29 | - ./gradlew -------------------------------------------------------------------------------- /README-cn.md: -------------------------------------------------------------------------------- 1 | 2 | TurboRecyclerViewHelper project 3 | =============================== 4 | 5 | >* **[实现RecyclerView的功能扩展](http://solart.cc/2016/06/01/turbo-recyclerview-helper-1/)** 6 | >* **[实现Adapter的优化封装](http://solart.cc/2016/06/18/turbo-recyclerview-helper-2/)** 7 | 8 | Travis master: [![Build Status](https://api.travis-ci.org/Solartisan/TurboRecyclerViewHelper.svg?branch=master)](https://travis-ci.org/Solartisan/TurboRecyclerViewHelper) 9 | 10 | 一个强大并且灵活的RecyclerView库。欢迎大家使用(如果您喜欢,希望您能star一下,你的支持对我来说是巨大的动力) 11 | 12 | 13 | 14 | 15 | 展示一个实例(配合GridSpanOffsetsItemDecoration实现) 16 | 17 | 18 | 19 | 20 | 有哪些功能([download apk](https://github.com/Solartisan/TurboRecyclerViewHelper/raw/master/preview/turbo_demo.apk)) 21 | ----------------------------------------------------------------------------------------------------------------- 22 | * **上拉/左滑加载更多** 23 | * 为什么不做下拉刷新?因为有太多强大而炫酷的下拉刷新控件,目前针对RecyclerView的上拉加载大都没有拖拽过渡效果,所以针对这种情况实现了有过渡效果的上拉加载部分的实现 24 | * **支持设置EmptyView** 25 | * 在数据为null时显示一个EmptyView提示用户(类似ListView.setEmptyView) 26 | * **支持添加Header和Footer** 27 | * **支持添加点击事件和长按事件** 28 | * 通过给item添加点击事件实现(1.0.2之前版本通过OnItemTouch方案实现,但存在没有点击效果的bug,如有更好的方案劳烦告知。) 29 | * **支持自定义加载Footer** 30 | * 可以通过自定义自己应用的加载效果 31 | * **支持加载数据库数据** 32 | * 可配合CursorLoader加载Cursor 33 | * **支持多种自定义ItemDecoration辅助布局** 34 | 35 | 36 | 37 | Gradle 38 | --- 39 | ``` 40 | dependencies { 41 | ... 42 | compile 'cc.solart:turbo-recyclerview-helper:1.2.1' 43 | } 44 | ``` 45 | 46 | 47 | 如何使用 48 | --- 49 | #### **在布局文件中添加`TurboRecyclerView`** 50 | 51 | ```xml 52 | 58 | ``` 59 | 60 | #### **创建一个简单的适配器继承于`BaseTurboAdapter`** 61 | 62 | ```java 63 | public class SimpleAdapter extends BaseTurboAdapter { 64 | 65 | public SimpleAdapter(Context context) { 66 | super(context); 67 | } 68 | 69 | public SimpleAdapter(Context context, List data) { 70 | super(context, data); 71 | } 72 | 73 | @Override 74 | protected SimpleViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { 75 | return new SimpleViewHolder(inflateItemView(R.layout.item_simple, parent)); 76 | } 77 | 78 | @Override 79 | protected void convert(SimpleViewHolder holder, String item) { 80 | holder.tv.setText(item); 81 | } 82 | 83 | 84 | class SimpleViewHolder extends BaseViewHolder { 85 | 86 | TextView tv; 87 | 88 | protected SimpleViewHolder(View view) { 89 | super(view); 90 | tv = findViewById(R.id.simple_text); 91 | } 92 | } 93 | } 94 | ``` 95 | 96 | #### **添加Header和Footer** 97 | 98 | ```java 99 | mAdapter = new SimpleAdapter(this, Arrays.asList(sCheeseStrings)); 100 | View header = LayoutInflater.from(this).inflate(R.layout.item_header, (ViewGroup) mRecyclerView.getParent(), false); 101 | mAdapter.addHeaderView(header); 102 | View footer = LayoutInflater.from(this).inflate(R.layout.item_footer, (ViewGroup) mRecyclerView.getParent(), false); 103 | mAdapter.addFooterView(footer); 104 | mRecyclerView.setAdapter(mAdapter); 105 | mRecyclerView.setLoadMoreEnabled(true); 106 | ``` 107 | 108 | #### **添加点击和长按事件** 109 | 110 | ```java 111 | mAdapter.addOnItemClickListener(new OnItemClickListener() { 112 | @Override 113 | public void onItemClick(RecyclerView.ViewHolder vh, int position) { 114 | Toast.makeText(SimpleActivity.this, "您点击了第" + position + "个item", Toast.LENGTH_SHORT).show(); 115 | } 116 | }); 117 | ``` 118 | 119 | #### **允许启用上拉加载以及添加监听事件** 120 | 121 | ```java 122 | mRecyclerView.setLoadMoreEnabled(true);//or use enableLoad in xml 123 | mRecyclerView.addOnLoadingMoreListener(new OnLoadMoreListener() { 124 | @Override 125 | public void onLoadingMore() { 126 | handler.postDelayed(new Runnable() { 127 | @Override 128 | public void run() { 129 | mRecyclerView.loadMoreComplete(Arrays.asList(sCheeseStrings)); 130 | } 131 | }, 2000); 132 | } 133 | }); 134 | ``` 135 | 136 | 137 | 更新日志 138 | --- 139 | * **1.0.0-beta** 140 | * Initial release 141 | * **1.0.1-beta** 142 | * 添加styleable属性 143 | * **1.0.2-beta** 144 | * 修复EmptyView显示时仍可上拉的bug 145 | * 修改Item点击和长按的实现方案 146 | * **1.0.3-beta** 147 | * 修复遗漏的泛型值 148 | * **1.0.4-beta** 149 | * 修复在检测是否为空状态时类型转换异常的bug 150 | * **1.0.5-beta** 151 | * 修复调用者setSpanSizeLookup被覆盖(这意味着你必须自己处理GridLayoutManager中FullSpan的类型) 152 | * **1.0.6-beta** 153 | * 修复在不能滑动的方向上Touch事件处理引起的异常刷新 154 | * **1.0.7-beta** 155 | * 修复itemView为AdapterView时注册点击事件抛出异常 156 | * **1.0.8-beta** 157 | * 修复滑动到底部不响应点击事件的bug 158 | * **1.0.9-beta** 159 | * 添加removeData(List data)方法 160 | * **1.1.0** 161 | * 重构Adapter,新增BaseCursorAdapter 162 | * **1.2.0** 163 | * 新增decoration包,辅助构建布局间距 164 | * **1.2.1** 165 | * 更改addData为局部刷新的方式 166 | * 修复swapCursor错误 167 | 168 | 169 | 170 | 感谢 171 | --- 172 | [base-adapter-helper](https://github.com/JoanZapata/base-adapter-helper) 173 | 174 | [RecyclerItemDecoration](https://github.com/dinuscxj/RecyclerItemDecoration) 175 | ​ 176 | 许可 177 | --- 178 | 179 | Copyright (C) 2016 solartisan/imilk 180 | 181 | Licensed under the Apache License, Version 2.0 (the "License"); 182 | you may not use this file except in compliance with the License. 183 | You may obtain a copy of the License at 184 | 185 | http://www.apache.org/licenses/LICENSE-2.0 186 | 187 | Unless required by applicable law or agreed to in writing, software 188 | distributed under the License is distributed on an "AS IS" BASIS, 189 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 190 | See the License for the specific language governing permissions and 191 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TurboRecyclerViewHelper project([中文文档](https://github.com/Solartisan/TurboRecyclerViewHelper/blob/master/README-cn.md)) 2 | ======================================================================================================================= 3 | 4 | Travis master: [![Build Status](https://api.travis-ci.org/Solartisan/TurboRecyclerViewHelper.svg?branch=master)](https://travis-ci.org/Solartisan/TurboRecyclerViewHelper) 5 | 6 | A library that powerful and flexible RecyclerView. 7 | Like us if you love our work. your support is great power for us. 8 | 9 | 10 | 11 | 12 | Features([download apk](https://github.com/Solartisan/TurboRecyclerViewHelper/raw/master/preview/turbo_demo.apk)) 13 | ----------------------------------------------------------------------------------------------------------------- 14 | * **RecyclerView upward sliding/left sliding load** 15 | * **Supports setEmptyView** 16 | * **Supports add HeaderView and FooterView** 17 | * **Supports item click and long click** 18 | * **Supports custom load view** 19 | * **Supports loading database data** 20 | * **Support for a variety of custom ItemDecoration layout** 21 | 22 | Gradle 23 | --- 24 | ``` 25 | dependencies { 26 | ... 27 | compile 'cc.solart:turbo-recyclerview-helper:1.2.1' 28 | } 29 | ``` 30 | 31 | Usage 32 | --- 33 | #### **use `TurboRecyclerView` in the layout file** 34 | 35 | ```xml 36 | 42 | ``` 43 | 44 | #### **create a simple adapter extends `BaseTurboAdapter`** 45 | 46 | ```java 47 | public class SimpleAdapter extends BaseTurboAdapter { 48 | 49 | public SimpleAdapter(Context context) { 50 | super(context); 51 | } 52 | 53 | public SimpleAdapter(Context context, List data) { 54 | super(context, data); 55 | } 56 | 57 | @Override 58 | protected SimpleViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { 59 | return new SimpleViewHolder(inflateItemView(R.layout.item_simple, parent)); 60 | } 61 | 62 | @Override 63 | protected void convert(SimpleViewHolder holder, String item) { 64 | holder.tv.setText(item); 65 | } 66 | 67 | 68 | class SimpleViewHolder extends BaseViewHolder { 69 | 70 | TextView tv; 71 | 72 | protected SimpleViewHolder(View view) { 73 | super(view); 74 | tv = findViewById(R.id.simple_text); 75 | } 76 | } 77 | } 78 | ``` 79 | 80 | #### **add HeaderView and FooterView** 81 | 82 | ```java 83 | mAdapter = new SimpleAdapter(this, Arrays.asList(sCheeseStrings)); 84 | View header = LayoutInflater.from(this).inflate(R.layout.item_header, (ViewGroup) mRecyclerView.getParent(), false); 85 | mAdapter.addHeaderView(header); 86 | View footer = LayoutInflater.from(this).inflate(R.layout.item_footer, (ViewGroup) mRecyclerView.getParent(), false); 87 | mAdapter.addFooterView(footer); 88 | mRecyclerView.setAdapter(mAdapter); 89 | mRecyclerView.setLoadMoreEnabled(true); 90 | ``` 91 | 92 | #### **add `OnItemClickListener`** 93 | 94 | ```java 95 | mAdapter.addOnItemClickListener(new OnItemClickListener() { 96 | @Override 97 | public void onItemClick(RecyclerView.ViewHolder vh, int position) { 98 | Toast.makeText(SimpleActivity.this, "您点击了第" + position + "个item", Toast.LENGTH_SHORT).show(); 99 | } 100 | }); 101 | ``` 102 | 103 | #### **enable loading more and add `OnLoadingMoreListener`** 104 | 105 | ```java 106 | mRecyclerView.setLoadMoreEnabled(true);//or use enableLoad in xml 107 | mRecyclerView.addOnLoadingMoreListener(new OnLoadMoreListener() { 108 | @Override 109 | public void onLoadingMore() { 110 | handler.postDelayed(new Runnable() { 111 | @Override 112 | public void run() { 113 | mRecyclerView.loadMoreComplete(Arrays.asList(sCheeseStrings)); 114 | } 115 | }, 2000); 116 | } 117 | }); 118 | ``` 119 | 120 | Changelog 121 | --- 122 | * **1.0.0-beta** 123 | * Initial release 124 | * **1.0.1-beta** 125 | * Add styleable 126 | * **1.0.2-beta** 127 | * Fix empty state can be refreshed 128 | * Modify click/long click 129 | * **1.0.3-beta** 130 | * Fix missing generic type 131 | * **1.0.4-beta** 132 | * Fix ClassCastException in isEmpty() 133 | * **1.0.5-beta** 134 | * Fix setSpanSizeLookup invalid 135 | * **1.0.6-beta** 136 | * Fix incorrect slide direction cause refresh 137 | * **1.0.7-beta** 138 | * Fix AdapterView setOnClick exception 139 | * **1.0.8-beta** 140 | * Fix TurboRecyclerView sliding in the end does not respond to click events 141 | * **1.0.9-beta** 142 | * Add removeData(List data) 143 | * **1.1.0** 144 | * Refactor Adapter, add BaseCursorAdapter 145 | * **1.2.0** 146 | * Add decoration pkg 147 | * **1.2.1** 148 | * Modify range notify 149 | * Fix swapCursor error 150 | 151 | Thanks 152 | ------ 153 | [base-adapter-helper](https://github.com/JoanZapata/base-adapter-helper) 154 | 155 | [RecyclerItemDecoration](https://github.com/dinuscxj/RecyclerItemDecoration) 156 | 157 | License 158 | --- 159 | 160 | Copyright (C) 2016 solartisan/imilk 161 | 162 | Licensed under the Apache License, Version 2.0 (the "License"); 163 | you may not use this file except in compliance with the License. 164 | You may obtain a copy of the License at 165 | 166 | http://www.apache.org/licenses/LICENSE-2.0 167 | 168 | Unless required by applicable law or agreed to in writing, software 169 | distributed under the License is distributed on an "AS IS" BASIS, 170 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 171 | See the License for the specific language governing permissions and 172 | limitations under the License. -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "cc.solart.turbo.simple" 9 | minSdkVersion 14 10 | targetSdkVersion 23 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 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.3.0' 26 | compile 'com.android.support:cardview-v7:23.3.0' 27 | compile 'com.android.support:recyclerview-v7:23.3.0' 28 | compile project(':turbo-recyclerview-helper') 29 | } 30 | -------------------------------------------------------------------------------- /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/imilk/Library/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 | -------------------------------------------------------------------------------- /app/src/androidTest/java/cc/solart/turbo/simple/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 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 | 2 | 4 | 5 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/CursorActivity.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 2 | 3 | import android.database.Cursor; 4 | import android.support.v4.app.LoaderManager; 5 | import android.support.v4.content.CursorLoader; 6 | import android.support.v4.content.Loader; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.os.Bundle; 9 | import android.support.v7.widget.LinearLayoutManager; 10 | import android.view.LayoutInflater; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | 14 | import cc.solart.turbo.TurboRecyclerView; 15 | import cc.solart.turbo.simple.adapter.MovieCursorAdapter; 16 | import cc.solart.turbo.simple.provider.MovieContract; 17 | 18 | public class CursorActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { 19 | private static final int LOADER_ID = 1; 20 | private LoaderManager mLoaderManager; 21 | private MovieCursorAdapter mCursorAdapter; 22 | private TurboRecyclerView mRecyclerView; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_cursor); 28 | mRecyclerView = (TurboRecyclerView) findViewById(R.id.rv_list); 29 | mLoaderManager = getSupportLoaderManager(); 30 | 31 | mCursorAdapter = new MovieCursorAdapter(this, null); 32 | View header = LayoutInflater.from(this).inflate(R.layout.item_header, (ViewGroup) mRecyclerView.getParent(), false); 33 | mCursorAdapter.addHeaderView(header); 34 | mRecyclerView.setAdapter(mCursorAdapter); 35 | mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 36 | } 37 | 38 | 39 | @Override 40 | protected void onResume() { 41 | super.onResume(); 42 | mLoaderManager.initLoader(LOADER_ID, null, this); 43 | } 44 | 45 | @Override 46 | public Loader onCreateLoader(int id, Bundle args) { 47 | switch (id) { 48 | case LOADER_ID: 49 | return new CursorLoader(this, MovieContract.MovieEntry.CONTENT_URI, new String[]{ 50 | MovieContract.MovieEntry._ID, 51 | MovieContract.MovieEntry.COLUMN_NAME 52 | }, null, null, null); 53 | } 54 | return null; 55 | } 56 | 57 | @Override 58 | public void onLoadFinished(Loader loader, Cursor data) { 59 | switch (loader.getId()) { 60 | case LOADER_ID: 61 | mCursorAdapter.swapCursor(data); 62 | break; 63 | } 64 | } 65 | 66 | @Override 67 | public void onLoaderReset(Loader loader) { 68 | switch (loader.getId()) { 69 | case LOADER_ID: 70 | mCursorAdapter.swapCursor(null); 71 | break; 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/EmptyActivity.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.view.ViewGroup; 7 | 8 | import cc.solart.turbo.TurboRecyclerView; 9 | import cc.solart.turbo.simple.adapter.SimpleAdapter; 10 | 11 | public class EmptyActivity extends AppCompatActivity { 12 | 13 | TurboRecyclerView mRecyclerView; 14 | SimpleAdapter mAdapter; 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.activity_empty); 19 | 20 | mRecyclerView = (TurboRecyclerView) findViewById(R.id.rv_empty); 21 | 22 | mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 23 | 24 | mAdapter = new SimpleAdapter(this); 25 | // you must call inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) 26 | mAdapter.setEmptyView(getLayoutInflater().inflate(R.layout.empty, (ViewGroup) mRecyclerView.getParent(),false)); 27 | mRecyclerView.setAdapter(mAdapter); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/MainActivity.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | public class MainActivity extends AppCompatActivity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_main); 14 | } 15 | 16 | public void simple(View viw){ 17 | Intent intent = new Intent(this,SimpleActivity.class); 18 | startActivity(intent); 19 | } 20 | 21 | public void multi(View viw){ 22 | Intent intent = new Intent(this,MultiTypeActivity.class); 23 | startActivity(intent); 24 | } 25 | 26 | public void empty(View viw){ 27 | Intent intent = new Intent(this,EmptyActivity.class); 28 | startActivity(intent); 29 | } 30 | 31 | public void cursor(View viw){ 32 | Intent intent = new Intent(this,CursorActivity.class); 33 | startActivity(intent); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/MultiTypeActivity.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 2 | 3 | import android.graphics.Color; 4 | import android.os.Handler; 5 | import android.support.v4.widget.SwipeRefreshLayout; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.os.Bundle; 8 | import android.support.v7.widget.LinearLayoutManager; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import cc.solart.turbo.OnLoadMoreListener; 14 | import cc.solart.turbo.TurboRecyclerView; 15 | import cc.solart.turbo.decoration.BaseItemDecoration; 16 | import cc.solart.turbo.simple.adapter.MultiTypeAdapter; 17 | import cc.solart.turbo.decoration.LinearOffsetsItemDecoration; 18 | import cc.solart.turbo.simple.model.MultiModel; 19 | 20 | public class MultiTypeActivity extends AppCompatActivity { 21 | 22 | TurboRecyclerView mRecyclerView; 23 | MultiTypeAdapter mAdapter; 24 | SwipeRefreshLayout mRefreshLayout; 25 | Handler mHandler = new Handler(); 26 | 27 | @Override 28 | protected void onCreate(Bundle savedInstanceState) { 29 | super.onCreate(savedInstanceState); 30 | setContentView(R.layout.activity_multi_type); 31 | mRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh); 32 | mRefreshLayout.setColorSchemeColors(Color.parseColor("#4E76A8")); 33 | mRecyclerView = (TurboRecyclerView) findViewById(R.id.rv_multi); 34 | 35 | mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 36 | LinearOffsetsItemDecoration decoration =new LinearOffsetsItemDecoration(BaseItemDecoration.VERTICAL); 37 | decoration.setItemOffsets(getResources().getDimensionPixelOffset(R.dimen.dp_10)); 38 | mRecyclerView.addItemDecoration(decoration); 39 | 40 | 41 | mAdapter = new MultiTypeAdapter(this); 42 | mRecyclerView.setAdapter(mAdapter); 43 | mAdapter.addData(obtainData()); 44 | 45 | mRecyclerView.setLoadMoreEnabled(true); 46 | 47 | mRecyclerView.addOnLoadingMoreListener(new OnLoadMoreListener() { 48 | @Override 49 | public void onLoadingMore() { 50 | mHandler.postDelayed(new Runnable() { 51 | @Override 52 | public void run() { 53 | mRecyclerView.loadMoreComplete(obtainData()); 54 | } 55 | }, 2000); 56 | } 57 | }); 58 | 59 | mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 60 | @Override 61 | public void onRefresh() { 62 | mHandler.postDelayed(new Runnable() { 63 | @Override 64 | public void run() { 65 | mAdapter.resetData(obtainNewData()); 66 | mRefreshLayout.setRefreshing(false); 67 | } 68 | }, 2000); 69 | } 70 | }); 71 | } 72 | 73 | private List obtainData(){ 74 | ArrayList list = new ArrayList<>(); 75 | int i = 0; 76 | while (i < 10){ 77 | MultiModel multiModel = new MultiModel(); 78 | multiModel.setmType(i%3); 79 | list.add(multiModel); 80 | i++; 81 | } 82 | return list; 83 | } 84 | 85 | private List obtainNewData(){ 86 | ArrayList list = new ArrayList<>(); 87 | int i = 1; 88 | while (i < 10){ 89 | MultiModel multiModel = new MultiModel(); 90 | multiModel.setmType(i%3); 91 | list.add(multiModel); 92 | i++; 93 | } 94 | return list; 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/SimpleActivity.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.Menu; 10 | import android.view.MenuItem; 11 | import android.view.MotionEvent; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.Toast; 15 | 16 | import java.util.Arrays; 17 | 18 | import cc.solart.turbo.OnItemClickListener; 19 | import cc.solart.turbo.OnLoadMoreListener; 20 | import cc.solart.turbo.TurboRecyclerView; 21 | import cc.solart.turbo.decoration.BaseItemDecoration; 22 | import cc.solart.turbo.decoration.LinearDividerItemDecoration; 23 | import cc.solart.turbo.simple.adapter.SimpleAdapter; 24 | 25 | public class SimpleActivity extends AppCompatActivity { 26 | 27 | TurboRecyclerView mRecyclerView; 28 | SimpleAdapter mAdapter; 29 | Handler handler = new Handler(); 30 | 31 | @Override 32 | protected void onCreate(Bundle savedInstanceState) { 33 | super.onCreate(savedInstanceState); 34 | setContentView(R.layout.activity_simple); 35 | 36 | mRecyclerView = (TurboRecyclerView) findViewById(R.id.rv_list); 37 | 38 | mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 39 | mRecyclerView.addItemDecoration(new LinearDividerItemDecoration(this, BaseItemDecoration.VERTICAL)); 40 | 41 | mAdapter = new SimpleAdapter(this, Arrays.asList(sCheeseStrings)); 42 | View header = LayoutInflater.from(this).inflate(R.layout.item_header, (ViewGroup) mRecyclerView.getParent(),false); 43 | mAdapter.addHeaderView(header); 44 | View footer = LayoutInflater.from(this).inflate(R.layout.item_footer, (ViewGroup) mRecyclerView.getParent(),false); 45 | mAdapter.addFooterView(footer); 46 | mRecyclerView.setAdapter(mAdapter); 47 | mRecyclerView.setLoadMoreEnabled(true); 48 | mAdapter.addOnItemClickListener(new OnItemClickListener() { 49 | @Override 50 | public void onItemClick(RecyclerView.ViewHolder vh, int position) { 51 | Toast.makeText(SimpleActivity.this, "您点击了第" + position + "个item", Toast.LENGTH_SHORT).show(); 52 | } 53 | }); 54 | 55 | mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 56 | @Override 57 | public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 58 | return false; 59 | } 60 | 61 | @Override 62 | public void onTouchEvent(RecyclerView rv, MotionEvent e) { 63 | Toast.makeText(SimpleActivity.this, "拦截touch", Toast.LENGTH_SHORT).show(); 64 | } 65 | 66 | @Override 67 | public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 68 | 69 | } 70 | }); 71 | mRecyclerView.addOnLoadingMoreListener(new OnLoadMoreListener() { 72 | @Override 73 | public void onLoadingMore() { 74 | handler.postDelayed(new Runnable() { 75 | @Override 76 | public void run() { 77 | mRecyclerView.loadMoreComplete(Arrays.asList(sCheeseStrings)); 78 | } 79 | }, 2000); 80 | } 81 | }); 82 | } 83 | 84 | @Override 85 | public boolean onCreateOptionsMenu(Menu menu) { 86 | // Inflate the menu; this adds items to the action bar if it is present. 87 | getMenuInflater().inflate(R.menu.simple, menu); 88 | return true; 89 | } 90 | 91 | @Override 92 | public boolean onOptionsItemSelected(MenuItem item) { 93 | // Handle action bar item clicks here. The action bar will 94 | // automatically handle clicks on the Home/Up button, so long 95 | // as you specify a parent activity in AndroidManifest.xml. 96 | int id = item.getItemId(); 97 | if (id == R.id.action_add) { 98 | mAdapter.add(mAdapter.getData().size(), "New Item"); 99 | return true; 100 | } 101 | if (id == R.id.action_remove) { 102 | mAdapter.remove(mAdapter.getData().size() - 1); 103 | return true; 104 | } 105 | return super.onOptionsItemSelected(item); 106 | } 107 | 108 | public static final String[] sCheeseStrings = { 109 | "Activity", "Service", "ContentProvider", "BroadcastReceiver"}; 110 | } 111 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/adapter/MovieCursorAdapter.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.adapter; 2 | 3 | import android.app.LoaderManager; 4 | import android.content.Context; 5 | import android.content.CursorLoader; 6 | import android.database.Cursor; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | import cc.solart.turbo.BaseCursorAdapter; 12 | import cc.solart.turbo.BaseViewHolder; 13 | import cc.solart.turbo.simple.R; 14 | import cc.solart.turbo.simple.provider.MovieContract; 15 | 16 | /** 17 | * ------------------------------------------------------------------------- 18 | * Author: imilk 19 | * Create: 12:55 20 | * ------------------------------------------------------------------------- 21 | * Describe: 22 | * ------------------------------------------------------------------------- 23 | * Changes: 24 | * ------------------------------------------------------------------------- 25 | * 12 : Create by imilk 26 | * ------------------------------------------------------------------------- 27 | */ 28 | public class MovieCursorAdapter extends BaseCursorAdapter{ 29 | 30 | 31 | /** 32 | * Constructor that disallows control over auto-requery. As an alternative, 33 | * use {@link LoaderManager}/{@link android.support.v4.app.LoaderManager} 34 | * with a {@link CursorLoader}/{@link android.support.v4.content.CursorLoader} 35 | * 36 | * @param context The context 37 | * @param c The cursor from which to get the data. 38 | */ 39 | public MovieCursorAdapter(Context context, Cursor c) { 40 | super(context, c); 41 | } 42 | 43 | @Override 44 | protected void convert(MovieHolder holder, Cursor cursor) { 45 | if(cursor!=null){ 46 | holder.textView.setText(cursor.getString(cursor.getColumnIndex(MovieContract.MovieEntry.COLUMN_NAME))); 47 | } 48 | } 49 | 50 | @Override 51 | protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { 52 | return new MovieHolder(inflateItemView(R.layout.item_simple,parent)); 53 | } 54 | 55 | class MovieHolder extends BaseViewHolder{ 56 | TextView textView; 57 | public MovieHolder(View view) { 58 | super(view); 59 | textView = findViewById(R.id.simple_text); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/adapter/MultiTypeAdapter.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | import android.widget.TextView; 8 | 9 | import cc.solart.turbo.BaseTurboAdapter; 10 | import cc.solart.turbo.BaseViewHolder; 11 | import cc.solart.turbo.simple.R; 12 | import cc.solart.turbo.simple.model.MultiModel; 13 | 14 | /** 15 | * author: imilk 16 | * https://github.com/Solartisan/TurboRecyclerViewHelper 17 | */ 18 | public class MultiTypeAdapter extends BaseTurboAdapter{ 19 | 20 | private static final int TYPE_1 = 0; 21 | private static final int TYPE_2 = 1; 22 | private static final int TYPE_3 = 2; 23 | 24 | public MultiTypeAdapter(Context context) { 25 | super(context); 26 | } 27 | 28 | @Override 29 | protected int getDefItemViewType(int position) { 30 | MultiModel model = getItem(position); 31 | return model.getmType(); 32 | } 33 | 34 | @Override 35 | protected BaseViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { 36 | if(viewType==TYPE_1){ 37 | return new Type1Holder(inflateItemView(R.layout.item_type_1,parent)); 38 | }else if(viewType == TYPE_2){ 39 | return new Type2Holder(inflateItemView(R.layout.item_type_2,parent)); 40 | }else{ 41 | return new Type3Holder(inflateItemView(R.layout.item_type_3,parent)); 42 | } 43 | } 44 | 45 | @Override 46 | protected void convert(BaseViewHolder holder, MultiModel item) { 47 | // TODO Render UI 48 | } 49 | 50 | 51 | class Type1Holder extends BaseViewHolder{ 52 | ImageView image; 53 | public Type1Holder(View view) { 54 | super(view); 55 | image = findViewById(R.id.image); 56 | } 57 | } 58 | 59 | class Type2Holder extends BaseViewHolder{ 60 | ImageView image; 61 | public Type2Holder(View view) { 62 | super(view); 63 | image = findViewById(R.id.image); 64 | } 65 | } 66 | 67 | class Type3Holder extends BaseViewHolder{ 68 | TextView textView; 69 | public Type3Holder(View view) { 70 | super(view); 71 | textView = findViewById(R.id.text); 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/adapter/SimpleAdapter.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.TextView; 7 | import android.widget.Toast; 8 | 9 | import java.util.List; 10 | 11 | import cc.solart.turbo.BaseTurboAdapter; 12 | import cc.solart.turbo.BaseViewHolder; 13 | import cc.solart.turbo.simple.R; 14 | 15 | /** 16 | * author: imilk 17 | * https://github.com/Solartisan/TurboRecyclerViewHelper 18 | */ 19 | public class SimpleAdapter extends BaseTurboAdapter { 20 | 21 | public SimpleAdapter(Context context) { 22 | super(context); 23 | } 24 | 25 | public SimpleAdapter(Context context, List data) { 26 | super(context, data); 27 | } 28 | 29 | @Override 30 | protected SimpleViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) { 31 | return new SimpleViewHolder(inflateItemView(R.layout.item_simple, parent)); 32 | } 33 | 34 | @Override 35 | protected void convert(SimpleViewHolder holder, String item) { 36 | holder.tv.setOnClickListener(new View.OnClickListener() { 37 | @Override 38 | public void onClick(View v) { 39 | Toast.makeText(mContext, "child text item click", Toast.LENGTH_SHORT).show(); 40 | } 41 | }); 42 | holder.tv.setText(item); 43 | } 44 | 45 | 46 | class SimpleViewHolder extends BaseViewHolder { 47 | 48 | TextView tv; 49 | 50 | protected SimpleViewHolder(View view) { 51 | super(view); 52 | tv = findViewById(R.id.simple_text); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/model/MultiModel.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.model; 2 | 3 | /** 4 | * author: imilk 5 | * https://github.com/Solartisan/TurboRecyclerViewHelper 6 | */ 7 | public class MultiModel { 8 | 9 | private String mName; 10 | private int mType; 11 | 12 | public String getmName() { 13 | return mName; 14 | } 15 | 16 | public void setmName(String mName) { 17 | this.mName = mName; 18 | } 19 | 20 | public int getmType() { 21 | return mType; 22 | } 23 | 24 | public void setmType(int mType) { 25 | this.mType = mType; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/provider/MovieContentProvider.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.provider; 2 | 3 | import android.content.ContentProvider; 4 | import android.content.ContentUris; 5 | import android.content.ContentValues; 6 | import android.content.UriMatcher; 7 | import android.database.Cursor; 8 | import android.database.sqlite.SQLiteDatabase; 9 | import android.net.Uri; 10 | import android.support.annotation.Nullable; 11 | 12 | public class MovieContentProvider extends ContentProvider { 13 | private static final UriMatcher sUriMatcher = buildUriMatcher(); 14 | private static final int MOVIE = 0; 15 | private static final int MOVIE_ID = 1; 16 | private MyDatabaseHelper mDatabaseHelper; 17 | 18 | 19 | private static UriMatcher buildUriMatcher() { 20 | String content = MovieContract.CONTENT_AUTHORITY; 21 | UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 22 | uriMatcher.addURI(content, MovieContract.PATH_MOVIE, MOVIE); 23 | uriMatcher.addURI(content, MovieContract.PATH_MOVIE + "/#", MOVIE_ID); 24 | return uriMatcher; 25 | } 26 | 27 | @Nullable 28 | @Override 29 | public String getType(Uri uri) { 30 | switch (sUriMatcher.match(uri)) { 31 | case MOVIE: 32 | return MovieContract.MovieEntry.CONTENT_TYPE; 33 | case MOVIE_ID: 34 | return MovieContract.MovieEntry.CONTENT_ITEM_TYPE; 35 | default: 36 | throw new UnsupportedOperationException("unknown uri: " + uri); 37 | } 38 | } 39 | 40 | @Override 41 | public boolean onCreate() { 42 | mDatabaseHelper = new MyDatabaseHelper(getContext()); 43 | return true; 44 | } 45 | 46 | @Nullable 47 | @Override 48 | public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 49 | Cursor cursor; 50 | SQLiteDatabase db = mDatabaseHelper.getReadableDatabase(); 51 | switch (sUriMatcher.match(uri)) { 52 | case MOVIE: 53 | cursor = db.query(MovieContract.MovieEntry.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); 54 | break; 55 | case MOVIE_ID: 56 | long _id = ContentUris.parseId(uri); 57 | cursor = db.query(MovieContract.MovieEntry.TABLE_NAME, projection, MovieContract.MovieEntry._ID + " = ?", 58 | new String[]{String.valueOf(_id)}, null, null, sortOrder); 59 | break; 60 | default: 61 | throw new UnsupportedOperationException("unknown uri: " + uri); 62 | } 63 | 64 | assert getContext() != null; 65 | cursor.setNotificationUri(getContext().getContentResolver(), uri); 66 | return cursor; 67 | } 68 | 69 | @Nullable 70 | @Override 71 | public Uri insert(Uri uri, ContentValues values) { 72 | return null; 73 | } 74 | 75 | @Override 76 | public int delete(Uri uri, String selection, String[] selectionArgs) { 77 | return 0; 78 | } 79 | 80 | @Override 81 | public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 82 | return 0; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/provider/MovieContract.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.provider; 2 | 3 | import android.content.ContentUris; 4 | import android.net.Uri; 5 | import android.provider.BaseColumns; 6 | 7 | public class MovieContract { 8 | // Content authority is a name for the entire content provider 9 | // similar to a domain and its website. This string is guaranteed to be unique. 10 | public static final String CONTENT_AUTHORITY = "cc.solart.turbo.simple"; 11 | 12 | // Use the content authority to provide the base 13 | // of all URIs 14 | private static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY); 15 | 16 | // Path for URI to a movie 17 | public static final String PATH_MOVIE = "movie"; 18 | 19 | /** 20 | * Class that defines the schema of the Movie table. 21 | */ 22 | public static final class MovieEntry implements BaseColumns { 23 | // Uri to access all movies 24 | public static final Uri CONTENT_URI = 25 | BASE_CONTENT_URI.buildUpon().appendPath(PATH_MOVIE).build(); 26 | 27 | // MIME types of Movie queries 28 | public static final String CONTENT_TYPE = 29 | "vnd.android.cursor.dir/" + CONTENT_URI + "/" + PATH_MOVIE; 30 | public static final String CONTENT_ITEM_TYPE = 31 | "vnd.android.cursor.item/" + CONTENT_URI + "/" + PATH_MOVIE; 32 | 33 | // Schema 34 | public static final String TABLE_NAME = "movieTable"; 35 | public static final String COLUMN_NAME = "movieName"; 36 | 37 | // Builds a URI for an individual movie. 38 | public static Uri buildMovieUri(long id) { 39 | return ContentUris.withAppendedId(CONTENT_URI, id); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/cc/solart/turbo/simple/provider/MyDatabaseHelper.java: -------------------------------------------------------------------------------- 1 | package cc.solart.turbo.simple.provider; 2 | 3 | import android.content.Context; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.database.sqlite.SQLiteOpenHelper; 6 | 7 | class MyDatabaseHelper extends SQLiteOpenHelper { 8 | private static final String DATABASE_NAME = "movie.db"; 9 | private static final int DATABASE_VERSION = 1; 10 | 11 | public MyDatabaseHelper(Context context) { 12 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 13 | } 14 | 15 | @Override 16 | public void onCreate(SQLiteDatabase db) { 17 | // Create table 18 | db.execSQL( 19 | "CREATE TABLE " + MovieContract.MovieEntry.TABLE_NAME + " (" + 20 | MovieContract.MovieEntry._ID + " INTEGER PRIMARY KEY, " + 21 | MovieContract.MovieEntry.COLUMN_NAME + " TEXT UNIQUE NOT NULL);" 22 | ); 23 | 24 | // Insert sample data 25 | db.execSQL( 26 | "INSERT INTO " + MovieContract.MovieEntry.TABLE_NAME + " (" + MovieContract.MovieEntry.COLUMN_NAME + ") VALUES " + 27 | "('独立日:卷土重来'), ('X战警:天启'), ('魔兽'), ('速度与激情8'), ('美国队长3'), ('钢铁侠2'), ('爱丽丝梦游仙境')," + 28 | "('幻体:续命游戏'), ('愤怒的小鸟'), ('国家利益'), ('荒野猎人'), ('云中行走'), ('极盗者'), ('火星救援');" 29 | ); 30 | } 31 | 32 | @Override 33 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bed_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Solartisan/TurboRecyclerViewHelper/09f1c0f5c50a7406233380854e4bcaf9f02dee09/app/src/main/res/drawable/bed_1.jpeg -------------------------------------------------------------------------------- /app/src/main/res/drawable/cover_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Solartisan/TurboRecyclerViewHelper/09f1c0f5c50a7406233380854e4bcaf9f02dee09/app/src/main/res/drawable/cover_1.jpeg -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 |