├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── administrator │ │ └── recyclerviewtest │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── hz │ │ │ └── android │ │ │ └── easyadapter │ │ │ └── demo │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ └── item_show_text.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 │ │ ├── arrays.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── administrator │ └── recyclerviewtest │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── bintrayUpload.gradle ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── hz │ │ └── android │ │ └── easyadapter │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── hz │ │ │ └── android │ │ │ └── easyadapter │ │ │ └── EasyAdapter.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── hz │ └── android │ └── easyadapter │ └── ExampleUnitTest.java └── 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 | # Gradle 11 | .gradle 12 | build 13 | local.properties 14 | bintray.properties 15 | reports 16 | 17 | # Maven 18 | target 19 | pom.xml.* 20 | release.properties 21 | gen-external-apklibs 22 | 23 | # Eclipse 24 | .classpath 25 | .project 26 | .settings 27 | eclipsebin 28 | 29 | # IntelliJ IDEA 30 | .idea 31 | *.iml 32 | *.ipl 33 | *.iws 34 | classes/ 35 | idea-classes/ 36 | coverage-error.log 37 | 38 | # Android 39 | gen 40 | bin 41 | project.properties 42 | out 43 | 44 | # Finder 45 | .DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EasyAdapterForRecyclerView 2 | 3 | ##### 介绍 4 | EasyAdapter是用于RecyclerView的适配器,在原有的适配器基础上可支持监听相应的事件并设置点击模式、单选和多选模式。在多选模式下,可设置最大可选数量,以及提供了全选、反选等接口。 5 | ##### 使用 6 | Gradle 7 | ``` 8 | compile 'com.hz.androids.easyadapter:library:1.1' 9 | ``` 10 | or Maven 11 | ``` 12 | 13 | com.hz.androids.easyadapter 14 | library 15 | 1.1 16 | pom 17 | 18 | ``` 19 | 1.自定义Adapter继承EasyAdapter 20 | 21 | ```java 22 | private class MyAdapter extends EasyAdapter { 23 | @Override 24 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 25 | ... 26 | } 27 | 28 | /* 29 | whenBindViewHolder方法:相当于原生Adapter.onBindViewHolder 30 | */ 31 | @Override 32 | public void whenBindViewHolder(MyViewHolder holder, int position) { 33 | ... 34 | } 35 | 36 | @Override 37 | public int getItemCount() { 38 | return list.size(); 39 | } 40 | } 41 | ``` 42 | 2.RecycleView设置自定义的适配器 43 | 44 | ```java 45 | MyAdapter myAdapter = new MyAdapter(); 46 | recyclerView.setAdapter(myAdapter); 47 | ``` 48 | 3.可切换点击、单选、多选模式 49 | 50 | ```java 51 | //点击模式 52 | myAdapter.setSelectMode(EasyAdapter.SelectMode.CLICK); 53 | //单选模式 54 | myAdapter.setSelectMode(EasyAdapter.SelectMode.SINGLE_SELECT); 55 | //多选模式 56 | myAdapter.setSelectMode(EasyAdapter.SelectMode.MULTI_SELECT); 57 | ``` 58 | 59 | 4.在自定义适配器中设置相应模式的监听器 60 | 61 | ```java 62 | // 监听点击事件 63 | myAdapter.setOnItemClickListener(new EasyAdapter.OnItemClickListener() { 64 | @Override 65 | public void onSelected(int clickPosition) { 66 | ... 67 | } 68 | }); 69 | //监听单选事件 70 | myAdapter.setOnItemSelectListener(new EasyAdapter.OnItemSelectListener() { 71 | @Override 72 | public void onSelected(int selectedPosition) { 73 | ... 74 | } 75 | }); 76 | //监听多选事件 77 | myAdapter.setOnItemMultiSelectListener(new EasyAdapter.OnItemMultiSelectListener() { 78 | @Override 79 | public void onMultiSelected(int multiSelectedPosition) { 80 | ... 81 | }); 82 | ``` 83 | 84 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "26.0.1" 6 | defaultConfig { 7 | applicationId "com.example.administrator.recyclerviewtest" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | lintOptions { 21 | abortOnError false 22 | } 23 | } 24 | 25 | dependencies { 26 | compile fileTree(include: ['*.jar'], dir: 'libs') 27 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 28 | exclude group: 'com.android.support', module: 'support-annotations' 29 | }) 30 | compile 'com.android.support:appcompat-v7:25.3.1' 31 | compile 'com.android.support.constraint:constraint-layout:1.0.2' 32 | testCompile 'junit:junit:4.12' 33 | compile 'com.android.support:recyclerview-v7:21.0.+' 34 | compile 'com.forward.androids:androids:1.1.7.1' 35 | compile project(':library') 36 | } 37 | -------------------------------------------------------------------------------- /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 E:\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/example/administrator/recyclerviewtest/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.administrator.recyclerviewtest; 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.example.administrator.recyclerviewtest", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/hz/android/easyadapter/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.hz.android.easyadapter.demo; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.support.v7.widget.RecyclerView.ViewHolder; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.AdapterView; 11 | import android.widget.Spinner; 12 | import android.widget.TextView; 13 | import android.widget.Toast; 14 | 15 | import com.hz.android.easyadapter.EasyAdapter; 16 | 17 | import java.util.ArrayList; 18 | import java.util.Arrays; 19 | import java.util.List; 20 | 21 | import cn.forward.androids.views.ScrollPickerView; 22 | import cn.forward.androids.views.StringScrollPicker; 23 | 24 | public class MainActivity extends AppCompatActivity { 25 | private RecyclerView recyclerView; 26 | private List list = new ArrayList<>(); 27 | private MyAdapter myAdapter; 28 | 29 | @Override 30 | protected void onCreate(Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_main); 33 | recyclerView = (RecyclerView) findViewById(R.id.test_recyclerView); 34 | final View container_multiOptions = findViewById(R.id.container_multSelectMode_options); 35 | final View container_singleOption = findViewById(R.id.container_SingleSelectMode_option); 36 | StringScrollPicker stringScrollPicker = (StringScrollPicker) findViewById(R.id.max_select_count_pv); 37 | 38 | stringScrollPicker.setData(new ArrayList(Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))); 39 | stringScrollPicker.setOnSelectedListener(new ScrollPickerView.OnSelectedListener() { 40 | @Override 41 | public void onSelected(ScrollPickerView scrollPickerView, int position) { 42 | Toast.makeText(MainActivity.this, "stringScrollPicker:" + position, Toast.LENGTH_SHORT).show(); 43 | myAdapter.setMaxSelectedCount(position); 44 | 45 | } 46 | }); 47 | stringScrollPicker.setSelectedPosition(0); 48 | myAdapter = new MyAdapter(); 49 | list.addAll(Arrays.asList("李子", "樱桃", "葡萄", "菠萝", "椰子", "草莓", "苹果", "西瓜", "香蕉", "柚子", "柠檬", "桔子", "芒果", "枣子", "猕猴桃", "水蜜桃", "荔枝", "杨梅")); 50 | 51 | Spinner select_mode_spinner = (Spinner) findViewById(R.id.spinner_mode_selected); 52 | select_mode_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 53 | @Override 54 | public void onItemSelected(AdapterView parent, View view, int position, long id) { 55 | Toast.makeText(MainActivity.this, "mode position: " + position, Toast.LENGTH_SHORT).show(); 56 | if (position == 0) { 57 | myAdapter.setSelectMode(EasyAdapter.SelectMode.CLICK); 58 | container_singleOption.setVisibility(View.GONE); 59 | container_multiOptions.setVisibility(View.GONE); 60 | } else if (position == 1) { 61 | myAdapter.setSelectMode(EasyAdapter.SelectMode.SINGLE_SELECT); 62 | container_singleOption.setVisibility(View.VISIBLE); 63 | container_multiOptions.setVisibility(View.GONE); 64 | } else if (position == 2) { 65 | myAdapter.setSelectMode(EasyAdapter.SelectMode.MULTI_SELECT); 66 | container_singleOption.setVisibility(View.GONE); 67 | container_multiOptions.setVisibility(View.VISIBLE); 68 | } 69 | } 70 | 71 | @Override 72 | public void onNothingSelected(AdapterView parent) { 73 | 74 | } 75 | }); 76 | 77 | //监听单选 78 | myAdapter.setOnItemSingleSelectListener(new EasyAdapter.OnItemSingleSelectListener() { 79 | 80 | @Override 81 | public void onSelected(int itemPosition, boolean isSelected) { 82 | Toast.makeText(MainActivity.this, "selectedPosition:" + itemPosition +" == "+ myAdapter.getSingleSelectedPosition(), Toast.LENGTH_SHORT).show(); 83 | 84 | } 85 | }); 86 | 87 | /*// 监听点击事件 88 | myAdapter.setOnItemClickListener(new EasyAdapter.OnItemClickListener() { 89 | @Override 90 | public void onSelected(int clickPosition) { 91 | Toast.makeText(MainActivity.this, "clickPosition:" + clickPosition, Toast.LENGTH_SHORT).show(); 92 | } 93 | }); 94 | //监听单选 95 | myAdapter.setOnItemSingleSelectListener(new EasyAdapter.OnItemSingleSelectListener() { 96 | @Override 97 | public void onSelected(int selectedPosition) { 98 | Toast.makeText(MainActivity.this, "selectedPosition:" + selectedPosition, Toast.LENGTH_SHORT).show(); 99 | 100 | } 101 | }); 102 | //监听多选 103 | myAdapter.setOnItemMultiSelectListener(new EasyAdapter.OnItemMultiSelectListener() { 104 | @Override 105 | public void onSelected(int multiSelectedPosition) { 106 | Toast.makeText(MainActivity.this, "multiSelectedPosition:" + multiSelectedPosition, Toast.LENGTH_SHORT).show(); 107 | } 108 | }); 109 | */ 110 | //select_mode_spinner.setSelection(0); //点击 111 | //select_mode_spinner.setSelection(1); //单选 此时RecyclerView+Adapter就是一个单选框 112 | select_mode_spinner.setSelection(2); //多选 113 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext()); 114 | linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //把列表设置成水平滚动 115 | recyclerView.setLayoutManager(linearLayoutManager); 116 | 117 | recyclerView.setAdapter(myAdapter); 118 | 119 | // myAdapter.setSelected(1, 3, 5); // 多选模式下 和单选模式 都一样可以调用 120 | 121 | } 122 | 123 | //监听按钮 124 | public void btnShowSingleSelected(View view) { 125 | int singleSelectedPosition = myAdapter.getSingleSelectedPosition(); 126 | Toast.makeText(MainActivity.this, "btnShowSingleSelected:" + singleSelectedPosition, Toast.LENGTH_SHORT).show(); 127 | 128 | } 129 | 130 | public void btnSelectedAll(View view) { 131 | myAdapter.selectAll(); 132 | } 133 | 134 | public void btnReverseSelected(View view) { 135 | myAdapter.reverseSelected(); 136 | } 137 | 138 | public void btnShowMultiSelected(View view) { 139 | List selectedList = myAdapter.getMultiSelectedPosition(); 140 | Toast.makeText(MainActivity.this, "btnShowMultiSelected:" + selectedList.toString(), Toast.LENGTH_SHORT).show(); 141 | } 142 | 143 | public void btnClearSelected(View view) { 144 | myAdapter.clearSelected(); 145 | } 146 | 147 | // 继承EasyAdapter 148 | private class MyAdapter extends EasyAdapter { 149 | @Override 150 | public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 151 | View view = View.inflate(getApplicationContext(), R.layout.item_show_text, null); 152 | return new MyViewHolder(view); 153 | } 154 | 155 | @Override 156 | public void whenBindViewHolder(MyViewHolder holder, int position) { 157 | holder.textView.setTag(position);//绑定 158 | holder.textView.setText(list.get(position)); 159 | } 160 | 161 | @Override 162 | public int getItemCount() { 163 | return list.size(); 164 | } 165 | } 166 | 167 | private static class MyViewHolder extends ViewHolder { 168 | private TextView textView; 169 | 170 | public MyViewHolder(View itemView) { 171 | super(itemView); 172 | textView = (TextView) itemView.findViewById(R.id.txt_item); 173 | } 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | 15 | 16 | 17 | 22 | 23 | 24 | 25 | 31 | 32 |