├── .gitignore ├── README.md ├── app-debug.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── lin │ │ └── poweradapter │ │ └── example │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── cities.json │ ├── java │ │ └── com │ │ │ └── lin │ │ │ └── poweradapter │ │ │ └── example │ │ │ ├── Analog.java │ │ │ ├── AnalogAdapter.java │ │ │ ├── BaseActivity.java │ │ │ ├── BaseViewHolder.java │ │ │ ├── DatabaseService.java │ │ │ ├── MainActivity.java │ │ │ ├── RecyclerViewActivity.java │ │ │ ├── animation │ │ │ ├── AnimationActivity.java │ │ │ └── AnimationAdapter.java │ │ │ ├── dragswipe │ │ │ ├── DragSwipeActivity.java │ │ │ └── DragSwipeAdapter.java │ │ │ ├── expandable │ │ │ ├── ExpandableActivity.java │ │ │ ├── ExpandableItemAdapter.java │ │ │ ├── IExpand.java │ │ │ ├── Ingredient.java │ │ │ ├── IngredientAdapterDelegate.java │ │ │ ├── Recipe.java │ │ │ └── RecipeAdapterDelegate.java │ │ │ ├── headerfooter │ │ │ ├── AnalogAdapterDelegate.java │ │ │ ├── Footer.java │ │ │ ├── FooterAdapterDelegate.java │ │ │ ├── Header.java │ │ │ ├── HeaderFooter2Adapter.java │ │ │ ├── HeaderFooterActivity.java │ │ │ ├── HeaderFooterActivity2.java │ │ │ ├── HeaderFooterAdapter.java │ │ │ └── headerAdapterDelegate.java │ │ │ ├── loadmore │ │ │ ├── HLoadMoreActivity.java │ │ │ ├── HLoadMoreAdapter.java │ │ │ ├── LoadMoreActivity.java │ │ │ └── LoadMoreAdapter.java │ │ │ ├── multi │ │ │ ├── Chat.java │ │ │ ├── ChatAdapter.java │ │ │ ├── FileAdapterDelegate.java │ │ │ ├── FileChat.java │ │ │ ├── LeftFileAdapterDelegate.java │ │ │ ├── LeftPhotoAdapterDelegate.java │ │ │ ├── LeftTextAdapterDelegate.java │ │ │ ├── LeftVoiceAdapterDelegate.java │ │ │ ├── MultiActivity.java │ │ │ ├── PhotoAdapterDelegate.java │ │ │ ├── PhotoChat.java │ │ │ ├── RightFileAdapterDelegate.java │ │ │ ├── RightPhotoAdapterDelegate.java │ │ │ ├── RightTextAdapterDelegate.java │ │ │ ├── RightVoiceAdapterDelegate.java │ │ │ ├── TextAdapterDelegate.java │ │ │ ├── TextChat.java │ │ │ ├── VoiceAdapterDelegate.java │ │ │ └── VoiceChat.java │ │ │ ├── select │ │ │ ├── MultiSelectActivity.java │ │ │ ├── SelectActivity.java │ │ │ └── SelectAdapter.java │ │ │ ├── single │ │ │ └── SingleActivity.java │ │ │ ├── staggered │ │ │ ├── Staggered.java │ │ │ ├── StaggeredActivity.java │ │ │ └── StaggeredAdapter.java │ │ │ ├── stickyheaders │ │ │ ├── City.java │ │ │ ├── LetterComparator.java │ │ │ ├── StickyHeadersActivity.java │ │ │ └── StickyHeadersAdapter.java │ │ │ └── util │ │ │ ├── JSONUtils.java │ │ │ └── Utils.java │ └── res │ │ ├── animator │ │ └── raise.xml │ │ ├── drawable-v21 │ │ └── selector_analog.xml │ │ ├── drawable │ │ ├── divider.xml │ │ ├── h_divider.xml │ │ ├── ic_airplay.xml │ │ ├── ic_arrow_drop_down.xml │ │ ├── ic_arrow_drop_down_selected.xml │ │ ├── ic_arrow_drop_up.xml │ │ ├── ic_attach_file.xml │ │ ├── ic_cloud_upload.xml │ │ ├── ic_drag.xml │ │ ├── ic_file_download.xml │ │ ├── ic_import_export.xml │ │ ├── ic_insert_photo.xml │ │ ├── ic_keyboard_voice.xml │ │ ├── ic_photo_library.xml │ │ ├── ic_send.xml │ │ ├── ic_surround_sound.xml │ │ ├── ic_visibility.xml │ │ ├── selector_analog.xml │ │ ├── selector_arrow_down.xml │ │ ├── shape_incoming_message.xml │ │ └── shape_outcoming_message.xml │ │ ├── layout │ │ ├── activity_animation.xml │ │ ├── activity_expandable.xml │ │ ├── activity_main.xml │ │ ├── activity_multi.xml │ │ ├── activity_recyclerview.xml │ │ ├── activity_stickyheaders.xml │ │ ├── analog_item.xml │ │ ├── dragswipe_item.xml │ │ ├── footer_layout.xml │ │ ├── h_load_more_item.xml │ │ ├── h_progress_item.xml │ │ ├── header_layout.xml │ │ ├── ingredient_view.xml │ │ ├── item_multi_select.xml │ │ ├── item_pinned_header.xml │ │ ├── layout_empty.xml │ │ ├── layout_error.xml │ │ ├── layout_progress.xml │ │ ├── left_file_chat_item.xml │ │ ├── left_photo_chat_item.xml │ │ ├── left_text_chat_item.xml │ │ ├── left_voice_chat_item.xml │ │ ├── load_more_item.xml │ │ ├── recipe_view.xml │ │ ├── right_file_chat_item.xml │ │ ├── right_photo_chat_item.xml │ │ ├── right_text_chat_item.xml │ │ ├── right_voice_chat_item.xml │ │ ├── staggered_item.xml │ │ ├── stickyheader_item.xml │ │ ├── toolbar_compat_layout.xml │ │ ├── toolbar_layout.xml │ │ ├── vegetarian_ingredient_view.xml │ │ └── vegetarian_recipe_view.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── array.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── lin │ └── poweradapter │ └── example │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── bintray.gradle ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── lin │ │ └── poweradapter │ │ ├── AbsFallbackAdapterDelegate.java │ │ ├── AdapterDelegate.java │ │ ├── AdapterDelegatesManager.java │ │ ├── AnimatorAdapter.java │ │ ├── ChildExpandViewHolder.java │ │ ├── DataLoadingCallbacks.java │ │ ├── DefaultAdapterDelegate.java │ │ ├── DragSwipeViewHolder.java │ │ ├── EndlessRecyclerViewScrollListener.java │ │ ├── ExpandableAdapter.java │ │ ├── ItemTouchHelperAdapter.java │ │ ├── ItemTouchHelperViewHolder.java │ │ ├── MultiAdapter.java │ │ ├── OnStartDragListener.java │ │ ├── ParentExpandViewHolder.java │ │ ├── PowerViewHolder.java │ │ ├── SelectableAdapter.java │ │ ├── SimpleItemTouchHelperCallback.java │ │ ├── SingleAdapter.java │ │ ├── SpaceItemDecoration.java │ │ ├── ViewHelper.java │ │ └── model │ │ ├── IMulti.java │ │ ├── Parent.java │ │ └── SimpleParent.java │ └── res │ ├── layout │ └── progress_item.xml │ ├── values-en │ └── strings.xml │ └── values │ └── strings.xml ├── screenshots └── demo.gif └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app-debug.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'com.jakewharton.butterknife' 3 | 4 | android { 5 | compileSdkVersion rootProject.ext.compileSdkVersion 6 | buildToolsVersion rootProject.ext.buildToolsVersion 7 | defaultConfig { 8 | applicationId "com.lin.poweradapter.example" 9 | minSdkVersion rootProject.ext.minSdk 10 | targetSdkVersion rootProject.ext.targetSdk 11 | versionCode 1 12 | versionName "1.0" 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | vectorDrawables.useSupportLibrary = true 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | dependencies { 25 | compile fileTree(dir: 'libs', include: ['*.jar']) 26 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 27 | exclude group: 'com.android.support', module: 'support-annotations' 28 | }) 29 | testCompile 'junit:junit:4.12' 30 | 31 | compile supportDependencies.appcompat 32 | compile supportDependencies.design 33 | compile supportDependencies.cardview 34 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 35 | compile "com.jakewharton:butterknife:$rootProject.butterknifeVersion" 36 | annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterknifeVersion" 37 | compile 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar' 38 | 39 | compile ('com.gjiazhe:wavesidebar:1.3') { 40 | exclude module: "appcompat-v7" 41 | } 42 | compile ('jp.wasabeef:recyclerview-animators:2.2.6') { 43 | exclude group: 'com.android.support' 44 | } 45 | compile 'com.google.code.gson:gson:2.8.2' 46 | compile 'com.github.bumptech.glide:glide:3.7.0' 47 | 48 | compile project(':library') 49 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\soft\android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/lin/poweradapter/example/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.lin.poweradapter.example", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 | 42 | 44 | 46 | 48 | 50 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/Analog.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import com.lin.poweradapter.model.IMulti; 4 | 5 | /** 6 | * Created by lin18 on 2017/5/2. 7 | */ 8 | 9 | public class Analog implements IMulti { 10 | 11 | public String text; 12 | public int resId = -1; 13 | public String url; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/AnalogAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.IntRange; 5 | import android.support.annotation.LayoutRes; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import com.lin.poweradapter.SingleAdapter; 14 | 15 | import butterknife.BindView; 16 | 17 | /** 18 | * Created by lin18 on 2017/5/2. 19 | */ 20 | 21 | public class AnalogAdapter extends SingleAdapter { 22 | 23 | public AnalogAdapter(@Nullable Object listener) { 24 | super(listener); 25 | } 26 | 27 | @Override 28 | public boolean isSelectable(@IntRange(from = 0) int position) { 29 | return true; 30 | } 31 | 32 | @Override 33 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 34 | return new ChildViewHolder(parent, R.layout.analog_item); 35 | } 36 | 37 | @Override 38 | public void onBindVHolder(AnalogAdapter.ChildViewHolder holder, int position) { 39 | final Context context = holder.itemView.getContext(); 40 | final Analog analog = getItem(position); 41 | holder.title.setText(analog.text); 42 | if (analog.resId > 0) { 43 | holder.icon.setImageResource(analog.resId); 44 | holder.icon.setVisibility(View.VISIBLE); 45 | } else { 46 | holder.icon.setVisibility(View.GONE); 47 | } 48 | 49 | } 50 | 51 | static class ChildViewHolder extends BaseViewHolder { 52 | 53 | @BindView(android.R.id.icon) 54 | ImageView icon; 55 | @BindView(android.R.id.title) 56 | TextView title; 57 | 58 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 59 | super(parent, layoutResId); 60 | } 61 | 62 | } 63 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.LayoutRes; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.support.v7.widget.Toolbar; 7 | import android.view.View; 8 | 9 | import butterknife.ButterKnife; 10 | import butterknife.Unbinder; 11 | 12 | /** 13 | * Created by lin18 on 2017/4/25. 14 | */ 15 | 16 | public abstract class BaseActivity extends AppCompatActivity { 17 | 18 | private Unbinder unbinder; 19 | 20 | protected Toolbar toolbar; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | int layoutResId = getLayoutResource(); 26 | if (layoutResId != 0) { 27 | setContentView(layoutResId); 28 | unbinder = ButterKnife.bind(this); 29 | 30 | View v = findViewById(R.id.toolbar); 31 | if (v != null) { 32 | toolbar = (Toolbar) v; 33 | setSupportActionBar(toolbar); 34 | 35 | } 36 | } 37 | 38 | } 39 | 40 | @LayoutRes 41 | public abstract int getLayoutResource(); 42 | 43 | @Override 44 | protected void onDestroy() { 45 | if (unbinder != null) { 46 | unbinder.unbind(); 47 | unbinder = null; 48 | } 49 | super.onDestroy(); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/BaseViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import com.lin.poweradapter.PowerViewHolder; 10 | 11 | import butterknife.ButterKnife; 12 | import butterknife.Unbinder; 13 | 14 | /** 15 | * Created by lin18 on 2017/4/28. 16 | */ 17 | 18 | public class BaseViewHolder extends PowerViewHolder { 19 | 20 | Unbinder unbinder; 21 | 22 | public BaseViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 23 | this(LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false)); 24 | } 25 | 26 | public BaseViewHolder(View itemView) { 27 | super(itemView); 28 | unbinder = ButterKnife.bind(this, itemView); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/DatabaseService.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import com.lin.poweradapter.example.headerfooter.Footer; 4 | import com.lin.poweradapter.example.headerfooter.Header; 5 | import com.lin.poweradapter.example.staggered.Staggered; 6 | import com.lin.poweradapter.model.IMulti; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | /** 12 | * Created by lin18 on 2017/4/27. 13 | */ 14 | 15 | public class DatabaseService { 16 | 17 | public static List getSampleData(int lenth) { 18 | List list = new ArrayList<>(); 19 | for (int i = 0; i < lenth; i++) { 20 | Analog analog = new Analog(); 21 | analog.text = "Analog " + i; 22 | analog.resId = i % 2 == 0 ? R.drawable.ic_cloud_upload : R.drawable.ic_import_export; 23 | analog.url = "https://avatars1.githubusercontent.com/u/6948411?v=3&u=2d57480717d6294a5c18126b3eb79cf4a0ad2a55&s=40"; 24 | list.add(analog); 25 | } 26 | return list; 27 | } 28 | 29 | public static List getStaggeredData(int lenth) { 30 | List list = new ArrayList<>(); 31 | for (int i = 0; i < lenth; i++) { 32 | Staggered staggered = new Staggered(); 33 | staggered.title = "title " + i; 34 | staggered.subtitle = "subtitle " + i; 35 | staggered.more = i % 3 == 0 ? "more " + i : null; 36 | list.add(staggered); 37 | } 38 | return list; 39 | } 40 | 41 | public static List getHeaderFooterData(int lenth) { 42 | List list = new ArrayList<>(); 43 | list.add(new Header()); 44 | for (int i = 0; i < lenth; i++) { 45 | Analog analog = new Analog(); 46 | analog.text = "Analog " + i; 47 | analog.resId = i % 2 == 0 ? R.drawable.ic_cloud_upload : R.drawable.ic_import_export; 48 | analog.url = "https://avatars1.githubusercontent.com/u/6948411?v=3&u=2d57480717d6294a5c18126b3eb79cf4a0ad2a55&s=40"; 49 | list.add(analog); 50 | } 51 | list.add(new Footer()); 52 | return list; 53 | } 54 | 55 | public static List getFlowData() { 56 | List list = new ArrayList<>(); 57 | for (int i = 0; i < texts.length; i++) { 58 | Analog analog = new Analog(); 59 | analog.text = texts[i]; 60 | analog.resId = i % 2 == 0 ? R.drawable.ic_cloud_upload : R.drawable.ic_import_export; 61 | analog.url = "https://avatars1.githubusercontent.com/u/6948411?v=3&u=2d57480717d6294a5c18126b3eb79cf4a0ad2a55&s=40"; 62 | list.add(analog); 63 | } 64 | return list; 65 | } 66 | 67 | public final static String[] texts = new String[] {"sdfg", "压下", "有", "45", "践枯", "基扔干无所适从", "播放", "DSFGHSFFD", "标有", "JK", "5644565", "顶戴", "柘城点虫鸣", "穰", "我的电脑", "柘城", "SDG56df", "仍5D655F然SF", "腺体", "紫罗兰", "股份制", "plk", "586856575", "标准", "奇才", "需要有机玻璃"}; 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.NonNull; 6 | import android.view.View; 7 | 8 | import com.lin.poweradapter.example.animation.AnimationActivity; 9 | import com.lin.poweradapter.example.dragswipe.DragSwipeActivity; 10 | import com.lin.poweradapter.example.expandable.ExpandableActivity; 11 | import com.lin.poweradapter.example.headerfooter.HeaderFooterActivity; 12 | import com.lin.poweradapter.example.headerfooter.HeaderFooterActivity2; 13 | import com.lin.poweradapter.example.loadmore.HLoadMoreActivity; 14 | import com.lin.poweradapter.example.loadmore.LoadMoreActivity; 15 | import com.lin.poweradapter.example.multi.MultiActivity; 16 | import com.lin.poweradapter.example.select.MultiSelectActivity; 17 | import com.lin.poweradapter.example.select.SelectActivity; 18 | import com.lin.poweradapter.example.single.SingleActivity; 19 | import com.lin.poweradapter.example.staggered.StaggeredActivity; 20 | import com.lin.poweradapter.example.stickyheaders.StickyHeadersActivity; 21 | import com.lin.poweradapter.example.timeline.TimeLineActivity; 22 | 23 | import java.util.ArrayList; 24 | import java.util.List; 25 | 26 | public class MainActivity extends RecyclerViewActivity { 27 | 28 | private String[] mTitles = new String[]{ 29 | SingleActivity.class.getSimpleName(), 30 | MultiActivity.class.getSimpleName(), 31 | AnimationActivity.class.getSimpleName(), 32 | TimeLineActivity.class.getSimpleName(), 33 | StickyHeadersActivity.class.getSimpleName(), 34 | StaggeredActivity.class.getSimpleName(), 35 | SelectActivity.class.getSimpleName(), 36 | MultiSelectActivity.class.getSimpleName(), 37 | LoadMoreActivity.class.getSimpleName(), 38 | HLoadMoreActivity.class.getSimpleName(), 39 | HeaderFooterActivity.class.getSimpleName(), 40 | HeaderFooterActivity2.class.getSimpleName(), 41 | ExpandableActivity.class.getSimpleName(), 42 | DragSwipeActivity.class.getSimpleName() 43 | }; 44 | 45 | private Class[] mActivities = new Class[]{ 46 | SingleActivity.class, 47 | MultiActivity.class, 48 | AnimationActivity.class, 49 | TimeLineActivity.class, 50 | StickyHeadersActivity.class, 51 | StaggeredActivity.class, 52 | SelectActivity.class, 53 | MultiSelectActivity.class, 54 | LoadMoreActivity.class, 55 | HLoadMoreActivity.class, 56 | HeaderFooterActivity.class, 57 | HeaderFooterActivity2.class, 58 | ExpandableActivity.class, 59 | DragSwipeActivity.class 60 | }; 61 | 62 | @Override 63 | protected void onCreate(Bundle savedInstanceState) { 64 | super.onCreate(savedInstanceState); 65 | configure(); 66 | initData(); 67 | } 68 | 69 | @NonNull 70 | @Override 71 | protected AnalogAdapter createAdapter() { 72 | return new AnalogAdapter(this); 73 | } 74 | 75 | private void initData() { 76 | List mDataList = new ArrayList<>(); 77 | for (int i = 0; i < mTitles.length; i++) { 78 | Analog item = new Analog(); 79 | item.text = mTitles[i]; 80 | mDataList.add(item); 81 | } 82 | adapter.setItems(mDataList); 83 | } 84 | 85 | @Override 86 | public void onItemClick(View v, int position) { 87 | super.onItemClick(v, position); 88 | startActivity(new Intent(this, mActivities[position])); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/animation/AnimationActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.animation; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | 7 | import com.lin.poweradapter.example.Analog; 8 | import com.lin.poweradapter.example.DatabaseService; 9 | import com.lin.poweradapter.example.RecyclerViewActivity; 10 | 11 | import jp.wasabeef.recyclerview.animators.ScaleInBottomAnimator; 12 | 13 | /** 14 | * Created by lin18 on 2017/4/27. 15 | */ 16 | 17 | public class AnimationActivity extends RecyclerViewActivity { 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | configure(); 23 | 24 | recyclerView.setItemAnimator(new ScaleInBottomAnimator()); 25 | 26 | adapter.setItems(DatabaseService.getSampleData(300)); 27 | } 28 | 29 | @NonNull 30 | @Override 31 | protected AnimationAdapter createAdapter() { 32 | return new AnimationAdapter(this); 33 | } 34 | 35 | @Override 36 | public void onItemClick(View v, int position) { 37 | super.onItemClick(v, position); 38 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).text); 39 | } 40 | 41 | @Override 42 | public boolean onItemLongClick(View v, int position) { 43 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 44 | return true; 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/animation/AnimationAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.animation; 2 | 3 | import android.animation.Animator; 4 | import android.animation.ObjectAnimator; 5 | import android.content.Context; 6 | import android.support.annotation.LayoutRes; 7 | import android.support.annotation.NonNull; 8 | import android.support.annotation.Nullable; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.ImageView; 12 | import android.widget.TextView; 13 | 14 | import com.lin.poweradapter.SingleAdapter; 15 | import com.lin.poweradapter.example.Analog; 16 | import com.lin.poweradapter.example.R; 17 | import com.lin.poweradapter.example.BaseViewHolder; 18 | 19 | import butterknife.BindView; 20 | 21 | /** 22 | * Created by lin18 on 2017/5/2. 23 | */ 24 | 25 | public class AnimationAdapter extends SingleAdapter { 26 | 27 | public AnimationAdapter(@Nullable Object listener) { 28 | super(listener); 29 | } 30 | 31 | @Override 32 | protected Animator[] getAnimators(View view) { 33 | return new Animator[] { 34 | ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0) 35 | }; 36 | } 37 | 38 | @Override 39 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 40 | return new ChildViewHolder(parent, R.layout.analog_item); 41 | } 42 | 43 | @Override 44 | public void onBindVHolder(AnimationAdapter.ChildViewHolder holder, int position) { 45 | final Context context = holder.itemView.getContext(); 46 | final Analog analog = getItem(position); 47 | holder.title.setText(analog.text); 48 | if (analog.resId > 0) { 49 | holder.icon.setImageResource(analog.resId); 50 | holder.icon.setVisibility(View.VISIBLE); 51 | } else { 52 | holder.icon.setVisibility(View.GONE); 53 | } 54 | 55 | } 56 | 57 | static class ChildViewHolder extends BaseViewHolder { 58 | 59 | @BindView(android.R.id.icon) 60 | ImageView icon; 61 | @BindView(android.R.id.title) 62 | TextView title; 63 | 64 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 65 | super(parent, layoutResId); 66 | } 67 | 68 | } 69 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/dragswipe/DragSwipeActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.dragswipe; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.support.v7.widget.helper.ItemTouchHelper; 7 | import android.view.View; 8 | 9 | import com.lin.poweradapter.OnStartDragListener; 10 | import com.lin.poweradapter.SimpleItemTouchHelperCallback; 11 | import com.lin.poweradapter.example.Analog; 12 | import com.lin.poweradapter.example.DatabaseService; 13 | import com.lin.poweradapter.example.RecyclerViewActivity; 14 | 15 | /** 16 | * Created by lin18 on 2017/4/27. 17 | */ 18 | 19 | public class DragSwipeActivity extends RecyclerViewActivity implements OnStartDragListener { 20 | 21 | private ItemTouchHelper mItemTouchHelper; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | configure(); 27 | adapter.setItems(DatabaseService.getSampleData(50)); 28 | ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter, false, true) { 29 | @Override 30 | public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 31 | super.onSelectedChanged(viewHolder, actionState); 32 | swiprefresh.setEnabled(actionState == ItemTouchHelper.ACTION_STATE_IDLE); 33 | } 34 | }; 35 | mItemTouchHelper = new ItemTouchHelper(callback); 36 | mItemTouchHelper.attachToRecyclerView(recyclerView); 37 | } 38 | 39 | @NonNull 40 | @Override 41 | protected DragSwipeAdapter createAdapter() { 42 | return new DragSwipeAdapter(this); 43 | } 44 | 45 | @Override 46 | public void onItemClick(View v, int position) { 47 | super.onItemClick(v, position); 48 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).text); 49 | } 50 | 51 | @Override 52 | public boolean onItemLongClick(View v, int position) { 53 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 54 | return true; 55 | } 56 | 57 | @Override 58 | public void onStartDrag(RecyclerView.ViewHolder viewHolder) { 59 | mItemTouchHelper.startDrag(viewHolder); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/dragswipe/DragSwipeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.dragswipe; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ImageView; 9 | import android.widget.TextView; 10 | 11 | import com.lin.poweradapter.DragSwipeViewHolder; 12 | import com.lin.poweradapter.SingleAdapter; 13 | import com.lin.poweradapter.example.Analog; 14 | import com.lin.poweradapter.example.R; 15 | 16 | import butterknife.BindView; 17 | import butterknife.ButterKnife; 18 | import butterknife.Unbinder; 19 | 20 | /** 21 | * Created by lin18 on 2017/5/2. 22 | */ 23 | 24 | public class DragSwipeAdapter extends SingleAdapter { 25 | 26 | public DragSwipeAdapter(@Nullable Object listener) { 27 | super(listener); 28 | } 29 | 30 | @Override 31 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 32 | return new ChildViewHolder(parent, R.layout.dragswipe_item); 33 | } 34 | 35 | @Override 36 | public void onBindVHolder(DragSwipeAdapter.ChildViewHolder holder, int position) { 37 | // setTouchDragListener(holder.drag, holder); 38 | setLongClickDragListener(holder.drag, holder); 39 | final Analog analog = getItem(position); 40 | holder.title.setText(analog.text); 41 | if (analog.resId > 0) { 42 | holder.icon.setImageResource(analog.resId); 43 | holder.icon.setVisibility(View.VISIBLE); 44 | } else { 45 | holder.icon.setVisibility(View.GONE); 46 | } 47 | 48 | } 49 | 50 | static class ChildViewHolder extends DragSwipeViewHolder { 51 | 52 | Unbinder unbinder; 53 | 54 | @BindView(android.R.id.icon) 55 | ImageView icon; 56 | @BindView(android.R.id.title) 57 | TextView title; 58 | @BindView(R.id.drag) 59 | ImageView drag; 60 | 61 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 62 | super(parent, layoutResId); 63 | unbinder = ButterKnife.bind(this, itemView); 64 | } 65 | 66 | } 67 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/ExpandableActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.widget.SwipeRefreshLayout; 5 | import android.support.v7.widget.DefaultItemAnimator; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | import android.widget.Toast; 10 | 11 | import com.lin.poweradapter.SingleAdapter; 12 | import com.lin.poweradapter.SpaceItemDecoration; 13 | import com.lin.poweradapter.example.BaseActivity; 14 | import com.lin.poweradapter.example.R; 15 | 16 | import java.util.ArrayList; 17 | import java.util.Arrays; 18 | import java.util.List; 19 | 20 | import butterknife.BindView; 21 | 22 | /** 23 | * Created by lin18 on 2017/4/25. 24 | */ 25 | 26 | public class ExpandableActivity extends BaseActivity implements SwipeRefreshLayout.OnRefreshListener, SingleAdapter.OnItemClickListener { 27 | 28 | @BindView(R.id.recyclerView) 29 | RecyclerView recyclerView; 30 | @BindView(R.id.swiprefresh) 31 | SwipeRefreshLayout swiprefresh; 32 | 33 | ExpandableItemAdapter mAdapter; 34 | 35 | @Override 36 | public int getLayoutResource() { 37 | return R.layout.activity_expandable; 38 | } 39 | 40 | @Override 41 | protected void onCreate(Bundle savedInstanceState) { 42 | super.onCreate(savedInstanceState); 43 | 44 | swiprefresh.setOnRefreshListener(this); 45 | 46 | 47 | 48 | Ingredient beef = new Ingredient("beef", false); 49 | Ingredient cheese = new Ingredient("cheese", true); 50 | Ingredient salsa = new Ingredient("salsa", true); 51 | Ingredient tortilla = new Ingredient("tortilla", true); 52 | Ingredient ketchup = new Ingredient("ketchup", true); 53 | Ingredient bun = new Ingredient("bun", true); 54 | 55 | Recipe taco = new Recipe("taco", Arrays.asList(beef, cheese, salsa)); 56 | Recipe quesadilla = new Recipe("quesadilla", Arrays.asList(cheese, tortilla)); 57 | Recipe burger = new Recipe("burger", Arrays.asList(beef, cheese, ketchup, bun)); 58 | final List recipes = new ArrayList<>(); 59 | recipes.add(taco); 60 | recipes.add(quesadilla); 61 | recipes.add(burger); 62 | // mAdapter.setItems(recipes); 63 | 64 | final LinearLayoutManager layoutManager = new LinearLayoutManager(this); 65 | recyclerView.setLayoutManager(layoutManager); 66 | mAdapter = new ExpandableItemAdapter(this); 67 | recyclerView.setAdapter(mAdapter); 68 | recyclerView.setHasFixedSize(true); 69 | recyclerView.setNestedScrollingEnabled(false); 70 | recyclerView.setItemAnimator(new DefaultItemAnimator()); 71 | recyclerView.addItemDecoration(new SpaceItemDecoration(this, R.drawable.divider)); 72 | 73 | mAdapter.setItems(recipes); 74 | } 75 | 76 | @Override 77 | public void onRefresh() { 78 | 79 | } 80 | 81 | @Override 82 | public void onItemClick(View v, int position) { 83 | Toast.makeText(this, ((Ingredient)mAdapter.getItem(position)).getName()+"=="+position, Toast.LENGTH_SHORT).show(); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/ExpandableItemAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.lin.poweradapter.PowerViewHolder; 6 | import com.lin.poweradapter.DefaultAdapterDelegate; 7 | import com.lin.poweradapter.ExpandableAdapter; 8 | 9 | /** 10 | * Created by lin18 on 2017/4/25. 11 | */ 12 | 13 | public class ExpandableItemAdapter extends ExpandableAdapter{ 14 | 15 | public ExpandableItemAdapter(@Nullable Object listener) { 16 | super(listener); 17 | delegatesManager.addDelegate(new IngredientAdapterDelegate()); 18 | delegatesManager.addDelegate(new RecipeAdapterDelegate()); 19 | delegatesManager.setFallbackDelegate(new DefaultAdapterDelegate()); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/IExpand.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | /** 4 | * Created by lin18 on 2017/4/25. 5 | */ 6 | 7 | public interface IExpand { 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/Ingredient.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | public class Ingredient implements IExpand { 4 | 5 | private String mName; 6 | private boolean mIsVegetarian; 7 | 8 | public Ingredient(String name, boolean isVegetarian) { 9 | mName = name; 10 | mIsVegetarian = isVegetarian; 11 | } 12 | 13 | public String getName() { 14 | return mName; 15 | } 16 | 17 | public boolean isVegetarian() { 18 | return mIsVegetarian; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/IngredientAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.TextView; 9 | 10 | import com.lin.poweradapter.AdapterDelegate; 11 | import com.lin.poweradapter.PowerViewHolder; 12 | import com.lin.poweradapter.ChildExpandViewHolder; 13 | import com.lin.poweradapter.example.R; 14 | 15 | import java.util.List; 16 | 17 | import butterknife.BindView; 18 | import butterknife.ButterKnife; 19 | import butterknife.Unbinder; 20 | 21 | /** 22 | * Created by lin18 on 2017/4/25. 23 | */ 24 | 25 | public class IngredientAdapterDelegate extends AdapterDelegate { 26 | 27 | @Override 28 | protected boolean isForViewType(@NonNull IExpand item, int position) { 29 | return item instanceof Ingredient; 30 | } 31 | 32 | @NonNull 33 | @Override 34 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 35 | return new ChildViewHolder(parent, R.layout.vegetarian_ingredient_view); 36 | } 37 | 38 | @Override 39 | protected void onBindViewHolder(@NonNull IExpand item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 40 | ChildViewHolder vh = (ChildViewHolder) holder; 41 | Ingredient ingredient = (Ingredient) item; 42 | vh.textView.setText(ingredient.getName()); 43 | } 44 | 45 | static class ChildViewHolder extends ChildExpandViewHolder { 46 | 47 | Unbinder unbinder; 48 | 49 | @BindView(R.id.ingredient_textview) 50 | TextView textView; 51 | 52 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 53 | this(LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false)); 54 | } 55 | 56 | public ChildViewHolder(View itemView) { 57 | super(itemView); 58 | unbinder = ButterKnife.bind(this, itemView); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/Recipe.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | import com.lin.poweradapter.model.Parent; 4 | 5 | import java.util.List; 6 | 7 | public class Recipe implements Parent, IExpand { 8 | 9 | private String mName; 10 | private List mIngredients; 11 | 12 | public Recipe(String name, List ingredients) { 13 | mName = name; 14 | mIngredients = ingredients; 15 | } 16 | 17 | public String getName() { 18 | return mName; 19 | } 20 | 21 | @Override 22 | public List getChildList() { 23 | return mIngredients; 24 | } 25 | 26 | @Override 27 | public boolean isInitiallyExpanded() { 28 | return false; 29 | } 30 | 31 | public Ingredient getIngredient(int position) { 32 | return mIngredients.get(position); 33 | } 34 | 35 | public boolean isVegetarian() { 36 | for (Ingredient ingredient : mIngredients) { 37 | if (!ingredient.isVegetarian()) { 38 | return false; 39 | } 40 | } 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/expandable/RecipeAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.expandable; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.view.animation.RotateAnimation; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import com.lin.poweradapter.AdapterDelegate; 13 | import com.lin.poweradapter.PowerViewHolder; 14 | import com.lin.poweradapter.ParentExpandViewHolder; 15 | import com.lin.poweradapter.example.R; 16 | 17 | import java.util.List; 18 | 19 | import butterknife.BindView; 20 | import butterknife.ButterKnife; 21 | import butterknife.Unbinder; 22 | 23 | /** 24 | * Created by lin18 on 2017/4/25. 25 | */ 26 | 27 | public class RecipeAdapterDelegate extends AdapterDelegate { 28 | 29 | private static final float INITIAL_POSITION = 0.0f; 30 | private static final float ROTATED_POSITION = 180f; 31 | 32 | @Override 33 | protected boolean isForViewType(@NonNull IExpand item, int position) { 34 | return item instanceof Recipe; 35 | } 36 | 37 | @NonNull 38 | @Override 39 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 40 | return new ChildViewHolder(parent, R.layout.vegetarian_recipe_view); 41 | } 42 | 43 | @Override 44 | protected void onBindViewHolder(@NonNull IExpand item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 45 | ChildViewHolder vh = (ChildViewHolder) holder; 46 | Recipe recipe = (Recipe) item; 47 | 48 | vh.textView.setText(recipe.getName()); 49 | } 50 | 51 | static class ChildViewHolder extends ParentExpandViewHolder { 52 | 53 | Unbinder unbinder; 54 | 55 | @BindView(R.id.recipe_textview) 56 | TextView textView; 57 | @BindView(R.id.arrow_expand_imageview) 58 | ImageView arrow; 59 | 60 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 61 | this(LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false)); 62 | } 63 | 64 | public ChildViewHolder(View itemView) { 65 | super(itemView); 66 | unbinder = ButterKnife.bind(this, itemView); 67 | } 68 | 69 | @Override 70 | public void onExpansionToggled(boolean expanded) { 71 | super.onExpansionToggled(expanded); 72 | arrow.setRotation(!expanded ? ROTATED_POSITION : INITIAL_POSITION); 73 | RotateAnimation rotateAnimation = new RotateAnimation(!expanded ? ROTATED_POSITION : -1 * ROTATED_POSITION, 74 | INITIAL_POSITION, 75 | RotateAnimation.RELATIVE_TO_SELF, 0.5f, 76 | RotateAnimation.RELATIVE_TO_SELF, 0.5f); 77 | 78 | rotateAnimation.setDuration(200); 79 | rotateAnimation.setFillAfter(true); 80 | arrow.startAnimation(rotateAnimation); 81 | } 82 | 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/AnalogAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ImageView; 8 | import android.widget.TextView; 9 | 10 | import com.lin.poweradapter.AdapterDelegate; 11 | import com.lin.poweradapter.PowerViewHolder; 12 | import com.lin.poweradapter.example.Analog; 13 | import com.lin.poweradapter.example.R; 14 | import com.lin.poweradapter.example.BaseViewHolder; 15 | import com.lin.poweradapter.model.IMulti; 16 | 17 | import java.util.List; 18 | 19 | import butterknife.BindView; 20 | 21 | /** 22 | * Created by lin18 on 2017/5/2. 23 | */ 24 | 25 | public class AnalogAdapterDelegate extends AdapterDelegate { 26 | 27 | @Override 28 | protected boolean isForViewType(@NonNull IMulti item, int position) { 29 | return item instanceof Analog; 30 | } 31 | 32 | @NonNull 33 | @Override 34 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 35 | return new ChildViewHolder(parent, R.layout.analog_item); 36 | } 37 | 38 | @Override 39 | protected void onBindViewHolder(@NonNull IMulti item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 40 | ChildViewHolder vh = (ChildViewHolder) holder; 41 | Analog analog = (Analog) item; 42 | vh.title.setText(analog.text); 43 | if (analog.resId > 0) { 44 | vh.icon.setImageResource(analog.resId); 45 | vh.icon.setVisibility(View.VISIBLE); 46 | } else { 47 | vh.icon.setVisibility(View.GONE); 48 | } 49 | } 50 | 51 | static class ChildViewHolder extends BaseViewHolder { 52 | 53 | @BindView(android.R.id.icon) 54 | ImageView icon; 55 | @BindView(android.R.id.title) 56 | TextView title; 57 | 58 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 59 | super(parent, layoutResId); 60 | } 61 | 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/Footer.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import com.lin.poweradapter.model.IMulti; 4 | 5 | /** 6 | * Created by lin18 on 2017/5/3. 7 | */ 8 | 9 | public class Footer implements IMulti { 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/FooterAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | 8 | import com.lin.poweradapter.AdapterDelegate; 9 | import com.lin.poweradapter.PowerViewHolder; 10 | import com.lin.poweradapter.example.R; 11 | import com.lin.poweradapter.example.BaseViewHolder; 12 | import com.lin.poweradapter.model.IMulti; 13 | 14 | import java.util.List; 15 | 16 | import butterknife.BindView; 17 | 18 | /** 19 | * Created by lin18 on 2017/5/2. 20 | */ 21 | 22 | public class FooterAdapterDelegate extends AdapterDelegate { 23 | 24 | @Override 25 | protected boolean isForViewType(@NonNull IMulti item, int position) { 26 | return item instanceof Footer; 27 | } 28 | 29 | @NonNull 30 | @Override 31 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 32 | return new ChildViewHolder(parent, R.layout.footer_layout); 33 | } 34 | 35 | @Override 36 | protected void onBindViewHolder(@NonNull IMulti item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 37 | ChildViewHolder vh = (ChildViewHolder) holder; 38 | vh.icon.setImageResource(R.drawable.ic_visibility); 39 | } 40 | 41 | static class ChildViewHolder extends BaseViewHolder { 42 | 43 | @BindView(android.R.id.icon) 44 | ImageView icon; 45 | 46 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 47 | super(parent, layoutResId); 48 | } 49 | 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/Header.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import com.lin.poweradapter.model.IMulti; 4 | 5 | /** 6 | * Created by lin18 on 2017/5/3. 7 | */ 8 | 9 | public class Header implements IMulti { 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/HeaderFooter2Adapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.lin.poweradapter.PowerViewHolder; 6 | import com.lin.poweradapter.MultiAdapter; 7 | import com.lin.poweradapter.model.IMulti; 8 | 9 | /** 10 | * Created by lin18 on 2017/5/2. 11 | */ 12 | 13 | public class HeaderFooter2Adapter extends MultiAdapter { 14 | 15 | public HeaderFooter2Adapter(@Nullable Object listener) { 16 | super(listener); 17 | delegatesManager.addDelegate(new AnalogAdapterDelegate()); 18 | delegatesManager.addDelegate(new headerAdapterDelegate()); 19 | delegatesManager.addDelegate(new FooterAdapterDelegate()); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/HeaderFooterActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | 8 | import com.lin.poweradapter.example.Analog; 9 | import com.lin.poweradapter.example.DatabaseService; 10 | import com.lin.poweradapter.example.RecyclerViewActivity; 11 | 12 | /** 13 | * Created by lin18 on 2017/4/27. 14 | */ 15 | 16 | public class HeaderFooterActivity extends RecyclerViewActivity { 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | configure(); 22 | adapter.setItems(DatabaseService.getSampleData(30)); 23 | adapter.setShowHeader(true); 24 | adapter.setShowFooter(true); 25 | } 26 | 27 | @NonNull 28 | @Override 29 | protected HeaderFooterAdapter createAdapter() { 30 | return new HeaderFooterAdapter(this); 31 | } 32 | 33 | @Override 34 | public void onItemClick(View v, int position) { 35 | super.onItemClick(v, position); 36 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItemExcludeHeader(position).text); 37 | } 38 | 39 | @Override 40 | public boolean onItemLongClick(View v, int position) { 41 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItemExcludeHeader(position).text); 42 | return true; 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/HeaderFooterActivity2.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | 7 | import com.lin.poweradapter.example.DatabaseService; 8 | import com.lin.poweradapter.example.RecyclerViewActivity; 9 | import com.lin.poweradapter.model.IMulti; 10 | 11 | /** 12 | * Created by lin18 on 2017/4/27. 13 | */ 14 | 15 | public class HeaderFooterActivity2 extends RecyclerViewActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | configure(); 21 | adapter.setItems(DatabaseService.getHeaderFooterData(30)); 22 | } 23 | 24 | @NonNull 25 | @Override 26 | protected HeaderFooter2Adapter createAdapter() { 27 | return new HeaderFooter2Adapter(this); 28 | } 29 | 30 | @Override 31 | public void onItemClick(View v, int position) { 32 | super.onItemClick(v, position); 33 | showToast("onItemClick-> position : " + position); 34 | } 35 | 36 | @Override 37 | public boolean onItemLongClick(View v, int position) { 38 | showToast("onItemLongClick-> position : " + position); 39 | return true; 40 | } 41 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/HeaderFooterAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.support.annotation.IntRange; 4 | import android.support.annotation.LayoutRes; 5 | import android.support.annotation.NonNull; 6 | import android.support.annotation.Nullable; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import com.lin.poweradapter.SingleAdapter; 13 | import com.lin.poweradapter.example.Analog; 14 | import com.lin.poweradapter.example.R; 15 | import com.lin.poweradapter.example.BaseViewHolder; 16 | 17 | import butterknife.BindView; 18 | 19 | /** 20 | * Created by lin18 on 2017/5/2. 21 | */ 22 | 23 | public class HeaderFooterAdapter extends SingleAdapter { 24 | 25 | public HeaderFooterAdapter(@Nullable Object listener) { 26 | super(listener); 27 | } 28 | 29 | @Override 30 | public boolean isSelectable(@IntRange(from = 0) int position) { 31 | return true; 32 | } 33 | 34 | @Override 35 | public BaseViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 36 | return new ChildViewHolder(parent, R.layout.analog_item); 37 | } 38 | 39 | @Override 40 | protected BaseViewHolder getHeaderHolder(ViewGroup parent) { 41 | return new HeaderViewHolder(parent, R.layout.header_layout); 42 | } 43 | 44 | @Override 45 | protected BaseViewHolder getFooterHolder(ViewGroup parent) { 46 | return new FooterViewHolder(parent, R.layout.footer_layout); 47 | } 48 | 49 | @Override 50 | public void onBindViewHolder(final BaseViewHolder holder, final int position) { 51 | super.onBindViewHolder(holder, position); 52 | if (getItemViewType(position) == HEADER) { 53 | final HeaderViewHolder vh = (HeaderViewHolder) holder; 54 | vh.icon.setImageResource(R.drawable.ic_airplay); 55 | } else if (getItemViewType(position) == FOOTER) { 56 | final FooterViewHolder vh = (FooterViewHolder) holder; 57 | vh.icon.setImageResource(R.drawable.ic_visibility); 58 | } 59 | } 60 | 61 | @Override 62 | public void onBindVHolder(BaseViewHolder holder, int position) { 63 | final Analog analog = getItemExcludeHeader(position); 64 | final ChildViewHolder vh = (ChildViewHolder) holder; 65 | vh.title.setText(analog.text); 66 | if (analog.resId > 0) { 67 | vh.icon.setImageResource(analog.resId); 68 | vh.icon.setVisibility(View.VISIBLE); 69 | } else { 70 | vh.icon.setVisibility(View.GONE); 71 | } 72 | 73 | } 74 | 75 | static class ChildViewHolder extends BaseViewHolder { 76 | 77 | @BindView(android.R.id.icon) 78 | ImageView icon; 79 | @BindView(android.R.id.title) 80 | TextView title; 81 | 82 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 83 | super(parent, layoutResId); 84 | } 85 | 86 | } 87 | 88 | static class HeaderViewHolder extends BaseViewHolder { 89 | @BindView(android.R.id.icon) 90 | ImageView icon; 91 | HeaderViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 92 | super(parent, layoutResId); 93 | } 94 | } 95 | 96 | static class FooterViewHolder extends BaseViewHolder { 97 | @BindView(android.R.id.icon) 98 | ImageView icon; 99 | FooterViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 100 | super(parent, layoutResId); 101 | } 102 | } 103 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/headerfooter/headerAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.headerfooter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | 8 | import com.lin.poweradapter.AdapterDelegate; 9 | import com.lin.poweradapter.PowerViewHolder; 10 | import com.lin.poweradapter.example.R; 11 | import com.lin.poweradapter.example.BaseViewHolder; 12 | import com.lin.poweradapter.model.IMulti; 13 | 14 | import java.util.List; 15 | 16 | import butterknife.BindView; 17 | 18 | /** 19 | * Created by lin18 on 2017/5/2. 20 | */ 21 | 22 | public class headerAdapterDelegate extends AdapterDelegate { 23 | 24 | @Override 25 | protected boolean isForViewType(@NonNull IMulti item, int position) { 26 | return item instanceof Header; 27 | } 28 | 29 | @NonNull 30 | @Override 31 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 32 | return new ChildViewHolder(parent, R.layout.header_layout); 33 | } 34 | 35 | @Override 36 | protected void onBindViewHolder(@NonNull IMulti item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 37 | ChildViewHolder vh = (ChildViewHolder) holder; 38 | vh.icon.setImageResource(R.drawable.ic_airplay); 39 | } 40 | 41 | static class ChildViewHolder extends BaseViewHolder { 42 | 43 | @BindView(android.R.id.icon) 44 | ImageView icon; 45 | 46 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 47 | super(parent, layoutResId); 48 | } 49 | 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/loadmore/HLoadMoreActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.loadmore; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | 10 | import com.lin.poweradapter.EndlessRecyclerViewScrollListener; 11 | import com.lin.poweradapter.SpaceItemDecoration; 12 | import com.lin.poweradapter.example.Analog; 13 | import com.lin.poweradapter.example.DatabaseService; 14 | import com.lin.poweradapter.example.R; 15 | import com.lin.poweradapter.example.RecyclerViewActivity; 16 | 17 | /** 18 | * Created by lin18 on 2017/4/27. 19 | */ 20 | 21 | public class HLoadMoreActivity extends RecyclerViewActivity { 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | configure(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false), new SpaceItemDecoration(this, R.drawable.h_divider, 1)); 27 | adapter.setItems(DatabaseService.getSampleData(40)); 28 | recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener((LinearLayoutManager) recyclerView.getLayoutManager(), adapter) { 29 | @Override 30 | public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { 31 | new Handler().postDelayed(new Runnable() { 32 | @Override 33 | public void run() { 34 | adapter.addAll(DatabaseService.getSampleData(30)); 35 | } 36 | }, 2000); 37 | } 38 | }); 39 | adapter.setLoadMore(true); 40 | } 41 | 42 | @NonNull 43 | @Override 44 | protected HLoadMoreAdapter createAdapter() { 45 | return new HLoadMoreAdapter(this); 46 | } 47 | 48 | @Override 49 | public void onItemClick(View v, int position) { 50 | super.onItemClick(v, position); 51 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).text); 52 | } 53 | 54 | @Override 55 | public boolean onItemLongClick(View v, int position) { 56 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 57 | return true; 58 | } 59 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/loadmore/HLoadMoreAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.loadmore; 2 | 3 | import android.support.annotation.IntRange; 4 | import android.support.annotation.LayoutRes; 5 | import android.support.annotation.NonNull; 6 | import android.support.annotation.Nullable; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import com.lin.poweradapter.SingleAdapter; 13 | import com.lin.poweradapter.example.Analog; 14 | import com.lin.poweradapter.example.BaseViewHolder; 15 | import com.lin.poweradapter.example.R; 16 | 17 | import butterknife.BindView; 18 | 19 | /** 20 | * Created by lin18 on 2017/5/2. 21 | */ 22 | 23 | public class HLoadMoreAdapter extends SingleAdapter { 24 | 25 | public HLoadMoreAdapter(@Nullable Object listener) { 26 | super(listener); 27 | } 28 | 29 | @Override 30 | public boolean isSelectable(@IntRange(from = 0) int position) { 31 | return true; 32 | } 33 | 34 | @Override 35 | protected CVViewHolder getLoadingMoreHolder(ViewGroup parent) { 36 | return new CVViewHolder(parent, R.layout.h_progress_item); 37 | } 38 | 39 | @Override 40 | public CVViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 41 | return new ChildViewHolder(parent, R.layout.h_load_more_item); 42 | } 43 | 44 | @Override 45 | public void onBindVHolder(CVViewHolder holder, int position) { 46 | ChildViewHolder childViewHolder = (ChildViewHolder) holder; 47 | final Analog analog = getItem(position); 48 | childViewHolder.title.setText(analog.text); 49 | if (analog.resId > 0) { 50 | childViewHolder.icon.setImageResource(analog.resId); 51 | childViewHolder.icon.setVisibility(View.VISIBLE); 52 | } else { 53 | childViewHolder.icon.setVisibility(View.GONE); 54 | } 55 | 56 | } 57 | 58 | static class LoadMoreViewHolder extends CVViewHolder { 59 | 60 | @BindView(android.R.id.icon) 61 | ImageView icon; 62 | @BindView(android.R.id.title) 63 | TextView title; 64 | 65 | LoadMoreViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 66 | super(parent, layoutResId); 67 | } 68 | 69 | } 70 | 71 | static class ChildViewHolder extends CVViewHolder { 72 | 73 | @BindView(android.R.id.icon) 74 | ImageView icon; 75 | @BindView(android.R.id.title) 76 | TextView title; 77 | 78 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 79 | super(parent, layoutResId); 80 | } 81 | 82 | } 83 | 84 | static class CVViewHolder extends BaseViewHolder { 85 | 86 | CVViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 87 | super(parent, layoutResId); 88 | } 89 | 90 | } 91 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/loadmore/LoadMoreActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.loadmore; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | 10 | import com.lin.poweradapter.EndlessRecyclerViewScrollListener; 11 | import com.lin.poweradapter.example.Analog; 12 | import com.lin.poweradapter.example.DatabaseService; 13 | import com.lin.poweradapter.example.RecyclerViewActivity; 14 | 15 | /** 16 | * Created by lin18 on 2017/4/27. 17 | */ 18 | 19 | public class LoadMoreActivity extends RecyclerViewActivity { 20 | 21 | int count; 22 | 23 | EndlessRecyclerViewScrollListener listener; 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | configure(); 29 | listener = new EndlessRecyclerViewScrollListener((LinearLayoutManager) recyclerView.getLayoutManager(), adapter) { 30 | @Override 31 | public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { 32 | count++; 33 | if (count < 6) { 34 | adapter.setLoadMore(false); 35 | new Handler().postDelayed(new Runnable() { 36 | @Override 37 | public void run() { 38 | adapter.addAll(DatabaseService.getSampleData(30)); 39 | adapter.setLoadMore(true); 40 | } 41 | }, 2000); 42 | } else { 43 | adapter.setLoadMore(false); 44 | } 45 | } 46 | }; 47 | recyclerView.addOnScrollListener(listener); 48 | adapter.setItems(DatabaseService.getSampleData(40)); 49 | adapter.setLoadMore(true); 50 | } 51 | 52 | @NonNull 53 | @Override 54 | protected LoadMoreAdapter createAdapter() { 55 | return new LoadMoreAdapter(this); 56 | } 57 | 58 | @Override 59 | public void onRefresh() { 60 | count = 0; 61 | new Handler().postDelayed(new Runnable() { 62 | @Override 63 | public void run() { 64 | listener.resetState(); 65 | adapter.setItems(DatabaseService.getSampleData(30)); 66 | adapter.setLoadMore(true); 67 | setRefreshing(false); 68 | } 69 | }, 2000); 70 | } 71 | 72 | @Override 73 | public void onItemClick(View v, int position) { 74 | super.onItemClick(v, position); 75 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).text); 76 | } 77 | 78 | @Override 79 | public boolean onItemLongClick(View v, int position) { 80 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 81 | return true; 82 | } 83 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/loadmore/LoadMoreAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.loadmore; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.IntRange; 5 | import android.support.annotation.LayoutRes; 6 | import android.support.annotation.NonNull; 7 | import android.support.annotation.Nullable; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import com.lin.poweradapter.SingleAdapter; 14 | import com.lin.poweradapter.example.Analog; 15 | import com.lin.poweradapter.example.BaseViewHolder; 16 | import com.lin.poweradapter.example.R; 17 | 18 | import butterknife.BindView; 19 | 20 | /** 21 | * Created by lin18 on 2017/5/2. 22 | */ 23 | 24 | public class LoadMoreAdapter extends SingleAdapter { 25 | 26 | public LoadMoreAdapter(@Nullable Object listener) { 27 | super(listener); 28 | } 29 | 30 | @Override 31 | public boolean isSelectable(@IntRange(from = 0) int position) { 32 | return true; 33 | } 34 | 35 | @Override 36 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 37 | return new ChildViewHolder(parent, R.layout.load_more_item); 38 | } 39 | 40 | @Override 41 | public void onBindVHolder(LoadMoreAdapter.ChildViewHolder holder, int position) { 42 | final Context context = holder.itemView.getContext(); 43 | final Analog analog = getItem(position); 44 | holder.title.setText(analog.text); 45 | if (analog.resId > 0) { 46 | holder.icon.setImageResource(analog.resId); 47 | holder.icon.setVisibility(View.VISIBLE); 48 | } else { 49 | holder.icon.setVisibility(View.GONE); 50 | } 51 | 52 | } 53 | 54 | static class ChildViewHolder extends BaseViewHolder { 55 | 56 | @BindView(android.R.id.icon) 57 | ImageView icon; 58 | @BindView(android.R.id.title) 59 | TextView title; 60 | 61 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 62 | super(parent, layoutResId); 63 | } 64 | 65 | } 66 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/Chat.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import com.lin.poweradapter.model.IMulti; 4 | 5 | /** 6 | * Created by lin18 on 2017/5/2. 7 | */ 8 | 9 | public class Chat implements IMulti { 10 | 11 | public boolean isFromMyself; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/ChatAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.Nullable; 4 | 5 | import com.lin.poweradapter.PowerViewHolder; 6 | import com.lin.poweradapter.DefaultAdapterDelegate; 7 | import com.lin.poweradapter.MultiAdapter; 8 | 9 | /** 10 | * Created by lin18 on 2017/5/2. 11 | */ 12 | 13 | public class ChatAdapter extends MultiAdapter { 14 | 15 | public ChatAdapter(@Nullable Object listener) { 16 | super(listener); 17 | delegatesManager.addDelegate(new LeftTextAdapterDelegate()); 18 | delegatesManager.addDelegate(new RightTextAdapterDelegate()); 19 | delegatesManager.addDelegate(new LeftFileAdapterDelegate()); 20 | delegatesManager.addDelegate(new RightFileAdapterDelegate()); 21 | delegatesManager.addDelegate(new LeftPhotoAdapterDelegate()); 22 | delegatesManager.addDelegate(new RightPhotoAdapterDelegate()); 23 | delegatesManager.addDelegate(new LeftVoiceAdapterDelegate()); 24 | delegatesManager.addDelegate(new RightVoiceAdapterDelegate()); 25 | delegatesManager.setFallbackDelegate(new DefaultAdapterDelegate()); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/FileAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.AdapterDelegate; 8 | import com.lin.poweradapter.PowerViewHolder; 9 | import com.lin.poweradapter.example.BaseViewHolder; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * Created by lin18 on 2017/5/2. 15 | */ 16 | 17 | public abstract class FileAdapterDelegate extends AdapterDelegate { 18 | 19 | @Override 20 | protected void onBindViewHolder(@NonNull Chat item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 21 | 22 | } 23 | 24 | static class ChildViewHolder extends BaseViewHolder { 25 | 26 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 27 | super(parent, layoutResId); 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/FileChat.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | /** 4 | * Created by lin18 on 2017/5/2. 5 | */ 6 | 7 | public class FileChat extends Chat { 8 | 9 | public int id; 10 | public String name; 11 | public String url; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/LeftFileAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | import com.lin.poweradapter.model.IMulti; 9 | 10 | /** 11 | * 12 | * Created by lin18 on 2017/4/18. 13 | */ 14 | 15 | public class LeftFileAdapterDelegate extends FileAdapterDelegate { 16 | 17 | @Override 18 | protected boolean isForViewType(@NonNull Chat items, int position) { 19 | return items instanceof FileChat && !items.isFromMyself; 20 | } 21 | 22 | @NonNull 23 | @Override 24 | protected LeftViewHolder onCreateViewHolder(ViewGroup parent) { 25 | return new LeftViewHolder(parent, R.layout.left_file_chat_item); 26 | } 27 | 28 | static class LeftViewHolder extends ChildViewHolder { 29 | 30 | LeftViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 31 | super(parent, layoutResId); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/LeftPhotoAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class LeftPhotoAdapterDelegate extends PhotoAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof PhotoChat && !items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected LeftViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new LeftViewHolder(parent, R.layout.left_photo_chat_item); 25 | } 26 | 27 | static class LeftViewHolder extends ChildViewHolder { 28 | 29 | LeftViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/LeftTextAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class LeftTextAdapterDelegate extends TextAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof TextChat && !items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected LeftViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new LeftViewHolder(parent, R.layout.left_text_chat_item); 25 | } 26 | 27 | static class LeftViewHolder extends TextAdapterDelegate.ChildViewHolder { 28 | 29 | LeftViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/LeftVoiceAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class LeftVoiceAdapterDelegate extends VoiceAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof VoiceChat && !items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected LeftViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new LeftViewHolder(parent, R.layout.left_voice_chat_item); 25 | } 26 | 27 | static class LeftViewHolder extends ChildViewHolder { 28 | 29 | LeftViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/MultiActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.os.Looper; 6 | import android.support.annotation.NonNull; 7 | import android.support.v7.app.AppCompatDelegate; 8 | import android.support.v7.widget.AppCompatEditText; 9 | import android.support.v7.widget.LinearLayoutManager; 10 | import android.text.TextUtils; 11 | import android.view.View; 12 | 13 | import com.lin.poweradapter.SpaceItemDecoration; 14 | import com.lin.poweradapter.example.R; 15 | import com.lin.poweradapter.example.RecyclerViewActivity; 16 | import com.lin.poweradapter.model.IMulti; 17 | 18 | import butterknife.BindView; 19 | import butterknife.OnClick; 20 | 21 | /** 22 | * Created by lin18 on 2017/4/27. 23 | */ 24 | 25 | public class MultiActivity extends RecyclerViewActivity { 26 | 27 | @BindView(R.id.et_reply) 28 | AppCompatEditText etReply; 29 | 30 | private boolean isFromMyself; 31 | 32 | private Handler handler = new Handler(Looper.getMainLooper()); 33 | 34 | @Override 35 | public int getLayoutResource() { 36 | return R.layout.activity_multi; 37 | } 38 | 39 | @Override 40 | protected void onCreate(Bundle savedInstanceState) { 41 | AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 42 | super.onCreate(savedInstanceState); 43 | LinearLayoutManager layoutManager = new LinearLayoutManager(this); 44 | layoutManager.setStackFromEnd(true); 45 | configure(layoutManager, new SpaceItemDecoration(this, -1, 10)); 46 | } 47 | 48 | @NonNull 49 | @Override 50 | protected ChatAdapter createAdapter() { 51 | return new ChatAdapter(this); 52 | } 53 | 54 | @OnClick({R.id.file, R.id.photo, R.id.voice, R.id.iv_send}) 55 | void onClick(View view) { 56 | switch (view.getId()) { 57 | case R.id.file: 58 | FileChat file = new FileChat(); 59 | file.isFromMyself = isFromMyself; 60 | adapter.addItem(file); 61 | break; 62 | 63 | case R.id.photo: 64 | PhotoChat photo = new PhotoChat(); 65 | photo.isFromMyself = isFromMyself; 66 | photo.resId = R.drawable.ic_insert_photo; 67 | adapter.addItem(photo); 68 | break; 69 | 70 | case R.id.voice: 71 | VoiceChat voice = new VoiceChat(); 72 | voice.isFromMyself = isFromMyself; 73 | adapter.addItem(voice); 74 | break; 75 | 76 | case R.id.iv_send: 77 | final String msg = etReply.getText().toString().trim(); 78 | if (TextUtils.isEmpty(msg)) return; 79 | TextChat text = new TextChat(); 80 | text.isFromMyself = isFromMyself; 81 | text.message = msg; 82 | adapter.addItem(text); 83 | etReply.setText(null); 84 | break; 85 | } 86 | isFromMyself = !isFromMyself; 87 | handler.postDelayed(new Runnable() { 88 | @Override 89 | public void run() { 90 | recyclerView.getLayoutManager().scrollToPosition(adapter.getItemCount() - 1); 91 | } 92 | }, 100); 93 | } 94 | 95 | @Override 96 | public void onItemClick(View v, int position) { 97 | super.onItemClick(v, position); 98 | } 99 | 100 | @Override 101 | public boolean onItemLongClick(View v, int position) { 102 | return super.onItemLongClick(v, position); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/PhotoAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | import android.widget.ImageView; 7 | 8 | import com.lin.poweradapter.AdapterDelegate; 9 | import com.lin.poweradapter.PowerViewHolder; 10 | import com.lin.poweradapter.example.BaseViewHolder; 11 | 12 | import java.util.List; 13 | 14 | import butterknife.BindView; 15 | 16 | /** 17 | * Created by lin18 on 2017/5/2. 18 | */ 19 | 20 | public abstract class PhotoAdapterDelegate extends AdapterDelegate { 21 | 22 | @Override 23 | protected void onBindViewHolder(@NonNull Chat item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 24 | ChildViewHolder vh = (ChildViewHolder) holder; 25 | PhotoChat photoChat = (PhotoChat) item; 26 | vh.icon.setImageResource(photoChat.resId); 27 | } 28 | 29 | static class ChildViewHolder extends BaseViewHolder { 30 | 31 | @BindView(android.R.id.icon) 32 | ImageView icon; 33 | 34 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 35 | super(parent, layoutResId); 36 | } 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/PhotoChat.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | /** 4 | * Created by lin18 on 2017/5/2. 5 | */ 6 | 7 | public class PhotoChat extends Chat { 8 | 9 | public int id; 10 | public int resId; 11 | public String url; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/RightFileAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class RightFileAdapterDelegate extends FileAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof FileChat && items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected RightViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new RightViewHolder(parent, R.layout.right_file_chat_item); 25 | } 26 | 27 | static class RightViewHolder extends ChildViewHolder { 28 | 29 | RightViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/RightPhotoAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class RightPhotoAdapterDelegate extends PhotoAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof PhotoChat && items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected RightViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new RightViewHolder(parent, R.layout.right_photo_chat_item); 25 | } 26 | 27 | static class RightViewHolder extends ChildViewHolder { 28 | 29 | RightViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/RightTextAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class RightTextAdapterDelegate extends TextAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof TextChat && items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected RightViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new RightViewHolder(parent, R.layout.right_text_chat_item); 25 | } 26 | 27 | static class RightViewHolder extends TextAdapterDelegate.ChildViewHolder { 28 | 29 | RightViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/RightVoiceAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.example.R; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/18. 12 | */ 13 | 14 | public class RightVoiceAdapterDelegate extends VoiceAdapterDelegate { 15 | 16 | @Override 17 | protected boolean isForViewType(@NonNull Chat items, int position) { 18 | return items instanceof VoiceChat && items.isFromMyself; 19 | } 20 | 21 | @NonNull 22 | @Override 23 | protected RightViewHolder onCreateViewHolder(ViewGroup parent) { 24 | return new RightViewHolder(parent, R.layout.right_voice_chat_item); 25 | } 26 | 27 | static class RightViewHolder extends ChildViewHolder { 28 | 29 | RightViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 30 | super(parent, layoutResId); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/TextAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | import android.widget.TextView; 7 | 8 | import com.lin.poweradapter.AdapterDelegate; 9 | import com.lin.poweradapter.PowerViewHolder; 10 | import com.lin.poweradapter.example.R; 11 | import com.lin.poweradapter.example.BaseViewHolder; 12 | 13 | import java.util.List; 14 | 15 | import butterknife.BindView; 16 | 17 | /** 18 | * Created by lin18 on 2017/5/2. 19 | */ 20 | 21 | public abstract class TextAdapterDelegate extends AdapterDelegate { 22 | 23 | @Override 24 | protected void onBindViewHolder(@NonNull Chat item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 25 | ChildViewHolder vh = (ChildViewHolder) holder; 26 | TextChat textChat = (TextChat) item; 27 | vh.textView.setText(textChat.message); 28 | } 29 | 30 | static class ChildViewHolder extends BaseViewHolder { 31 | 32 | @BindView(R.id.text_view) 33 | TextView textView; 34 | 35 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 36 | super(parent, layoutResId); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/TextChat.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | /** 4 | * Created by lin18 on 2017/5/2. 5 | */ 6 | 7 | public class TextChat extends Chat { 8 | 9 | public int id; 10 | public String message; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/VoiceAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.ViewGroup; 6 | 7 | import com.lin.poweradapter.AdapterDelegate; 8 | import com.lin.poweradapter.PowerViewHolder; 9 | import com.lin.poweradapter.example.BaseViewHolder; 10 | 11 | import java.util.List; 12 | 13 | 14 | /** 15 | * Created by lin18 on 2017/5/2. 16 | */ 17 | 18 | public abstract class VoiceAdapterDelegate extends AdapterDelegate { 19 | 20 | @Override 21 | protected void onBindViewHolder(@NonNull Chat item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 22 | } 23 | 24 | static class ChildViewHolder extends BaseViewHolder { 25 | 26 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 27 | super(parent, layoutResId); 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/multi/VoiceChat.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.multi; 2 | 3 | /** 4 | * Created by lin18 on 2017/5/2. 5 | */ 6 | 7 | public class VoiceChat extends Chat { 8 | 9 | public int id; 10 | public String name; 11 | public String url; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/select/MultiSelectActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.select; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | 7 | import com.lin.poweradapter.example.Analog; 8 | import com.lin.poweradapter.example.DatabaseService; 9 | import com.lin.poweradapter.example.RecyclerViewActivity; 10 | 11 | import static com.lin.poweradapter.SelectableAdapter.MODE_MULTI; 12 | 13 | /** 14 | * Created by lin18 on 2017/4/27. 15 | */ 16 | 17 | public class MultiSelectActivity extends RecyclerViewActivity { 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | configure(); 23 | adapter.setItems(DatabaseService.getSampleData(300)); 24 | adapter.setMode(MODE_MULTI); 25 | } 26 | 27 | @NonNull 28 | @Override 29 | protected SelectAdapter createAdapter() { 30 | return new SelectAdapter(this); 31 | } 32 | 33 | @Override 34 | public void onItemClick(View v, int position) { 35 | super.onItemClick(v, position); 36 | adapter.toggleSelection(position); 37 | } 38 | 39 | @Override 40 | public boolean onItemLongClick(View v, int position) { 41 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 42 | return true; 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/select/SelectActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.select; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | 7 | import com.lin.poweradapter.example.Analog; 8 | import com.lin.poweradapter.example.AnalogAdapter; 9 | import com.lin.poweradapter.example.DatabaseService; 10 | import com.lin.poweradapter.example.RecyclerViewActivity; 11 | 12 | import static com.lin.poweradapter.SelectableAdapter.MODE_SINGLE; 13 | 14 | /** 15 | * Created by lin18 on 2017/4/27. 16 | */ 17 | 18 | public class SelectActivity extends RecyclerViewActivity { 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | configure(); 24 | adapter.setItems(DatabaseService.getSampleData(300)); 25 | adapter.setMode(MODE_SINGLE); 26 | } 27 | 28 | @NonNull 29 | @Override 30 | protected AnalogAdapter createAdapter() { 31 | return new AnalogAdapter(this); 32 | } 33 | 34 | @Override 35 | public void onItemClick(View v, int position) { 36 | super.onItemClick(v, position); 37 | adapter.toggleSelection(position); 38 | } 39 | 40 | @Override 41 | public boolean onItemLongClick(View v, int position) { 42 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 43 | return true; 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/select/SelectAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.select; 2 | 3 | import android.support.annotation.IntRange; 4 | import android.support.annotation.LayoutRes; 5 | import android.support.annotation.NonNull; 6 | import android.support.annotation.Nullable; 7 | import android.view.ViewGroup; 8 | import android.widget.CheckedTextView; 9 | 10 | import com.lin.poweradapter.SingleAdapter; 11 | import com.lin.poweradapter.example.Analog; 12 | import com.lin.poweradapter.example.BaseViewHolder; 13 | import com.lin.poweradapter.example.R; 14 | 15 | import butterknife.BindView; 16 | 17 | /** 18 | * Created by lin18 on 2017/5/2. 19 | */ 20 | 21 | public class SelectAdapter extends SingleAdapter { 22 | 23 | public SelectAdapter(@Nullable Object listener) { 24 | super(listener); 25 | } 26 | 27 | @Override 28 | public boolean isSelectable(@IntRange(from = 0) int position) { 29 | return true; 30 | } 31 | 32 | @Override 33 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 34 | return new ChildViewHolder(parent, R.layout.item_multi_select); 35 | } 36 | 37 | @Override 38 | public void onBindVHolder(SelectAdapter.ChildViewHolder holder, int position) { 39 | final Analog analog = getItem(position); 40 | holder.title.setText(analog.text); 41 | holder.title.setChecked(isSelected(position)); 42 | } 43 | 44 | static class ChildViewHolder extends BaseViewHolder { 45 | 46 | @BindView(android.R.id.title) 47 | CheckedTextView title; 48 | 49 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 50 | super(parent, layoutResId); 51 | } 52 | 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/single/SingleActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.single; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.GridLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.View; 8 | 9 | import com.lin.poweradapter.SpaceItemDecoration; 10 | import com.lin.poweradapter.example.Analog; 11 | import com.lin.poweradapter.example.AnalogAdapter; 12 | import com.lin.poweradapter.example.DatabaseService; 13 | import com.lin.poweradapter.example.RecyclerViewActivity; 14 | 15 | /** 16 | * Created by lin18 on 2017/4/27. 17 | */ 18 | 19 | public class SingleActivity extends RecyclerViewActivity { 20 | 21 | @Override 22 | protected void onCreate(Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3); 25 | gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 26 | @Override 27 | public int getSpanSize(int position) { 28 | /* emulating https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B6Okdz75tqQsck9lUkgxNVZza1U/style_imagery_integration_scale1.png */ 29 | switch (position % 6) { 30 | case 5: 31 | return 3; 32 | case 3: 33 | return 2; 34 | default: 35 | return 1; 36 | } 37 | } 38 | }); 39 | configure(gridLayoutManager, new SpaceItemDecoration(this, -1, 10, 10)); 40 | adapter.setItems(DatabaseService.getSampleData(300)); 41 | final RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool(); 42 | recyclerView.setRecycledViewPool(viewPool); 43 | viewPool.setMaxRecycledViews(0, 30); 44 | } 45 | 46 | @NonNull 47 | @Override 48 | protected AnalogAdapter createAdapter() { 49 | return new AnalogAdapter(this); 50 | } 51 | 52 | @Override 53 | public void onItemClick(View v, int position) { 54 | super.onItemClick(v, position); 55 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).text); 56 | } 57 | 58 | @Override 59 | public boolean onItemLongClick(View v, int position) { 60 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).text); 61 | return true; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/staggered/Staggered.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.staggered; 2 | 3 | /** 4 | * Created by lin18 on 2017/5/2. 5 | */ 6 | 7 | public class Staggered { 8 | 9 | public String title; 10 | public String subtitle; 11 | public String more; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/staggered/StaggeredActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.staggered; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.OrientationHelper; 6 | import android.support.v7.widget.StaggeredGridLayoutManager; 7 | import android.view.View; 8 | 9 | import com.lin.poweradapter.SpaceItemDecoration; 10 | import com.lin.poweradapter.example.Analog; 11 | import com.lin.poweradapter.example.DatabaseService; 12 | import com.lin.poweradapter.example.RecyclerViewActivity; 13 | 14 | /** 15 | * Created by lin18 on 2017/4/27. 16 | */ 17 | 18 | public class StaggeredActivity extends RecyclerViewActivity { 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | configure(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL), new SpaceItemDecoration(this, -1, 10)); 24 | adapter.setItems(DatabaseService.getStaggeredData(50)); 25 | } 26 | 27 | @NonNull 28 | @Override 29 | protected StaggeredAdapter createAdapter() { 30 | return new StaggeredAdapter(this); 31 | } 32 | 33 | @Override 34 | public void onItemClick(View v, int position) { 35 | super.onItemClick(v, position); 36 | showToast("onItemClick-> position : " + position + " value : " + adapter.getItem(position).title); 37 | } 38 | 39 | @Override 40 | public boolean onItemLongClick(View v, int position) { 41 | showToast("onItemLongClick-> position : " + position + " value : " + adapter.getItem(position).title); 42 | return true; 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/staggered/StaggeredAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.staggered; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.text.TextUtils; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | import com.lin.poweradapter.SingleAdapter; 12 | import com.lin.poweradapter.example.R; 13 | import com.lin.poweradapter.example.BaseViewHolder; 14 | 15 | import butterknife.BindView; 16 | 17 | /** 18 | * Created by lin18 on 2017/5/2. 19 | */ 20 | 21 | public class StaggeredAdapter extends SingleAdapter { 22 | 23 | public StaggeredAdapter(@Nullable Object listener) { 24 | super(listener); 25 | } 26 | 27 | @Override 28 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 29 | return new ChildViewHolder(parent, R.layout.staggered_item); 30 | } 31 | 32 | @Override 33 | public void onBindVHolder(StaggeredAdapter.ChildViewHolder holder, int position) { 34 | final Staggered staggered = getItem(position); 35 | holder.title.setText(staggered.title); 36 | holder.subtitle.setText(staggered.subtitle); 37 | if (!TextUtils.isEmpty(staggered.more)) { 38 | holder.more.setHeight(50); 39 | holder.more.setText(staggered.more); 40 | holder.more.setVisibility(View.VISIBLE); 41 | } else { 42 | holder.more.setVisibility(View.GONE); 43 | } 44 | 45 | } 46 | 47 | static class ChildViewHolder extends BaseViewHolder { 48 | 49 | @BindView(R.id.title) 50 | TextView title; 51 | @BindView(R.id.subtitle) 52 | TextView subtitle; 53 | @BindView(R.id.more) 54 | TextView more; 55 | 56 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 57 | super(parent, layoutResId); 58 | } 59 | 60 | } 61 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/stickyheaders/City.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.stickyheaders; 2 | 3 | public class City { 4 | public String name; 5 | public String pys; 6 | public int type; 7 | 8 | @Override 9 | public String toString() { 10 | return "City{" + 11 | "name='" + name + '\'' + 12 | ", pys='" + pys + '\'' + 13 | ", type=" + type + 14 | '}'; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/stickyheaders/LetterComparator.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.stickyheaders; 2 | 3 | import android.text.TextUtils; 4 | 5 | import java.util.Comparator; 6 | 7 | public class LetterComparator implements Comparator { 8 | 9 | @Override 10 | public int compare(City l, City r) { 11 | if (l == null || r == null) { 12 | return 0; 13 | } 14 | 15 | String lhsSortLetters = l.pys.substring(0, 1).toUpperCase(); 16 | String rhsSortLetters = r.pys.substring(0, 1).toUpperCase(); 17 | if (TextUtils.isEmpty(lhsSortLetters) || TextUtils.isEmpty(rhsSortLetters)) { 18 | return 0; 19 | } 20 | return lhsSortLetters.compareTo(rhsSortLetters); 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/stickyheaders/StickyHeadersActivity.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.stickyheaders; 2 | 3 | import android.os.AsyncTask; 4 | import android.os.Bundle; 5 | import android.support.annotation.NonNull; 6 | import android.support.v7.widget.LinearLayoutManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.View; 9 | 10 | import com.gjiazhe.wavesidebar.WaveSideBar; 11 | import com.google.gson.reflect.TypeToken; 12 | import com.lin.poweradapter.example.R; 13 | import com.lin.poweradapter.example.RecyclerViewActivity; 14 | import com.lin.poweradapter.example.util.JSONUtils; 15 | import com.lin.poweradapter.example.util.Utils; 16 | import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration; 17 | 18 | import java.util.ArrayList; 19 | import java.util.Collections; 20 | import java.util.List; 21 | 22 | import butterknife.BindView; 23 | 24 | /** 25 | * Created by lin18 on 2017/4/27. 26 | */ 27 | 28 | public class StickyHeadersActivity extends RecyclerViewActivity { 29 | 30 | @BindView(R.id.side_bar) 31 | WaveSideBar sideBar; 32 | 33 | StickyRecyclerHeadersDecoration headersDecor; 34 | 35 | @Override 36 | public int getLayoutResource() { 37 | return R.layout.activity_stickyheaders; 38 | } 39 | 40 | @Override 41 | protected void onCreate(Bundle savedInstanceState) { 42 | super.onCreate(savedInstanceState); 43 | sideBar.setOnSelectIndexItemListener(new WaveSideBar.OnSelectIndexItemListener() { 44 | @Override 45 | public void onSelectIndexItem(String letter) { 46 | int pos = adapter.getLetterPosition(letter); 47 | 48 | if (pos != -1) { 49 | recyclerView.scrollToPosition(pos); 50 | LinearLayoutManager mLayoutManager = 51 | (LinearLayoutManager) recyclerView.getLayoutManager(); 52 | mLayoutManager.scrollToPositionWithOffset(pos, 0); 53 | } 54 | } 55 | }); 56 | 57 | configure(); 58 | headersDecor = new StickyRecyclerHeadersDecoration(adapter); 59 | recyclerView.addItemDecoration(headersDecor); 60 | adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 61 | @Override 62 | public void onChanged() { 63 | headersDecor.invalidateHeaders(); 64 | } 65 | }); 66 | loadData(); 67 | } 68 | 69 | @NonNull 70 | @Override 71 | protected StickyHeadersAdapter createAdapter() { 72 | return new StickyHeadersAdapter(this); 73 | } 74 | 75 | @Override 76 | protected void loadData() { 77 | new AsyncTask>() { 78 | 79 | @Override 80 | protected List doInBackground(Void... params) { 81 | final List list = JSONUtils.toList(Utils.readFromAssets(StickyHeadersActivity.this, "cities.json"), new TypeToken>() {}); 82 | Collections.sort(list, new LetterComparator()); 83 | return list; 84 | } 85 | 86 | @Override 87 | protected void onPostExecute(List cities) { 88 | super.onPostExecute(cities); 89 | if (isFinishing()) return; 90 | adapter.setItems(cities); 91 | setRefreshing(false); 92 | } 93 | }.execute(); 94 | } 95 | 96 | @Override 97 | public void onItemClick(View v, int position) { 98 | super.onItemClick(v, position); 99 | showToast("onItemClick : " + adapter.getItem(position).name); 100 | } 101 | 102 | @Override 103 | public boolean onItemLongClick(View v, int position) { 104 | showToast("onItemLongClick : " + adapter.getItem(position).name); 105 | return true; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/stickyheaders/StickyHeadersAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.stickyheaders; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.text.TextUtils; 8 | import android.view.ViewGroup; 9 | import android.widget.TextView; 10 | 11 | import com.lin.poweradapter.SingleAdapter; 12 | import com.lin.poweradapter.example.R; 13 | import com.lin.poweradapter.example.BaseViewHolder; 14 | import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter; 15 | 16 | import butterknife.BindView; 17 | 18 | /** 19 | * Created by lin18 on 2017/4/28. 20 | */ 21 | 22 | public class StickyHeadersAdapter extends SingleAdapter implements StickyRecyclerHeadersAdapter { 23 | 24 | public StickyHeadersAdapter(@Nullable Object listener) { 25 | super(listener); 26 | } 27 | 28 | @Override 29 | public ChildViewHolder onCreateVHolder(ViewGroup parent, int viewType) { 30 | return new ChildViewHolder(parent, R.layout.stickyheader_item); 31 | } 32 | 33 | @Override 34 | public void onBindVHolder(ChildViewHolder holder, int position) { 35 | holder.title.setText(getItem(position).name); 36 | } 37 | 38 | @Override 39 | public long getHeaderId(int position) { 40 | return getItem(position).pys.charAt(0); 41 | } 42 | 43 | @Override 44 | public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent) { 45 | return new HeaderViewHolder(parent, R.layout.item_pinned_header); 46 | } 47 | 48 | @Override 49 | public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int position) { 50 | String pys = getItem(position).pys; 51 | if (!TextUtils.isEmpty(pys) && pys.length() > 0) { 52 | if (holder != null && holder instanceof HeaderViewHolder && ((HeaderViewHolder) holder).city_tip != null) 53 | ((HeaderViewHolder) holder).city_tip.setText(pys.substring(0, 1)); 54 | } 55 | } 56 | 57 | public int getLetterPosition(String letter){ 58 | for (int i = 0 ; i < getItemCount(); i++){ 59 | if(getItem(i).pys.startsWith(letter)){ 60 | return i; 61 | } 62 | } 63 | return -1; 64 | } 65 | 66 | static class ChildViewHolder extends BaseViewHolder { 67 | 68 | @BindView(R.id.city_name) 69 | TextView title; 70 | 71 | ChildViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 72 | super(parent, layoutResId); 73 | } 74 | 75 | } 76 | 77 | static class HeaderViewHolder extends BaseViewHolder { 78 | 79 | @BindView(R.id.city_tip) 80 | TextView city_tip; 81 | 82 | HeaderViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 83 | super(parent, layoutResId); 84 | } 85 | 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/util/JSONUtils.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.util; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.JsonArray; 5 | import com.google.gson.JsonElement; 6 | import com.google.gson.JsonObject; 7 | import com.google.gson.JsonParser; 8 | import com.google.gson.reflect.TypeToken; 9 | 10 | import org.json.JSONException; 11 | import org.json.JSONObject; 12 | 13 | import java.util.ArrayList; 14 | import java.util.HashMap; 15 | import java.util.Iterator; 16 | import java.util.List; 17 | import java.util.Map; 18 | import java.util.Set; 19 | 20 | 21 | public class JSONUtils { 22 | 23 | /** 24 | * 获取JsonObject 25 | * @param json 26 | * @return 27 | */ 28 | public static JsonObject parseJson(String json){ 29 | JsonParser parser = new JsonParser(); 30 | JsonObject jsonObj = parser.parse(json).getAsJsonObject(); 31 | return jsonObj; 32 | } 33 | 34 | /** 35 | * 根据json字符串返回Map对象 36 | * @param json 37 | * @return 38 | */ 39 | public static Map toMap(String json){ 40 | return toMap(parseJson(json)); 41 | } 42 | 43 | /** 44 | * 将JSONObjec对象转换成Map-List集合 45 | * @param json 46 | * @return 47 | */ 48 | public static Map toMap(JsonObject json){ 49 | Map map = new HashMap(); 50 | Set> entrySet = json.entrySet(); 51 | for (Iterator> iter = entrySet.iterator(); iter.hasNext(); ){ 52 | Map.Entry entry = iter.next(); 53 | String key = entry.getKey(); 54 | Object value = entry.getValue(); 55 | if(value instanceof JsonArray) 56 | map.put((String) key, toList((JsonArray) value)); 57 | else if(value instanceof JsonObject) 58 | map.put((String) key, toMap((JsonObject) value)); 59 | else 60 | map.put((String) key, value); 61 | } 62 | return map; 63 | } 64 | 65 | /** 66 | * 将JSONArray对象转换成List集合 67 | * @param json 68 | * @return 69 | */ 70 | public static List toList(JsonArray json){ 71 | List list = new ArrayList(); 72 | for (int i=0; i T toObject(String json, TypeToken typeToken) { 88 | try { 89 | return new Gson().fromJson(json, typeToken.getType()); 90 | } catch (Exception e) { 91 | e.printStackTrace(); 92 | } 93 | return null; 94 | } 95 | 96 | public static final T toObject(String json, Class clazz){ 97 | try { 98 | return new Gson().fromJson(json, clazz); 99 | } catch (Exception e) { 100 | e.printStackTrace(); 101 | } 102 | return null; 103 | } 104 | 105 | public static final T toObject(JSONObject json, Class clazz) { 106 | try { 107 | return new Gson().fromJson(json.toString(), clazz); 108 | } catch (Exception e) { 109 | e.printStackTrace(); 110 | } 111 | return null; 112 | } 113 | 114 | /** 115 | * 解析某个json节点对应的内容为对象 116 | * @param json 117 | * @param tag 118 | * @param clazz 119 | * @return 120 | */ 121 | public static final T toObject(JSONObject json, String tag, Class clazz) { 122 | try { 123 | if(json.has(tag) && !json.isNull(tag)){ 124 | return new Gson().fromJson(json.getJSONObject(tag).toString(), clazz); 125 | } 126 | } catch (Exception e) { 127 | e.printStackTrace(); 128 | } 129 | return null; 130 | } 131 | 132 | /** 133 | * 解析jsonArray节点的数据到集合中 134 | * @param json 135 | * @param tag 节点名称 136 | * @param typeToken ,例如: new TypeToken>(){} 137 | * @return 138 | */ 139 | @SuppressWarnings("rawtypes") 140 | public static ArrayList toList(JSONObject json, String tag, TypeToken typeToken) { 141 | try { 142 | if(json.has(tag) && !json.isNull(tag)){ 143 | return new Gson().fromJson(json.getJSONArray(tag).toString(), typeToken.getType()); 144 | } 145 | } catch (JSONException e) { 146 | e.printStackTrace(); 147 | } 148 | return null; 149 | } 150 | 151 | 152 | @SuppressWarnings("rawtypes") 153 | public static ArrayList toList(String json, TypeToken typeToken) { 154 | return new Gson().fromJson(json, typeToken.getType()); 155 | } 156 | 157 | /** 158 | * 转换成json 159 | * @param list 160 | * @return 161 | */ 162 | @SuppressWarnings("rawtypes") 163 | public static String toJson(ArrayList list) { 164 | return new Gson().toJson(list); 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /app/src/main/java/com/lin/poweradapter/example/util/Utils.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example.util; 2 | 3 | import android.content.Context; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | import android.view.animation.AnimationUtils; 7 | 8 | import java.io.BufferedReader; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.io.InputStreamReader; 12 | 13 | /** 14 | * Created by lin18 on 2017/4/27. 15 | */ 16 | 17 | public class Utils { 18 | 19 | public static View fadeIn(@NonNull Context context, @NonNull View view) { 20 | return fadeIn(context, view, true); 21 | } 22 | 23 | public static View fadeIn(@NonNull Context context, @NonNull View view, boolean animate) { 24 | if (view != null) 25 | if (animate) 26 | view.startAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_in)); 27 | else 28 | view.clearAnimation(); 29 | return view; 30 | } 31 | 32 | public static String readFromAssets(Context context, String fileName) { 33 | StringBuffer strbuffer = new StringBuffer(); 34 | String line; 35 | BufferedReader reader = null; 36 | try { 37 | reader = new BufferedReader(new InputStreamReader(context.getResources().getAssets().open(fileName))); 38 | while ((line = reader.readLine()) != null) { 39 | strbuffer.append(line).append("\r\n"); 40 | } 41 | } catch (IOException e) { 42 | 43 | } finally { 44 | if (reader != null) { 45 | try { 46 | reader.close(); 47 | } catch (IOException e) { 48 | e.printStackTrace(); 49 | } 50 | } 51 | } 52 | return strbuffer.toString(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/res/animator/raise.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 11 | 12 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/selector_analog.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/h_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_airplay.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_down.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_down_selected.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_drop_up.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attach_file.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cloud_upload.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drag.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_download.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_import_export.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_insert_photo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_voice.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_photo_library.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_surround_sound.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_visibility.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_analog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_arrow_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 11 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_incoming_message.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_outcoming_message.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 41 | 42 | 46 | 47 | 51 | 52 | 53 | 54 | 59 | 60 | 65 | 66 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_expandable.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 16 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 15 | 16 | 24 | 25 | 26 | 27 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_multi.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 25 | 26 | 35 | 36 | 46 | 47 | 57 | 58 | 67 | 68 | 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_recyclerview.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 15 | 16 | 20 | 21 | 25 | 26 | 27 | 28 | 33 | 34 | 39 | 40 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_stickyheaders.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 15 | 16 | 20 | 21 | 25 | 26 | 27 | 28 | 35 | 36 | 41 | 42 | 47 | 48 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/analog_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dragswipe_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 23 | 24 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/footer_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/h_load_more_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/h_progress_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/header_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/ingredient_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_multi_select.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_pinned_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_error.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_progress.xml: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_file_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_photo_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_text_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/left_voice_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/load_more_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/recipe_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_file_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_photo_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_text_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/right_voice_chat_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/staggered_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 26 | 27 | 38 | 39 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/res/layout/stickyheader_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar_compat_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/toolbar_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/vegetarian_ingredient_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 13 | 14 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/vegetarian_recipe_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | 8 | #dddddd 9 | 10 | #3d3d3d 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16dp 3 | 8dp 4 | 5 | 10sp 6 | 32sp 7 | 12sp 8 | 20sp 9 | 20dp 10 | 24dp 11 | 12 | 15dp 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | PowerAdapter 3 | Settings 4 | 5 | 加载失败\n点击重试 6 | 空 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/test/java/com/lin/poweradapter/example/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.example; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.3.3' 9 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' 10 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6' 11 | classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | jcenter() 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | 28 | ext { 29 | minSdk = 14 30 | targetSdk = 25 31 | buildToolsVersion = '25.0.3' 32 | compileSdkVersion = 25 33 | 34 | javaSourceCompatibility = JavaVersion.VERSION_1_8 35 | javaTargetCompatibility = JavaVersion.VERSION_1_8 36 | 37 | // Libraries 38 | junitVersion = '4.12' 39 | supportVersion = '25.3.1' 40 | butterknifeVersion = '8.5.1' 41 | 42 | 43 | //Support Libraries dependencies 44 | supportDependencies = [ 45 | annotations : "com.android.support:support-annotations:${supportVersion}", 46 | design : "com.android.support:design:${supportVersion}", 47 | recyclerview : "com.android.support:recyclerview-v7:${supportVersion}", 48 | appcompat : "com.android.support:appcompat-v7:${supportVersion}", 49 | cardview : "com.android.support:cardview-v7:${supportVersion}" 50 | ] 51 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Apr 24 15:35:25 CST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/bintray.gradle: -------------------------------------------------------------------------------- 1 | group = PROJ_GROUP 2 | version = PROJ_VERSION 3 | project.archivesBaseName = PROJ_ARTIFACTID 4 | 5 | apply plugin: 'com.jfrog.bintray' 6 | apply plugin: 'com.github.dcendents.android-maven' 7 | 8 | task sourcesJar(type: Jar) { 9 | from android.sourceSets.main.java.srcDirs 10 | classifier = 'sources' 11 | } 12 | 13 | task javadoc(type: Javadoc) { 14 | source = android.sourceSets.main.java.srcDirs 15 | classpath += configurations.compile 16 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 17 | } 18 | 19 | task javadocJar(type: Jar, dependsOn: javadoc) { 20 | classifier = 'javadoc' 21 | from javadoc.destinationDir 22 | } 23 | 24 | javadoc { 25 | options{ 26 | encoding "UTF-8" 27 | charSet 'UTF-8' 28 | author true 29 | version true 30 | links "https://androiddoc.qiniudn.com/reference/" 31 | title "$PROJ_NAME $PROJ_VERSION" 32 | } 33 | } 34 | 35 | artifacts { 36 | archives sourcesJar 37 | archives javadocJar 38 | } 39 | 40 | install { 41 | repositories.mavenInstaller { 42 | pom.project { 43 | name PROJ_NAME 44 | description PROJ_DESCRIPTION 45 | url PROJ_WEBSITEURL 46 | inceptionYear '2016' 47 | 48 | packaging 'aar' 49 | groupId PROJ_GROUP 50 | artifactId PROJ_ARTIFACTID 51 | version PROJ_VERSION 52 | 53 | licenses { 54 | license { 55 | name 'The Apache Software License, Version 2.0' 56 | url 'http://www.apache.org/licenses/LICENSE-2.0.txt' 57 | distribution 'repo' 58 | } 59 | } 60 | scm { 61 | connection PROJ_VCSURL 62 | url PROJ_WEBSITEURL 63 | 64 | } 65 | developers { 66 | developer { 67 | id DEVELOPER_ID 68 | name DEVELOPER_NAME 69 | email DEVELOPER_EMAIL 70 | } 71 | } 72 | } 73 | } 74 | } 75 | 76 | bintray { 77 | user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : project.property('BINTRAY_USER') 78 | key = project.hasProperty('bintrayKey') ? project.property('bintrayKey') : project.property('BINTRAY_KEY') 79 | 80 | configurations = ['archives'] 81 | 82 | dryRun = false 83 | publish = true 84 | 85 | pkg { 86 | repo = 'maven' 87 | name = PROJ_NAME 88 | licenses = ['Apache-2.0'] 89 | vcsUrl = PROJ_VCSURL 90 | websiteUrl = PROJ_WEBSITEURL 91 | issueTrackerUrl = PROJ_ISSUETRACKERURL 92 | publicDownloadNumbers = true 93 | version { 94 | name = PROJ_VERSION 95 | desc = PROJ_DESCRIPTION 96 | vcsTag = PROJ_VERSION 97 | 98 | gpg { 99 | sign = true 100 | } 101 | } 102 | } 103 | } 104 | 105 | //以下内容用于发布SNAPSHOT版本,如果不需要可以移除。 106 | //参考自:https://www.jfrog.com/confluence/display/RTF/Gradle+Artifactory+Plugin 107 | 108 | apply plugin: "com.jfrog.artifactory" 109 | artifactory { 110 | contextUrl = 'http://oss.jfrog.org/artifactory' //The base Artifactory URL if not overridden by the publisher/resolver 111 | resolve { 112 | repository { 113 | repoKey = 'libs-release' 114 | } 115 | } 116 | publish { 117 | repository { 118 | repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to 119 | username = bintray.user 120 | password = bintray.key 121 | maven = true 122 | } 123 | defaults { 124 | //这里的名字和前面bintray.configurations的值一致即可,会将其包含的输出上传到jfrog上去 125 | publishConfigs('archives') 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.ext.compileSdkVersion 5 | buildToolsVersion rootProject.ext.buildToolsVersion 6 | 7 | defaultConfig { 8 | minSdkVersion rootProject.ext.minSdk 9 | targetSdkVersion rootProject.ext.targetSdk 10 | versionCode 10 11 | versionName "1.8" 12 | 13 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 14 | 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 20 | } 21 | } 22 | } 23 | 24 | allprojects { 25 | tasks.withType(Javadoc) { 26 | options{ 27 | encoding "UTF-8" 28 | charSet 'UTF-8' 29 | links "http://docs.oracle.com/javase/7/docs/api" 30 | } 31 | } 32 | } 33 | 34 | dependencies { 35 | compile fileTree(dir: 'libs', include: ['*.jar']) 36 | compile supportDependencies.annotations 37 | compile supportDependencies.recyclerview 38 | } 39 | 40 | //apply from: 'bintray.gradle' 41 | //apply from: "https://raw.githubusercontent.com/xiaopansky/android-library-publish-to-jcenter/master/bintrayUpload.gradle" -------------------------------------------------------------------------------- /library/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\soft\android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/AbsFallbackAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.NonNull; 4 | 5 | public abstract class AbsFallbackAdapterDelegate extends AdapterDelegate { 6 | 7 | @Override final protected boolean isForViewType(@NonNull Object item, int position) { 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/AdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import java.util.List; 10 | 11 | public abstract class AdapterDelegate { 12 | 13 | protected abstract boolean isForViewType(@NonNull T item, int position); 14 | 15 | @NonNull 16 | abstract protected VH onCreateViewHolder(@NonNull ViewGroup parent); 17 | 18 | protected abstract void onBindViewHolder(@NonNull T item, int position, 19 | @NonNull VH holder, @NonNull List payloads); 20 | 21 | protected void setSelecttion(@NonNull VH holder, boolean checked) { 22 | } 23 | 24 | protected void onViewRecycled(@NonNull VH viewHolder) { 25 | } 26 | 27 | protected boolean onFailedToRecycleView(@NonNull VH holder) { 28 | return false; 29 | } 30 | 31 | protected void onViewAttachedToWindow(@NonNull VH holder) { 32 | } 33 | 34 | protected void onViewDetachedFromWindow(VH holder) { 35 | } 36 | 37 | public static View getItemView(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 38 | return LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/AnimatorAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.animation.Animator; 4 | import android.support.v7.widget.RecyclerView; 5 | import android.view.View; 6 | import android.view.animation.Interpolator; 7 | import android.view.animation.LinearInterpolator; 8 | 9 | /** 10 | * Created by lin18 on 2017/5/3. 11 | */ 12 | 13 | public abstract class AnimatorAdapter extends SelectableAdapter { 14 | 15 | private int mDuration = 300; 16 | private Interpolator mInterpolator = new LinearInterpolator(); 17 | private int mLastPosition = -1; 18 | 19 | private boolean isFirstOnly = true; 20 | 21 | @Override 22 | public void onBindViewHolder(VH holder, int position) { 23 | super.onBindViewHolder(holder, position); 24 | final Animator[] animators = getAnimators(holder.itemView); 25 | if (animators != null) { 26 | int adapterPosition = holder.getAdapterPosition(); 27 | if (!isFirstOnly || adapterPosition > mLastPosition) { 28 | for (Animator anim : animators) { 29 | anim.setDuration(mDuration).start(); 30 | anim.setInterpolator(mInterpolator); 31 | } 32 | mLastPosition = adapterPosition; 33 | } else { 34 | ViewHelper.clear(holder.itemView); 35 | } 36 | } 37 | } 38 | 39 | public void setFirstOnly(boolean firstOnly) { 40 | isFirstOnly = firstOnly; 41 | } 42 | 43 | protected Animator[] getAnimators(View view) { 44 | return null; 45 | } 46 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ChildExpandViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | /** 10 | * 11 | * Created by lin18 on 2017/4/26. 12 | */ 13 | 14 | public class ChildExpandViewHolder extends PowerViewHolder { 15 | 16 | C mChild; 17 | ExpandableAdapter mExpandableAdapter; 18 | 19 | public ChildExpandViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 20 | super(parent, layoutResId); 21 | } 22 | 23 | public ChildExpandViewHolder(View itemView) { 24 | super(itemView); 25 | } 26 | 27 | public C getChild() { 28 | return mChild; 29 | } 30 | 31 | public int getParentAdapterPosition() { 32 | int flatPosition = getAdapterPosition(); 33 | if (mExpandableAdapter == null || flatPosition == RecyclerView.NO_POSITION) { 34 | return RecyclerView.NO_POSITION; 35 | } 36 | 37 | return mExpandableAdapter.getNearestParentPosition(flatPosition); 38 | } 39 | 40 | public int getChildAdapterPosition() { 41 | int flatPosition = getAdapterPosition(); 42 | if (mExpandableAdapter == null || flatPosition == RecyclerView.NO_POSITION) { 43 | return RecyclerView.NO_POSITION; 44 | } 45 | 46 | return mExpandableAdapter.getChildPosition(flatPosition); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/DataLoadingCallbacks.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | /** 4 | * 5 | * Created by lin18 on 2017/4/19. 6 | */ 7 | 8 | public interface DataLoadingCallbacks { 9 | 10 | boolean isDataLoading(); 11 | void dataStartedLoading(); 12 | void dataFinishedLoading(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/DefaultAdapterDelegate.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.NonNull; 4 | import android.support.v4.widget.Space; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 12 | * Created by lin18 on 2017/4/18. 13 | */ 14 | 15 | public class DefaultAdapterDelegate extends AdapterDelegate { 16 | 17 | @Override 18 | protected boolean isForViewType(@NonNull T item, int position) { 19 | return true; 20 | } 21 | 22 | @NonNull 23 | @Override 24 | protected PowerViewHolder onCreateViewHolder(ViewGroup parent) { 25 | return new PowerViewHolder(new Space(parent.getContext())); 26 | } 27 | 28 | @Override 29 | protected void onBindViewHolder(@NonNull T item, int position, @NonNull PowerViewHolder holder, @NonNull List payloads) { 30 | 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/DragSwipeViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | /** 9 | * 10 | * Created by lin18 on 2017/4/24. 11 | */ 12 | 13 | public class DragSwipeViewHolder extends PowerViewHolder implements ItemTouchHelperViewHolder { 14 | 15 | public DragSwipeViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 16 | super(parent, layoutResId); 17 | } 18 | 19 | public DragSwipeViewHolder(View itemView) { 20 | super(itemView); 21 | } 22 | 23 | @Override 24 | public void onItemSelected() { 25 | itemView.setActivated(true); 26 | } 27 | 28 | @Override 29 | public void onItemClear() { 30 | itemView.setActivated(false); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ItemTouchHelperAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | public interface ItemTouchHelperAdapter { 4 | 5 | boolean onItemMove(int fromPosition, int toPosition); 6 | 7 | void onItemDismiss(int position); 8 | } 9 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ItemTouchHelperViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | public interface ItemTouchHelperViewHolder { 4 | 5 | void onItemSelected(); 6 | 7 | void onItemClear(); 8 | } 9 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/MultiAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.CallSuper; 4 | import android.support.annotation.NonNull; 5 | import android.support.annotation.Nullable; 6 | import android.view.ViewGroup; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 12 | * Created by lin18 on 2017/4/8. 13 | */ 14 | 15 | public abstract class MultiAdapter extends SingleAdapter { 16 | 17 | @NonNull 18 | protected AdapterDelegatesManager delegatesManager; 19 | 20 | public MultiAdapter(@NonNull List items) { 21 | super(items); 22 | this.delegatesManager = new AdapterDelegatesManager<>(); 23 | } 24 | 25 | public MultiAdapter(@Nullable Object listener) { 26 | super(listener); 27 | this.delegatesManager = new AdapterDelegatesManager<>(); 28 | } 29 | 30 | public MultiAdapter(@Nullable Object listener, @NonNull List items) { 31 | super(listener, items); 32 | this.delegatesManager = new AdapterDelegatesManager<>(); 33 | } 34 | 35 | @CallSuper 36 | @Override 37 | public VH onCreateVHolder(ViewGroup parent, int viewType) { 38 | return delegatesManager.onCreateViewHolder(parent, viewType); 39 | } 40 | 41 | @CallSuper 42 | @Override 43 | public void onBindVHolder(VH holder, int position) { 44 | delegatesManager.onBindViewHolder(getItem(position), position, isSelected(position), holder, null); 45 | } 46 | 47 | @Override 48 | public void onBindViewHolder(VH holder, int position, List payloads) { 49 | if (getItemViewType(position) == LOAD_MORE) { 50 | 51 | } else if (getItemViewType(position) == HEADER) { 52 | 53 | } else if (getItemViewType(position) == FOOTER) { 54 | 55 | } else { 56 | setListener(holder, position); 57 | delegatesManager.onBindViewHolder(getItem(position), position, isSelected(position), holder, payloads); 58 | } 59 | } 60 | 61 | @Override 62 | public int getItemViewType(int position) { 63 | if (getDataItemCount() > 0 && position < getItemCountContainHeader()) { 64 | return delegatesManager.getItemViewType(getItem(position), position); 65 | } 66 | return super.getItemViewType(position); 67 | } 68 | 69 | @Override 70 | public void onViewRecycled(VH holder) { 71 | super.onViewRecycled(holder); 72 | delegatesManager.onViewRecycled(holder); 73 | } 74 | 75 | @Override 76 | public boolean onFailedToRecycleView(VH holder) { 77 | super.onFailedToRecycleView(holder); 78 | return delegatesManager.onFailedToRecycleView(holder); 79 | } 80 | 81 | @Override 82 | public void onViewAttachedToWindow(VH holder) { 83 | super.onViewAttachedToWindow(holder); 84 | delegatesManager.onViewAttachedToWindow(holder); 85 | } 86 | 87 | @Override 88 | public void onViewDetachedFromWindow(VH holder) { 89 | super.onViewDetachedFromWindow(holder); 90 | delegatesManager.onViewDetachedFromWindow(holder); 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/OnStartDragListener.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.v7.widget.RecyclerView; 4 | 5 | /** 6 | * Listener for manual initiation of a drag. 7 | */ 8 | public interface OnStartDragListener { 9 | 10 | /** 11 | * Called when a view is requesting a start of a drag. 12 | * 13 | * @param viewHolder The holder of the view to drag. 14 | */ 15 | void onStartDrag(RecyclerView.ViewHolder viewHolder); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ParentExpandViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import com.lin.poweradapter.model.Parent; 10 | 11 | /** 12 | * 13 | * Created by lin18 on 2017/4/26. 14 | */ 15 | 16 | public class ParentExpandViewHolder, C> extends PowerViewHolder { 17 | 18 | P mParent; 19 | ExpandableAdapter mExpandableAdapter; 20 | 21 | public ParentExpandViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 22 | super(parent, layoutResId); 23 | } 24 | 25 | public ParentExpandViewHolder(View itemView) { 26 | super(itemView); 27 | } 28 | 29 | public P getParent() { 30 | return mParent; 31 | } 32 | 33 | public int getParentAdapterPosition() { 34 | int flatPosition = getAdapterPosition(); 35 | if (flatPosition == RecyclerView.NO_POSITION) { 36 | return flatPosition; 37 | } 38 | 39 | return mExpandableAdapter.getNearestParentPosition(flatPosition); 40 | } 41 | 42 | public void onExpansionToggled(boolean expanded) { 43 | 44 | } 45 | 46 | public boolean shouldItemViewClickToggleExpansion() { 47 | return true; 48 | } 49 | 50 | protected void expandView() { 51 | onExpansionToggled(false); 52 | } 53 | 54 | protected void collapseView() { 55 | onExpansionToggled(true); 56 | } 57 | 58 | interface ParentViewHolderExpandCollapseListener { 59 | 60 | void onParentExpanded(int flatParentPosition); 61 | 62 | void onParentCollapsed(int flatParentPosition); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/PowerViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | /** 11 | * ViewHolder 基类 12 | * Created by lin18 on 2017/4/8. 13 | */ 14 | public class PowerViewHolder extends RecyclerView.ViewHolder { 15 | 16 | View contentView; 17 | 18 | public PowerViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 19 | this(inflate(parent, layoutResId)); 20 | } 21 | 22 | public PowerViewHolder(View itemView) { 23 | super(itemView); 24 | } 25 | 26 | public void setContentView(View contentView) { 27 | this.contentView = contentView; 28 | } 29 | 30 | public final View getContentView() { 31 | return contentView != null ? contentView : itemView; 32 | } 33 | 34 | public static View inflate(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 35 | return LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/SimpleItemTouchHelperCallback.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.graphics.Canvas; 4 | import android.support.v7.widget.GridLayoutManager; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.support.v7.widget.helper.ItemTouchHelper; 7 | 8 | public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { 9 | 10 | public static final float ALPHA_FULL = 1.0f; 11 | 12 | private boolean longPressDragEnabled = false, swipeEnabled = false; 13 | 14 | private final ItemTouchHelperAdapter mAdapter; 15 | 16 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { 17 | this(adapter, false); 18 | } 19 | 20 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean longPressDragEnabled) { 21 | this(adapter, longPressDragEnabled, false); 22 | } 23 | 24 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean longPressDragEnabled, boolean swipeEnabled) { 25 | mAdapter = adapter; 26 | this.longPressDragEnabled = longPressDragEnabled; 27 | this.swipeEnabled = swipeEnabled; 28 | } 29 | 30 | public void setLongPressDragEnabled(boolean isLongPressDragEnabled) { 31 | this.longPressDragEnabled = isLongPressDragEnabled; 32 | } 33 | 34 | @Override 35 | public boolean isLongPressDragEnabled() { 36 | return longPressDragEnabled; 37 | } 38 | 39 | public void setSwipeEnabled(boolean isSwipeEnabled) { 40 | this.swipeEnabled = isSwipeEnabled; 41 | } 42 | 43 | @Override 44 | public boolean isItemViewSwipeEnabled() { 45 | return swipeEnabled; 46 | } 47 | 48 | @Override 49 | public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 50 | // Set movement flags based on the layout manager 51 | if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { 52 | final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 53 | final int swipeFlags = 0; 54 | return makeMovementFlags(dragFlags, swipeFlags); 55 | } else { 56 | final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; 57 | final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; 58 | return makeMovementFlags(dragFlags, swipeFlags); 59 | } 60 | } 61 | 62 | @Override 63 | public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { 64 | if (source.getItemViewType() != target.getItemViewType()) { 65 | return false; 66 | } 67 | 68 | // Notify the adapter of the move 69 | mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); 70 | return true; 71 | } 72 | 73 | @Override 74 | public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) { 75 | // Notify the adapter of the dismissal 76 | mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); 77 | } 78 | 79 | @Override 80 | public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 81 | if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 82 | // Fade out the view as it is swiped out of the parent's bounds 83 | final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); 84 | viewHolder.itemView.setAlpha(alpha); 85 | viewHolder.itemView.setTranslationX(dX); 86 | } else { 87 | super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 88 | } 89 | } 90 | 91 | @Override 92 | public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 93 | // We only want the active item to change 94 | if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 95 | if (viewHolder instanceof ItemTouchHelperViewHolder) { 96 | // Let the view holder know that this item is being moved or dragged 97 | ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 98 | itemViewHolder.onItemSelected(); 99 | } 100 | } 101 | 102 | super.onSelectedChanged(viewHolder, actionState); 103 | } 104 | 105 | @Override 106 | public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 107 | super.clearView(recyclerView, viewHolder); 108 | 109 | viewHolder.itemView.setAlpha(ALPHA_FULL); 110 | 111 | if (viewHolder instanceof ItemTouchHelperViewHolder) { 112 | // Tell the view holder it's time to restore the idle state 113 | ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 114 | itemViewHolder.onItemClear(); 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/SpaceItemDecoration.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 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.annotation.DrawableRes; 9 | import android.support.annotation.IntRange; 10 | import android.support.annotation.NonNull; 11 | import android.support.v4.content.ContextCompat; 12 | import android.support.v4.view.ViewCompat; 13 | import android.support.v7.widget.LinearLayoutManager; 14 | import android.support.v7.widget.OrientationHelper; 15 | import android.support.v7.widget.RecyclerView; 16 | import android.support.v7.widget.StaggeredGridLayoutManager; 17 | import android.view.View; 18 | 19 | public class SpaceItemDecoration extends RecyclerView.ItemDecoration { 20 | 21 | private Drawable mDivider; 22 | private int mSectionOffsetV; 23 | private int mSectionOffsetH; 24 | private boolean mDrawOver = true, withOffset = false; 25 | 26 | private static final int[] ATTRS = new int[]{ 27 | android.R.attr.listDivider 28 | }; 29 | 30 | public SpaceItemDecoration(Context context) { 31 | final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); 32 | mDivider = styledAttributes.getDrawable(0); 33 | styledAttributes.recycle(); 34 | } 35 | 36 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId) { 37 | this(context, resId, 0); 38 | } 39 | 40 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, 41 | @IntRange(from = 0) int sectionOffset) { 42 | this(context, resId, sectionOffset, 0); 43 | } 44 | 45 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, 46 | @IntRange(from = 0) int sectionOffsetV, @IntRange(from = 0) int sectionOffsetH) { 47 | if (resId > 0) mDivider = ContextCompat.getDrawable(context, resId); 48 | mSectionOffsetV = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetV); 49 | mSectionOffsetH = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetH); 50 | } 51 | 52 | public SpaceItemDecoration withDrawOver(boolean drawOver) { 53 | this.mDrawOver = drawOver; 54 | return this; 55 | } 56 | 57 | @Override 58 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 59 | if (mDivider != null && !mDrawOver) { 60 | draw(c, parent); 61 | } 62 | } 63 | 64 | @Override 65 | public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 66 | if (mDivider != null && mDrawOver) { 67 | draw(c, parent); 68 | } 69 | } 70 | 71 | private void draw(Canvas c, RecyclerView parent) { 72 | int left = parent.getPaddingLeft(); 73 | int right = parent.getWidth() - parent.getPaddingRight(); 74 | 75 | int childCount = parent.getChildCount(); 76 | for (int i = 0; i < childCount; i++) { 77 | View child = parent.getChildAt(i); 78 | 79 | RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 80 | 81 | int top = child.getBottom() + params.bottomMargin + 82 | Math.round(ViewCompat.getTranslationY(child)); 83 | int bottom = top + (mDivider.getIntrinsicHeight() <= 0 ? 1 : mDivider.getIntrinsicHeight()); 84 | 85 | mDivider.setBounds(left, top, right, bottom); 86 | mDivider.draw(c); 87 | } 88 | } 89 | 90 | public SpaceItemDecoration withOffset(boolean withOffset) { 91 | this.withOffset = withOffset; 92 | return this; 93 | } 94 | 95 | /** 96 | * 97 | */ 98 | @SuppressWarnings({"ConstantConditions", "unchecked", "SuspiciousNameCombination"}) 99 | @Override 100 | public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) { 101 | if (getOrientation(recyclerView.getLayoutManager()) == RecyclerView.VERTICAL) { 102 | outRect.set(mSectionOffsetH, 0, mSectionOffsetH, mSectionOffsetV); 103 | } else { 104 | outRect.set(0, 0, mSectionOffsetV, 0); 105 | } 106 | } 107 | 108 | public static int getOrientation(RecyclerView.LayoutManager layoutManager) { 109 | if (layoutManager instanceof LinearLayoutManager) { 110 | return ((LinearLayoutManager) layoutManager).getOrientation(); 111 | } else if (layoutManager instanceof StaggeredGridLayoutManager) { 112 | return ((StaggeredGridLayoutManager) layoutManager).getOrientation(); 113 | } 114 | return OrientationHelper.HORIZONTAL; 115 | } 116 | 117 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ViewHelper.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.v4.view.ViewCompat; 4 | import android.view.View; 5 | 6 | /** 7 | * Copyright (C) 2017 Wasabeef 8 | * 9 | * Licensed under the Apache License, Version 2.0 (the "License"); 10 | * you may not use this file except in compliance with the License. 11 | * You may obtain a copy of the License at 12 | * 13 | * http://www.apache.org/licenses/LICENSE-2.0 14 | * 15 | * Unless required by applicable law or agreed to in writing, software 16 | * distributed under the License is distributed on an "AS IS" BASIS, 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | * See the License for the specific language governing permissions and 19 | * limitations under the License. 20 | */ 21 | 22 | public final class ViewHelper { 23 | 24 | public static void clear(View v) { 25 | ViewCompat.setAlpha(v, 1); 26 | ViewCompat.setScaleY(v, 1); 27 | ViewCompat.setScaleX(v, 1); 28 | ViewCompat.setTranslationY(v, 0); 29 | ViewCompat.setTranslationX(v, 0); 30 | ViewCompat.setRotation(v, 0); 31 | ViewCompat.setRotationY(v, 0); 32 | ViewCompat.setRotationX(v, 0); 33 | ViewCompat.setPivotY(v, v.getMeasuredHeight() / 2); 34 | ViewCompat.setPivotX(v, v.getMeasuredWidth() / 2); 35 | ViewCompat.animate(v).setInterpolator(null).setStartDelay(0); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/IMulti.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | /** 4 | * Created by owp on 2017/4/25. 5 | */ 6 | 7 | public interface IMulti { 8 | } 9 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/Parent.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Interface for implementing required methods in a parent. 7 | */ 8 | public interface Parent { 9 | 10 | /** 11 | * Getter for the list of this parent's child items. 12 | * 13 | * If list is empty, the parent has no children. 14 | * 15 | * @return A {@link List} of the children of this {@link Parent} 16 | */ 17 | List getChildList(); 18 | 19 | /** 20 | * Getter used to determine if this {@link Parent}'s 21 | * {@link android.view.View} should show up initially as expanded. 22 | * 23 | * @return true if expanded, false if not 24 | */ 25 | boolean isInitiallyExpanded(); 26 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/SimpleParent.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Simple implementation of the ParentListItem interface, 7 | * by default all items are not initially expanded. 8 | * 9 | * @param Type of the Child Items held by the Parent. 10 | */ 11 | public class SimpleParent implements Parent { 12 | 13 | private List mChildList; 14 | 15 | protected SimpleParent(List childItemList) { 16 | mChildList = childItemList; 17 | } 18 | 19 | @Override 20 | public boolean isInitiallyExpanded() { 21 | return false; 22 | } 23 | 24 | @Override 25 | public List getChildList() { 26 | return mChildList; 27 | } 28 | 29 | public void setChildList(List childList) { 30 | mChildList = childList; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /library/src/main/res/layout/progress_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /library/src/main/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | loading\u2026 4 | -------------------------------------------------------------------------------- /library/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 加载中\u2026 3 | 4 | -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/screenshots/demo.gif -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':library' 2 | --------------------------------------------------------------------------------
, C> extends PowerViewHolder { 17 | 18 | P mParent; 19 | ExpandableAdapter mExpandableAdapter; 20 | 21 | public ParentExpandViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 22 | super(parent, layoutResId); 23 | } 24 | 25 | public ParentExpandViewHolder(View itemView) { 26 | super(itemView); 27 | } 28 | 29 | public P getParent() { 30 | return mParent; 31 | } 32 | 33 | public int getParentAdapterPosition() { 34 | int flatPosition = getAdapterPosition(); 35 | if (flatPosition == RecyclerView.NO_POSITION) { 36 | return flatPosition; 37 | } 38 | 39 | return mExpandableAdapter.getNearestParentPosition(flatPosition); 40 | } 41 | 42 | public void onExpansionToggled(boolean expanded) { 43 | 44 | } 45 | 46 | public boolean shouldItemViewClickToggleExpansion() { 47 | return true; 48 | } 49 | 50 | protected void expandView() { 51 | onExpansionToggled(false); 52 | } 53 | 54 | protected void collapseView() { 55 | onExpansionToggled(true); 56 | } 57 | 58 | interface ParentViewHolderExpandCollapseListener { 59 | 60 | void onParentExpanded(int flatParentPosition); 61 | 62 | void onParentCollapsed(int flatParentPosition); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/PowerViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.annotation.LayoutRes; 4 | import android.support.annotation.NonNull; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | 10 | /** 11 | * ViewHolder 基类 12 | * Created by lin18 on 2017/4/8. 13 | */ 14 | public class PowerViewHolder extends RecyclerView.ViewHolder { 15 | 16 | View contentView; 17 | 18 | public PowerViewHolder(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 19 | this(inflate(parent, layoutResId)); 20 | } 21 | 22 | public PowerViewHolder(View itemView) { 23 | super(itemView); 24 | } 25 | 26 | public void setContentView(View contentView) { 27 | this.contentView = contentView; 28 | } 29 | 30 | public final View getContentView() { 31 | return contentView != null ? contentView : itemView; 32 | } 33 | 34 | public static View inflate(@NonNull ViewGroup parent, @LayoutRes int layoutResId) { 35 | return LayoutInflater.from(parent.getContext()).inflate(layoutResId, parent, false); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/SimpleItemTouchHelperCallback.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.graphics.Canvas; 4 | import android.support.v7.widget.GridLayoutManager; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.support.v7.widget.helper.ItemTouchHelper; 7 | 8 | public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { 9 | 10 | public static final float ALPHA_FULL = 1.0f; 11 | 12 | private boolean longPressDragEnabled = false, swipeEnabled = false; 13 | 14 | private final ItemTouchHelperAdapter mAdapter; 15 | 16 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { 17 | this(adapter, false); 18 | } 19 | 20 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean longPressDragEnabled) { 21 | this(adapter, longPressDragEnabled, false); 22 | } 23 | 24 | public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean longPressDragEnabled, boolean swipeEnabled) { 25 | mAdapter = adapter; 26 | this.longPressDragEnabled = longPressDragEnabled; 27 | this.swipeEnabled = swipeEnabled; 28 | } 29 | 30 | public void setLongPressDragEnabled(boolean isLongPressDragEnabled) { 31 | this.longPressDragEnabled = isLongPressDragEnabled; 32 | } 33 | 34 | @Override 35 | public boolean isLongPressDragEnabled() { 36 | return longPressDragEnabled; 37 | } 38 | 39 | public void setSwipeEnabled(boolean isSwipeEnabled) { 40 | this.swipeEnabled = isSwipeEnabled; 41 | } 42 | 43 | @Override 44 | public boolean isItemViewSwipeEnabled() { 45 | return swipeEnabled; 46 | } 47 | 48 | @Override 49 | public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 50 | // Set movement flags based on the layout manager 51 | if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { 52 | final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; 53 | final int swipeFlags = 0; 54 | return makeMovementFlags(dragFlags, swipeFlags); 55 | } else { 56 | final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; 57 | final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; 58 | return makeMovementFlags(dragFlags, swipeFlags); 59 | } 60 | } 61 | 62 | @Override 63 | public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { 64 | if (source.getItemViewType() != target.getItemViewType()) { 65 | return false; 66 | } 67 | 68 | // Notify the adapter of the move 69 | mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); 70 | return true; 71 | } 72 | 73 | @Override 74 | public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) { 75 | // Notify the adapter of the dismissal 76 | mAdapter.onItemDismiss(viewHolder.getAdapterPosition()); 77 | } 78 | 79 | @Override 80 | public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { 81 | if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 82 | // Fade out the view as it is swiped out of the parent's bounds 83 | final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); 84 | viewHolder.itemView.setAlpha(alpha); 85 | viewHolder.itemView.setTranslationX(dX); 86 | } else { 87 | super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 88 | } 89 | } 90 | 91 | @Override 92 | public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 93 | // We only want the active item to change 94 | if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 95 | if (viewHolder instanceof ItemTouchHelperViewHolder) { 96 | // Let the view holder know that this item is being moved or dragged 97 | ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 98 | itemViewHolder.onItemSelected(); 99 | } 100 | } 101 | 102 | super.onSelectedChanged(viewHolder, actionState); 103 | } 104 | 105 | @Override 106 | public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 107 | super.clearView(recyclerView, viewHolder); 108 | 109 | viewHolder.itemView.setAlpha(ALPHA_FULL); 110 | 111 | if (viewHolder instanceof ItemTouchHelperViewHolder) { 112 | // Tell the view holder it's time to restore the idle state 113 | ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; 114 | itemViewHolder.onItemClear(); 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/SpaceItemDecoration.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 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.annotation.DrawableRes; 9 | import android.support.annotation.IntRange; 10 | import android.support.annotation.NonNull; 11 | import android.support.v4.content.ContextCompat; 12 | import android.support.v4.view.ViewCompat; 13 | import android.support.v7.widget.LinearLayoutManager; 14 | import android.support.v7.widget.OrientationHelper; 15 | import android.support.v7.widget.RecyclerView; 16 | import android.support.v7.widget.StaggeredGridLayoutManager; 17 | import android.view.View; 18 | 19 | public class SpaceItemDecoration extends RecyclerView.ItemDecoration { 20 | 21 | private Drawable mDivider; 22 | private int mSectionOffsetV; 23 | private int mSectionOffsetH; 24 | private boolean mDrawOver = true, withOffset = false; 25 | 26 | private static final int[] ATTRS = new int[]{ 27 | android.R.attr.listDivider 28 | }; 29 | 30 | public SpaceItemDecoration(Context context) { 31 | final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); 32 | mDivider = styledAttributes.getDrawable(0); 33 | styledAttributes.recycle(); 34 | } 35 | 36 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId) { 37 | this(context, resId, 0); 38 | } 39 | 40 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, 41 | @IntRange(from = 0) int sectionOffset) { 42 | this(context, resId, sectionOffset, 0); 43 | } 44 | 45 | public SpaceItemDecoration(@NonNull Context context, @DrawableRes int resId, 46 | @IntRange(from = 0) int sectionOffsetV, @IntRange(from = 0) int sectionOffsetH) { 47 | if (resId > 0) mDivider = ContextCompat.getDrawable(context, resId); 48 | mSectionOffsetV = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetV); 49 | mSectionOffsetH = (int) (context.getResources().getDisplayMetrics().density * sectionOffsetH); 50 | } 51 | 52 | public SpaceItemDecoration withDrawOver(boolean drawOver) { 53 | this.mDrawOver = drawOver; 54 | return this; 55 | } 56 | 57 | @Override 58 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 59 | if (mDivider != null && !mDrawOver) { 60 | draw(c, parent); 61 | } 62 | } 63 | 64 | @Override 65 | public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 66 | if (mDivider != null && mDrawOver) { 67 | draw(c, parent); 68 | } 69 | } 70 | 71 | private void draw(Canvas c, RecyclerView parent) { 72 | int left = parent.getPaddingLeft(); 73 | int right = parent.getWidth() - parent.getPaddingRight(); 74 | 75 | int childCount = parent.getChildCount(); 76 | for (int i = 0; i < childCount; i++) { 77 | View child = parent.getChildAt(i); 78 | 79 | RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 80 | 81 | int top = child.getBottom() + params.bottomMargin + 82 | Math.round(ViewCompat.getTranslationY(child)); 83 | int bottom = top + (mDivider.getIntrinsicHeight() <= 0 ? 1 : mDivider.getIntrinsicHeight()); 84 | 85 | mDivider.setBounds(left, top, right, bottom); 86 | mDivider.draw(c); 87 | } 88 | } 89 | 90 | public SpaceItemDecoration withOffset(boolean withOffset) { 91 | this.withOffset = withOffset; 92 | return this; 93 | } 94 | 95 | /** 96 | * 97 | */ 98 | @SuppressWarnings({"ConstantConditions", "unchecked", "SuspiciousNameCombination"}) 99 | @Override 100 | public void getItemOffsets(Rect outRect, View view, RecyclerView recyclerView, RecyclerView.State state) { 101 | if (getOrientation(recyclerView.getLayoutManager()) == RecyclerView.VERTICAL) { 102 | outRect.set(mSectionOffsetH, 0, mSectionOffsetH, mSectionOffsetV); 103 | } else { 104 | outRect.set(0, 0, mSectionOffsetV, 0); 105 | } 106 | } 107 | 108 | public static int getOrientation(RecyclerView.LayoutManager layoutManager) { 109 | if (layoutManager instanceof LinearLayoutManager) { 110 | return ((LinearLayoutManager) layoutManager).getOrientation(); 111 | } else if (layoutManager instanceof StaggeredGridLayoutManager) { 112 | return ((StaggeredGridLayoutManager) layoutManager).getOrientation(); 113 | } 114 | return OrientationHelper.HORIZONTAL; 115 | } 116 | 117 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/ViewHelper.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter; 2 | 3 | import android.support.v4.view.ViewCompat; 4 | import android.view.View; 5 | 6 | /** 7 | * Copyright (C) 2017 Wasabeef 8 | * 9 | * Licensed under the Apache License, Version 2.0 (the "License"); 10 | * you may not use this file except in compliance with the License. 11 | * You may obtain a copy of the License at 12 | * 13 | * http://www.apache.org/licenses/LICENSE-2.0 14 | * 15 | * Unless required by applicable law or agreed to in writing, software 16 | * distributed under the License is distributed on an "AS IS" BASIS, 17 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 | * See the License for the specific language governing permissions and 19 | * limitations under the License. 20 | */ 21 | 22 | public final class ViewHelper { 23 | 24 | public static void clear(View v) { 25 | ViewCompat.setAlpha(v, 1); 26 | ViewCompat.setScaleY(v, 1); 27 | ViewCompat.setScaleX(v, 1); 28 | ViewCompat.setTranslationY(v, 0); 29 | ViewCompat.setTranslationX(v, 0); 30 | ViewCompat.setRotation(v, 0); 31 | ViewCompat.setRotationY(v, 0); 32 | ViewCompat.setRotationX(v, 0); 33 | ViewCompat.setPivotY(v, v.getMeasuredHeight() / 2); 34 | ViewCompat.setPivotX(v, v.getMeasuredWidth() / 2); 35 | ViewCompat.animate(v).setInterpolator(null).setStartDelay(0); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/IMulti.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | /** 4 | * Created by owp on 2017/4/25. 5 | */ 6 | 7 | public interface IMulti { 8 | } 9 | -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/Parent.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Interface for implementing required methods in a parent. 7 | */ 8 | public interface Parent { 9 | 10 | /** 11 | * Getter for the list of this parent's child items. 12 | * 13 | * If list is empty, the parent has no children. 14 | * 15 | * @return A {@link List} of the children of this {@link Parent} 16 | */ 17 | List getChildList(); 18 | 19 | /** 20 | * Getter used to determine if this {@link Parent}'s 21 | * {@link android.view.View} should show up initially as expanded. 22 | * 23 | * @return true if expanded, false if not 24 | */ 25 | boolean isInitiallyExpanded(); 26 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/SimpleParent.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Simple implementation of the ParentListItem interface, 7 | * by default all items are not initially expanded. 8 | * 9 | * @param Type of the Child Items held by the Parent. 10 | */ 11 | public class SimpleParent implements Parent { 12 | 13 | private List mChildList; 14 | 15 | protected SimpleParent(List childItemList) { 16 | mChildList = childItemList; 17 | } 18 | 19 | @Override 20 | public boolean isInitiallyExpanded() { 21 | return false; 22 | } 23 | 24 | @Override 25 | public List getChildList() { 26 | return mChildList; 27 | } 28 | 29 | public void setChildList(List childList) { 30 | mChildList = childList; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /library/src/main/res/layout/progress_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /library/src/main/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | loading\u2026 4 | -------------------------------------------------------------------------------- /library/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 加载中\u2026 3 | 4 | -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/screenshots/demo.gif -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':library' 2 | --------------------------------------------------------------------------------
13 | * If list is empty, the parent has no children. 14 | * 15 | * @return A {@link List} of the children of this {@link Parent} 16 | */ 17 | List getChildList(); 18 | 19 | /** 20 | * Getter used to determine if this {@link Parent}'s 21 | * {@link android.view.View} should show up initially as expanded. 22 | * 23 | * @return true if expanded, false if not 24 | */ 25 | boolean isInitiallyExpanded(); 26 | } -------------------------------------------------------------------------------- /library/src/main/java/com/lin/poweradapter/model/SimpleParent.java: -------------------------------------------------------------------------------- 1 | package com.lin.poweradapter.model; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Simple implementation of the ParentListItem interface, 7 | * by default all items are not initially expanded. 8 | * 9 | * @param Type of the Child Items held by the Parent. 10 | */ 11 | public class SimpleParent implements Parent { 12 | 13 | private List mChildList; 14 | 15 | protected SimpleParent(List childItemList) { 16 | mChildList = childItemList; 17 | } 18 | 19 | @Override 20 | public boolean isInitiallyExpanded() { 21 | return false; 22 | } 23 | 24 | @Override 25 | public List getChildList() { 26 | return mChildList; 27 | } 28 | 29 | public void setChildList(List childList) { 30 | mChildList = childList; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /library/src/main/res/layout/progress_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /library/src/main/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | loading\u2026 4 | -------------------------------------------------------------------------------- /library/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 加载中\u2026 3 | 4 | -------------------------------------------------------------------------------- /screenshots/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lin18/PowerAdapter/a39df5ed4c4664277037e9c120049bb78eacb71e/screenshots/demo.gif -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':library' 2 | --------------------------------------------------------------------------------