├── .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 |