diff --git a/.circleci/config.yml b/.circleci/config.yml index c5dd12d..e440d26 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,7 +15,8 @@ jobs: # - image: circleci/postgres:9.4 working_directory: ~/repo - + docker: + - image: circleci/android:api-27-alpha environment: # Customize the JVM maximum heap limit JVM_OPTS: -Xmx3200m @@ -31,15 +32,16 @@ jobs: # fallback to using the latest cache if no exact match is found - v1-dependencies- - - run: gradle dependencies + - run: + name: Download Dependencies + command: ./gradlew androidDependencies - save_cache: paths: - ~/.gradle key: v1-dependencies-{{ checksum "build.gradle" }} - # run tests! - - run: gradle test + diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..1b9da92 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '43 13 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'java' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index fdf2708..5564f60 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/README.md b/README.md index af66172..717e415 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ # EasyAdapter Based on [**Android Data Binding**](https://developer.android.com/topic/libraries/data-binding/index.html) + +![](images/easyadapter-01.png) + ### Create your recyclerview adapter in just 3 lines. > RecyclerView is mostly used android widgets in the Android Project, for that you have to implement an Adapter which provides the items for the view. In most cases it require the same base logic, but require you to write everything again and again.so here is sollution for it. [![N|Solid](https://img.shields.io/badge/Android%20Arsenal-EasyAdapter-brightgreen.svg)](https://android-arsenal.com/details/1/6950) [![Download](https://api.bintray.com/packages/mkrupal09/EasyAdapter/EasyAdapter/images/download.svg) ](https://bintray.com/mkrupal09/EasyAdapter/EasyAdapter/_latestVersion) +[![Circle +CI](https://circleci.com/gh/mkrupal09/EasyAdapter.svg?style=svg)](https://circleci.com/gh/mkrupal09/EasyAdapter) - Reduce Boilerplate code to create adapter and holder. - you can filter adapter without coding much. @@ -18,44 +23,33 @@ Download -------- -Grab via Maven: -```xml - - com.dc.easyadapter - easyadapter - 2.0.3 - pom - +app > build.gradle +```groovy +implementation 'com.github.mkrupal09:EasyAdapter:v2.0.5' ``` -or Gradle: + +root > build.gradle, add jitpack.io maven url in allprojects>repositories ```groovy -implementation 'com.dc.easyadapter:easyadapter:2.0.3' +allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } + } ``` To enable data binding ------------------------- -inside app build.gradle +inside app build.gradle add buildFeatures block(if not) and add dataBinding flag as mentioned below ```groovy android { - dataBinding { - enabled = true + buildFeatures { + dataBinding true } } ``` -For Kotlin also add - ```groovy - dependencies{ - kapt 'com.android.databinding:compiler:3.1.2' -} - -apply plugin: 'kotlin-kapt' //Top at build.gradle -``` - - - - ## How? ``` java adapter = new EasyAdapter(R.layout.inflater_category) { @@ -64,6 +58,7 @@ adapter = new EasyAdapter(R.layout.inflater_c binding.tvName.setText(model.name); } } + ``` ## Usage @@ -79,6 +74,17 @@ class CategoryAdapter() :EasyAdapter(R.layout } } ``` +###java +``` java + public CategoryAdapter() { + super(R.layout.inflater_category); + } + + @Override + public void onBind(@NonNull InflaterCategoryBinding binding, @NonNull Category model) { + binding.tvName.setText(model.name); + } +``` #### 1) To Handle recycler View item Events @@ -288,6 +294,10 @@ without this person cannot achieve swipe action in recyclerview https://android.jlelse.eu/android-tools-attributes-listitem-sample-data-rocks-bbf49aaa9f07
for sharing knowledge of Android Tools attributes +* Buy me a Beer. :beer: + + + License ======= diff --git a/app/build.gradle b/app/build.gradle index daf0107..16d41da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,11 +3,11 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { applicationId "easyadapter.dc.com.easyadapter" minSdkVersion 16 - targetSdkVersion 27 + targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -25,6 +25,10 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }*/ + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { @@ -37,11 +41,17 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" kapt 'com.android.databinding:compiler:3.1.2' implementation 'com.android.support:recyclerview-v7:27.1.1' - + implementation 'com.github.warkiz.widget:indicatorseekbar:2.1.0' implementation project(':library') + + implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'com.github.bumptech.glide:glide:4.8.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' /*implementation "com.github.mkrupal09:EasyAdapter:9be4f31"*/ /*implementation 'com.dc.easyadapter:easyadapter:1.2'*/ - debugImplementation 'com.amitshekhar.android:debug-db:1.0.4' + + implementation 'com.devbrackets.android:exomedia:4.3.0' + } repositories { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 08aa01f..4558652 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ package="easyadapter.dc.com.easyadapter"> + + - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/Category.kt b/app/src/main/java/easyadapter/dc/com/easyadapter/Category.kt index 1301de1..6ed8f86 100644 --- a/app/src/main/java/easyadapter/dc/com/easyadapter/Category.kt +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/Category.kt @@ -15,6 +15,7 @@ public class Category : Serializable { var parentId: String = "" var image: String = "" var isSelected: Boolean = false + companion object { val BUN_SEL_CATEGORY_LIST = "SEL_CATEGORY_LIST" const val SEND_OBJECT = "category" diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapter.kt b/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapter.kt index e219a4f..3b296b4 100644 --- a/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapter.kt +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapter.kt @@ -1,5 +1,7 @@ package easyadapter.dc.com.easyadapter +import android.widget.ImageView +import com.bumptech.glide.Glide import easyadapter.dc.com.easyadapter.databinding.InflaterCategoryBinding import easyadapter.dc.com.library.EasyAdapter @@ -22,9 +24,26 @@ class CategoryAdapter(val enableSwipToDelete: Boolean) : } override fun onBind(binding: InflaterCategoryBinding, model: Category) { + } + + override fun onBind(binding: InflaterCategoryBinding, model: Category, holder: EasyHolder?) { + super.onBind(binding, model, holder) binding.apply { tvName.text = model.name tvName.isSelected = model.isSelected } + binding.ivCategoryIcon.setImageResource(R.drawable.abc_ic_ab_back_material) + + + if (data.indexOf(model) % 2 == 0) { + binding.ivCategoryIcon.layoutParams.height = 100 + binding.ivCategoryIcon.scaleType = ImageView.ScaleType.FIT_CENTER + } else { + binding.ivCategoryIcon.layoutParams.height = 500 + binding.ivCategoryIcon.scaleType = ImageView.ScaleType.CENTER_CROP + } + + Glide.with(binding.ivCategoryIcon).load("https://www.healthywage.com/wp-content/uploads/2015/11/Kristin-W-BeforeAfter2-540x345.jpg").into(binding.ivCategoryIcon); + helper.startSwipe(holder) } } \ No newline at end of file diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapterJava.java b/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapterJava.java new file mode 100644 index 0000000..3ff335c --- /dev/null +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/CategoryAdapterJava.java @@ -0,0 +1,20 @@ +package easyadapter.dc.com.easyadapter; + +import android.support.annotation.NonNull; + +import easyadapter.dc.com.easyadapter.databinding.InflaterCategoryBinding; +import easyadapter.dc.com.library.EasyAdapter; + +/** + * Created by HB on 1/10/18. + */ +public class CategoryAdapterJava extends EasyAdapter { + public CategoryAdapterJava() { + super(R.layout.inflater_category); + } + + @Override + public void onBind(@NonNull InflaterCategoryBinding binding, @NonNull Category model) { + binding.tvName.setText(model.getName()); + } +} diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivity.kt b/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivity.kt index e1d2b43..0668f6a 100644 --- a/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivity.kt +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivity.kt @@ -1,18 +1,26 @@ package easyadapter.dc.com.easyadapter +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.databinding.DataBindingUtil import android.os.Bundle import android.support.v4.content.ContextCompat +import android.support.v4.content.LocalBroadcastManager import android.support.v7.app.AppCompatActivity import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.SearchView +import android.util.Log import android.view.View +import android.webkit.WebView +import android.webkit.WebViewClient import android.widget.Toast import easyadapter.dc.com.easyadapter.databinding.ActivityMainBinding import easyadapter.dc.com.easyadapter.databinding.InflaterCategoryNameBinding import easyadapter.dc.com.library.EasyAdapter -import easyadapter.dc.com.library.EasySpinner import easyadapter.dc.com.library.EasyArrayAdapter +import easyadapter.dc.com.library.EasySpinner class MainActivity : AppCompatActivity() { @@ -37,6 +45,32 @@ class MainActivity : AppCompatActivity() { temp.add(Category.createDummy("Darshak jani")) temp.add(Category.createDummy("Sanket Chauhan")) temp.add(Category.createDummy("Dhruv")) + temp.add(Category.createDummy("Krupal Mehta")) + temp.add(Category.createDummy("Aagam Mehta")) + temp.add(Category.createDummy("Anand Patel")) + temp.add(Category.createDummy("Sagar Panchal")) + temp.add(Category.createDummy("Pankaj Sharma")) + temp.add(Category.createDummy("Darshak jani")) + temp.add(Category.createDummy("Sanket Chauhan")) + temp.add(Category.createDummy("Dhruv")) + temp.add(Category.createDummy("Sagar Panchal")) + temp.add(Category.createDummy("Pankaj Sharma")) + temp.add(Category.createDummy("Darshak jani")) + temp.add(Category.createDummy("Sanket Chauhan")) + temp.add(Category.createDummy("Dhruv")) + temp.add(Category.createDummy("Krupal Mehta")) + temp.add(Category.createDummy("Aagam Mehta")) + temp.add(Category.createDummy("Anand Patel")) + temp.add(Category.createDummy("Sagar Panchal")) + temp.add(Category.createDummy("Pankaj Sharma")) + temp.add(Category.createDummy("Darshak jani")) + temp.add(Category.createDummy("Sanket Chauhan")) + temp.add(Category.createDummy("Dhruv")) + temp.add(Category.createDummy("Sagar Panchal")) + temp.add(Category.createDummy("Pankaj Sharma")) + temp.add(Category.createDummy("Darshak jani")) + temp.add(Category.createDummy("Sanket Chauhan")) + temp.add(Category.createDummy("Dhruv")) return temp } @@ -56,12 +90,15 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + Log.d("MainActivityLog", "true"); binding = DataBindingUtil.setContentView(this, R.layout.activity_main) binding.recyclerView.isNestedScrollingEnabled = false adapterExample() spinnerExample() autocomplete() + test() + } private fun autocomplete() { @@ -72,7 +109,7 @@ class MainActivity : AppCompatActivity() { } override fun onFilterApply(filter: Any?, model: Category): Boolean { - return if(filter!=null) model.parentId.equals("1") else false + return if (filter != null) model.parentId.equals("1") else false } }) { override fun onBind(binding: InflaterCategoryNameBinding, model: Category) { @@ -180,5 +217,18 @@ class MainActivity : AppCompatActivity() { spinnerAdapter.notifyDataSetChanged() } } + + private fun test() { + val intentFilter = IntentFilter() + intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED) + intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL) + intentFilter.addDataScheme("package") + LocalBroadcastManager.getInstance(this).registerReceiver(object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + Log.d("App Installed", "true") + } + }, intentFilter) + + } } diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivityJava.java b/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivityJava.java new file mode 100644 index 0000000..4ee1643 --- /dev/null +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/MainActivityJava.java @@ -0,0 +1,23 @@ +package easyadapter.dc.com.easyadapter; + +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.RecyclerView; + +import easyadapter.dc.com.library.EasyAdapter; + +/** + * Created by HB on 15/10/18. + */ +public class MainActivityJava extends AppCompatActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } +} diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/TestActivity.java b/app/src/main/java/easyadapter/dc/com/easyadapter/TestActivity.java new file mode 100644 index 0000000..cdc2f60 --- /dev/null +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/TestActivity.java @@ -0,0 +1,21 @@ +package easyadapter.dc.com.easyadapter; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +/** + * Created by HB on 28/9/18. + */ +public class TestActivity extends AppCompatActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_test); + RecyclerView recyclerView = findViewById(R.id.recyclerView); + CategoryAdapter categoryAdapter = new CategoryAdapter(false); + recyclerView.setAdapter(categoryAdapter); + } +} diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/TransBean.java b/app/src/main/java/easyadapter/dc/com/easyadapter/TransBean.java new file mode 100644 index 0000000..b94218b --- /dev/null +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/TransBean.java @@ -0,0 +1,33 @@ +package easyadapter.dc.com.easyadapter; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by HB on 3/1/19. + */ +public class TransBean implements Parcelable { + protected TransBean(Parcel in) { + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public TransBean createFromParcel(Parcel in) { + return new TransBean(in); + } + + @Override + public TransBean[] newArray(int size) { + return new TransBean[size]; + } + }; +} diff --git a/app/src/main/java/easyadapter/dc/com/easyadapter/VideoActivity.java b/app/src/main/java/easyadapter/dc/com/easyadapter/VideoActivity.java new file mode 100644 index 0000000..0e40f55 --- /dev/null +++ b/app/src/main/java/easyadapter/dc/com/easyadapter/VideoActivity.java @@ -0,0 +1,68 @@ +package easyadapter.dc.com.easyadapter; + +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.NavUtils; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.view.WindowInsets; +import android.view.WindowManager; + +import com.devbrackets.android.exomedia.core.video.scale.ScaleType; +import com.devbrackets.android.exomedia.listener.OnPreparedListener; +import com.devbrackets.android.exomedia.ui.widget.VideoView; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.source.ClippingMediaSource; +import com.google.android.exoplayer2.source.ExtractorMediaSource; +import com.google.android.exoplayer2.source.MediaPeriod; +import com.google.android.exoplayer2.source.MediaSource; + +/** + * Created by HB on 7/12/18. + */ +public class VideoActivity extends AppCompatActivity implements OnPreparedListener { + + VideoView videoView; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); // or add true in the theme + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + + setContentView(R.layout.activity_video); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + WindowManager.LayoutParams attrib = getWindow().getAttributes(); + attrib.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + } + + videoView = (VideoView) findViewById(R.id.video_view); + videoView.setOnPreparedListener(this); + + + + videoView.setScaleType(ScaleType.CENTER_CROP); + + //For now we just picked an arbitrary item to play + videoView.setVideoURI(Uri.parse("http://pcock.com/public/upload/twilio_media/VIDEO_20181205_140947-20181205084109450389.mp4")); + } + + @Override + public void onPrepared() { + videoView.start(); + } + + @Override + public void onBackPressed() { + NavUtils.navigateUpFromSameTask(this); + } +} diff --git a/app/src/main/res/drawable/gradient_drawable.xml b/app/src/main/res/drawable/gradient_drawable.xml new file mode 100644 index 0000000..2a5007a --- /dev/null +++ b/app/src/main/res/drawable/gradient_drawable.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5dbe5ec..414699f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,15 +13,6 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - - + android:textColorHint="@android:color/black" + android:visibility="gone" /> + android:hint="Search Category" + android:paddingLeft="5dp" /> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml new file mode 100644 index 0000000..e70c3bb --- /dev/null +++ b/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video.xml b/app/src/main/res/layout/activity_video.xml new file mode 100644 index 0000000..ee54065 --- /dev/null +++ b/app/src/main/res/layout/activity_video.xml @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/inflater_category.xml b/app/src/main/res/layout/inflater_category.xml index da7c483..9076053 100644 --- a/app/src/main/res/layout/inflater_category.xml +++ b/app/src/main/res/layout/inflater_category.xml @@ -32,7 +32,7 @@ @@ -48,6 +48,8 @@ diff --git a/images/easyadapter-01.png b/images/easyadapter-01.png new file mode 100644 index 0000000..e0fb602 Binary files /dev/null and b/images/easyadapter-01.png differ diff --git a/library/build.gradle b/library/build.gradle index 50db24d..9148097 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,14 +3,14 @@ apply plugin: 'com.android.library' ext { PUBLISH_GROUP_ID = 'com.dc.easyadapter' PUBLISH_ARTIFACT_ID = 'easyadapter' - PUBLISH_VERSION = '2.0.3' + PUBLISH_VERSION = '2.0.5' } android { compileSdkVersion 27 defaultConfig { - minSdkVersion 16 + minSdkVersion 15 targetSdkVersion 27 versionCode 1 versionName "1.0" diff --git a/library/src/main/java/easyadapter/dc/com/library/EasyAdapter.java b/library/src/main/java/easyadapter/dc/com/library/EasyAdapter.java index 53077cd..431d1c6 100644 --- a/library/src/main/java/easyadapter/dc/com/library/EasyAdapter.java +++ b/library/src/main/java/easyadapter/dc/com/library/EasyAdapter.java @@ -27,473 +27,527 @@ public abstract class EasyAdapter extends RecyclerView.Adapter { - private final int VIEW_ITEM = 1; - private final int VIEW_PROGRESS = 0; - private boolean loading = false; - private boolean isLoadMoreEnabled = false; - private int loadMoreRes = R.layout.layout_load_more; - private final ArrayList data; - private final ArrayList temp; - private int layout; - private OnRecyclerViewItemClick recyclerViewItemClick; - private OnRecyclerViewItemCheckChange recyclerViewItemCheckChange; - private ArrayList> onDataUpdateArrayList; + private final int VIEW_ITEM = 1; + private final int VIEW_PROGRESS = 0; + private boolean loading = false; + private boolean isLoadMoreEnabled = false; + private int loadMoreRes = R.layout.layout_load_more; + private final ArrayList data; + private final ArrayList temp; + private int layout; + private OnRecyclerViewItemClick recyclerViewItemClick; + private OnRecyclerViewItemCheckChange recyclerViewItemCheckChange; + private ArrayList> onDataUpdateArrayList; - public interface OnRecyclerViewItemClick { - void onRecyclerViewItemClick(View view, M model); - } + public interface OnRecyclerViewItemClick { + void onRecyclerViewItemClick(View view, M model); + } + + public interface OnRecyclerViewItemCheckChange { + void onRecyclerViewItemCheckChange(View view, boolean isCheck, M model); + } + + public interface OnHolderItemClick { + void onHolderItemClick(View view, int position); + } + + public interface OnHolderItemCheckChange { + void onHolderItemCheckChange(View view, boolean isCheck, int position); + } + + public interface OnFilter { + boolean onFilterApply(@Nullable Object filter, @NonNull M model); - public interface OnRecyclerViewItemCheckChange { - void onRecyclerViewItemCheckChange(View view, boolean isCheck, M model); - } + void onFilterResult(ArrayList filteredList); + } + + public interface OnLoadMoreListener { + boolean onLoadMore(); + } - public interface OnHolderItemClick { - void onHolderItemClick(View view, int position); - } + public interface OnDataUpdate { + public void onDataUpdate(ArrayList data); + } - public interface OnHolderItemCheckChange { - void onHolderItemCheckChange(View view, boolean isCheck, int position); - } - public interface OnFilter { - boolean onFilterApply(@Nullable Object filter, @NonNull M model); + public EasyAdapter(@LayoutRes int layout) { + data = new ArrayList<>(); + temp = new ArrayList<>(); + temp.addAll(data); + enableDataObserver(); + this.layout = layout; + onDataUpdateArrayList = new ArrayList<>(); + } + + public void onCreatingHolder(@NonNull B binding, @NonNull EasyHolder holder) { + + } + + public abstract void onBind(@NonNull B binding, @NonNull M model); + + public void onBind(@NonNull B binding, @NonNull M model, EasyHolder holder) { + } + + public void onBind(@NonNull B binding, @NonNull M model, @NonNull List payloads) { + } + + + public final ArrayList getData() { + return data; + } + + public final ArrayList getTemp() { + return temp; + } + + public void clear(boolean deepClean) { + data.clear(); + if (deepClean) { + temp.clear(); + } + } + + + private void clearFilter() { + data.clear(); + data.addAll(temp); + } + + public void add(M model) { + data.add(model); + temp.add(model); + notifyDataSetChanged(); + } + + public int addOnly(M model) { + data.add(model); + temp.add(model); + return data.size() - 1; + /*notifyDataSetChanged();*/ + } + + + @Deprecated + public void remove(M model) { + data.remove(model); + temp.remove(model); + notifyDataSetChanged(); + } - void onFilterResult(ArrayList filteredList); - } + public void removeOnly(M model) { + data.remove(model); + temp.remove(model); + } - public interface OnLoadMoreListener { - boolean onLoadMore(); - } + public void removeOnly(int pos) { + M model = data.get(pos); + data.remove(model); + temp.remove(model); + } - public interface OnDataUpdate { - public void onDataUpdate(ArrayList data); + public void addAll(List addAll, boolean deepCopy) { + data.addAll(addAll); + if (deepCopy) { + temp.addAll(addAll); } + /*notifyDataSetChanged();*/ + } + public EasyAdapter setRecyclerViewItemClick(OnRecyclerViewItemClick recyclerViewItemClick) { + this.recyclerViewItemClick = recyclerViewItemClick; + return this; + } - public EasyAdapter(@LayoutRes int layout) { - data = new ArrayList<>(); - temp = new ArrayList<>(); - temp.addAll(data); - enableDataObserver(); - this.layout = layout; - onDataUpdateArrayList = new ArrayList<>(); - } - - public void onCreatingHolder(@NonNull B binding, @NonNull EasyHolder holder) { + public EasyAdapter setRecyclerViewItemCheckChange(OnRecyclerViewItemCheckChange recyclerViewItemCheckChange) { + this.recyclerViewItemCheckChange = recyclerViewItemCheckChange; + return this; + } - } - public abstract void onBind(@NonNull B binding, @NonNull M model); + public void onItemClick(View view, M model) { + if (recyclerViewItemClick != null) + recyclerViewItemClick.onRecyclerViewItemClick(view, model); + } - public void onBind(@NonNull B binding, @NonNull M model, @NonNull List payloads) { - } + public void onItemCheckChange(View view, boolean isCheck, M model) { + if (recyclerViewItemCheckChange != null) + recyclerViewItemCheckChange.onRecyclerViewItemCheckChange(view, isCheck, model); + } - public final ArrayList getData() { - return data; + public void performFilter(Object text, OnFilter onFilter) { + ArrayList result = new ArrayList<>(); + if (text.toString().length() <= 0) { + result.addAll(temp); + } else { + result.clear(); + for (M d : temp) { + if (d instanceof OnFilter) { + onFilter = (OnFilter) d; + } + if (onFilter != null) { + if (onFilter.onFilterApply(text, d)) { + result.add(d); + } + } + } } - - public final ArrayList getTemp() { - return temp; + if (onFilter != null) { + onFilter.onFilterResult(result); } + } - public void clear(boolean deepClean) { - data.clear(); - if (deepClean) { - temp.clear(); + + @Override + public final EasyHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == VIEW_ITEM) { + EasyHolder easyHolder = new EasyHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), + layout, parent, false)); + onCreatingHolder((B) easyHolder.binding, easyHolder); + easyHolder.setHolderItemClick(new OnHolderItemClick() { + @Override + public void onHolderItemClick(View view, int position) { + if (position != -1) + onItemClick(view, data.get(position)); } - } + }); + easyHolder.setHolderItemCheckChange(new OnHolderItemCheckChange() { + @Override + public void onHolderItemCheckChange(View view, boolean isCheck, int position) { + if (position != -1) { + onItemCheckChange(view, isCheck, data.get(position)); + } + } + }); + return easyHolder; + } else { + View view; + if (loadMoreRes == -1) { + view = getProgressView(parent.getContext()); + } else { + view = LayoutInflater.from(parent.getContext()).inflate(loadMoreRes, parent, false); + } + return new ProgressViewHolder(view); + } + } + + @Override + public final void onBindViewHolder(@NonNull EasyHolder holder, int position) { + if (!holder.isLoadingView) { + onBind((B) holder.binding, data.get(position)); + onBind((B) holder.binding, data.get(position), holder); + } + } + + @Override + public final void onBindViewHolder(@NonNull EasyHolder holder, int position, @NonNull List payloads) { + super.onBindViewHolder(holder, position, payloads); + if (!holder.isLoadingView) { + onBind((B) holder.binding, data.get(position), payloads); + } + } + + @Override + public int getItemCount() { + if (data == null) return 0; + if (isLoadMoreEnabled && loading) + return data.size() + 1; + return data.size(); + } + + @Override + public int getItemViewType(int position) { + if (isLoadMoreEnabled && loading) { + if (position == getItemCount() - 1) { + return VIEW_PROGRESS; + } else return VIEW_ITEM; + } + return VIEW_ITEM; + } + + private View getProgressView(Context context) { + View view = new FrameLayout(context); + view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + ProgressBar progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.CENTER_HORIZONTAL; + progressBar.setLayoutParams(lp); + ((ViewGroup) view).addView(progressBar); + return view; + } + + + public void setLoadMoreComplete() { + loading = false; + notifyDataSetChanged(); + } + + public void setLoadMoreRes(int loadMoreRes) { + this.loadMoreRes = loadMoreRes; + } + + public EasyAdapter setOnLoadMoreListener(RecyclerView recyclerView, final OnLoadMoreListener onLoadMoreListener) { + if (recyclerView != null && onLoadMoreListener != null) { + + final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + + if (layoutManager instanceof GridLayoutManager) { + ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + if (getItemViewType(position) == VIEW_PROGRESS) + return ((GridLayoutManager) layoutManager).getSpanCount(); + return 1; + } + }); + } + + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + int totalItemCount = layoutManager.getItemCount(); + int lastVisibleItem = 0; + + if (layoutManager instanceof StaggeredGridLayoutManager) { + int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null); + lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions); + } else if (layoutManager instanceof GridLayoutManager) { + lastVisibleItem = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); + } else if (layoutManager instanceof LinearLayoutManager) { + lastVisibleItem = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); + } + if (!loading && totalItemCount <= (lastVisibleItem + 2)) { + new android.os.Handler().post(new Runnable() { + @Override + public void run() { + boolean previous = loading; + loading = onLoadMoreListener.onLoadMore(); + if (loading != previous) { + if (!previous) { + notifyItemInserted(getItemCount() - 1); + } else if (previous == true && loading == false) { + notifyItemRemoved(getItemCount() - 1); + } + } + } + }); + } + } + }); - public void remove(M model) { - data.remove(model); - temp.remove(model); - notifyDataSetChanged(); + isLoadMoreEnabled = true; } + return this; + } - private void clearFilter() { - data.clear(); - data.addAll(temp); + private int getLastVisibleItem(int[] lastVisibleItemPositions) { + int maxSize = 0; + for (int i = 0; i < lastVisibleItemPositions.length; i++) { + if (i == 0) { + maxSize = lastVisibleItemPositions[i]; + } else if (lastVisibleItemPositions[i] > maxSize) { + maxSize = lastVisibleItemPositions[i]; + } } + return maxSize; + } - public void add(M model) { - data.add(model); - temp.add(model); - notifyDataSetChanged(); - } - public void addAll(List addAll, boolean deepCopy) { - data.addAll(addAll); - if (deepCopy) { - temp.addAll(addAll); - } - notifyDataSetChanged(); + public static class EasyHolder extends RecyclerView.ViewHolder implements SwipeOpenViewHolder { + + private ViewDataBinding binding; + boolean isLoadingView; + private OnHolderItemClick holderItemClick; + private OnHolderItemCheckChange holderItemCheckChange; + public View swipeView; + public int startViewSize = 0, endViewSize = 0; + + public Object object; + + public void setTag(Object object) { + this.object = object; } - public EasyAdapter setRecyclerViewItemClick(OnRecyclerViewItemClick recyclerViewItemClick) { - this.recyclerViewItemClick = recyclerViewItemClick; - return this; + public Object getTag() { + return object; } - public EasyAdapter setRecyclerViewItemCheckChange(OnRecyclerViewItemCheckChange recyclerViewItemCheckChange) { - this.recyclerViewItemCheckChange = recyclerViewItemCheckChange; - return this; + public EasyHolder(ViewDataBinding itemView) { + super(itemView.getRoot()); + binding = itemView; + } + public EasyHolder(View view) { + super(view); + } - public void onItemClick(View view, M model) { - if (recyclerViewItemClick != null) - recyclerViewItemClick.onRecyclerViewItemClick(view, model); + void setHolderItemClick(OnHolderItemClick holderItemClick) { + this.holderItemClick = holderItemClick; } - public void onItemCheckChange(View view, boolean isCheck, M model) { - if (recyclerViewItemCheckChange != null) - recyclerViewItemCheckChange.onRecyclerViewItemCheckChange(view, isCheck, model); + public void setHolderItemCheckChange(OnHolderItemCheckChange holderItemCheckChange) { + this.holderItemCheckChange = holderItemCheckChange; } + private View.OnClickListener mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + holderItemClick.onHolderItemClick(view, getAdapterPosition()); + } + }; - public void performFilter(Object text, OnFilter onFilter) { - ArrayList result = new ArrayList<>(); - if (text.toString().length() <= 0) { - result.addAll(temp); - } else { - result.clear(); - for (M d : temp) { - if (d instanceof OnFilter) { - onFilter = (OnFilter) d; - } - if (onFilter != null) { - if (onFilter.onFilterApply(text, d)) { - result.add(d); - } - } - } - } - if (onFilter != null) { - onFilter.onFilterResult(result); - } + public View.OnClickListener getClickListener() { + return mOnClickListener; } + public CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + holderItemCheckChange.onHolderItemCheckChange(compoundButton, b, getAdapterPosition()); + } + }; + public CompoundButton.OnCheckedChangeListener getCheckedChangeListener() { + return checkedChangeListener; + } - @Override - public final EasyHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == VIEW_ITEM) { - EasyHolder easyHolder = new EasyHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), - layout, parent, false)); - onCreatingHolder((B) easyHolder.binding, easyHolder); - easyHolder.setHolderItemClick(new OnHolderItemClick() { - @Override - public void onHolderItemClick(View view, int position) { - if (position != -1) - onItemClick(view, data.get(position)); - } - }); - easyHolder.setHolderItemCheckChange(new OnHolderItemCheckChange() { - @Override - public void onHolderItemCheckChange(View view, boolean isCheck, int position) { - if (position != -1) { - onItemCheckChange(view, isCheck, data.get(position)); - } - } - }); - return easyHolder; - } else { - View view; - if (loadMoreRes == -1) { - view = getProgressView(parent.getContext()); - } else { - view = LayoutInflater.from(parent.getContext()).inflate(loadMoreRes, parent, false); - } - return new ProgressViewHolder(view); - } + public void setEnableSwipeToDelete(View swipeView, int startViewSize, int endViewSize) { + this.swipeView = swipeView; + this.startViewSize = startViewSize; + this.endViewSize = endViewSize; } + @NonNull @Override - public final void onBindViewHolder(@NonNull EasyHolder holder, int position) { - if (!holder.isLoadingView) { - onBind((B) holder.binding, data.get(position)); - } + public View getSwipeView() { + return swipeView; } + @NonNull @Override - public final void onBindViewHolder(@NonNull EasyHolder holder, int position, @NonNull List payloads) { - super.onBindViewHolder(holder, position, payloads); - if (!holder.isLoadingView) { - onBind((B) holder.binding, data.get(position), payloads); - } + public RecyclerView.ViewHolder getViewHolder() { + return this; } @Override - public int getItemCount() { - if (data == null) return 0; - if (isLoadMoreEnabled && loading) - return data.size() + 1; - return data.size(); + public float getEndHiddenViewSize() { + return endViewSize; } @Override - public int getItemViewType(int position) { - if (isLoadMoreEnabled && loading) { - if (position == getItemCount() - 1) { - return VIEW_PROGRESS; - } else return VIEW_ITEM; - } - return VIEW_ITEM; - } - - private View getProgressView(Context context) { - View view = new FrameLayout(context); - view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - - ProgressBar progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall); - FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - lp.gravity = Gravity.CENTER_HORIZONTAL; - progressBar.setLayoutParams(lp); - ((ViewGroup) view).addView(progressBar); - return view; - } - - - public void setLoadMoreComplete() { - loading = false; - notifyDataSetChanged(); - } - - public void setLoadMoreRes(int loadMoreRes) { - this.loadMoreRes = loadMoreRes; - } - - public EasyAdapter setOnLoadMoreListener(RecyclerView recyclerView, final OnLoadMoreListener onLoadMoreListener) { - if (recyclerView != null && onLoadMoreListener != null) { - - final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); - - if (layoutManager instanceof GridLayoutManager) { - ((GridLayoutManager) layoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { - @Override - public int getSpanSize(int position) { - if (getItemViewType(position) == VIEW_PROGRESS) - return ((GridLayoutManager) layoutManager).getSpanCount(); - return 1; - } - }); - } - - recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - - int totalItemCount = layoutManager.getItemCount(); - int lastVisibleItem = 0; - - if (layoutManager instanceof StaggeredGridLayoutManager) { - int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null); - lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions); - } else if (layoutManager instanceof GridLayoutManager) { - lastVisibleItem = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); - } else if (layoutManager instanceof LinearLayoutManager) { - lastVisibleItem = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); - } - if (!loading && totalItemCount <= (lastVisibleItem + 2)) { - new android.os.Handler().post(new Runnable() { - @Override - public void run() { - boolean previous = loading; - loading = onLoadMoreListener.onLoadMore(); - if (loading != previous) { - if (!previous) { - notifyItemInserted(getItemCount() - 1); - } else if (previous == true && loading == false) { - notifyItemRemoved(getItemCount() - 1); - } - } - } - }); - } - } - }); - - isLoadMoreEnabled = true; - } - return this; + public float getStartHiddenViewSize() { + return startViewSize; } + @Override + public void notifyStartOpen() { - private int getLastVisibleItem(int[] lastVisibleItemPositions) { - int maxSize = 0; - for (int i = 0; i < lastVisibleItemPositions.length; i++) { - if (i == 0) { - maxSize = lastVisibleItemPositions[i]; - } else if (lastVisibleItemPositions[i] > maxSize) { - maxSize = lastVisibleItemPositions[i]; - } - } - return maxSize; } + @Override + public void notifyEndOpen() { - public static class EasyHolder extends RecyclerView.ViewHolder implements SwipeOpenViewHolder { - - private ViewDataBinding binding; - boolean isLoadingView; - private OnHolderItemClick holderItemClick; - private OnHolderItemCheckChange holderItemCheckChange; - public View swipeView; - public int startViewSize = 0, endViewSize = 0; - - public EasyHolder(ViewDataBinding itemView) { - super(itemView.getRoot()); - binding = itemView; - - } - - public EasyHolder(View view) { - super(view); - } - - void setHolderItemClick(OnHolderItemClick holderItemClick) { - this.holderItemClick = holderItemClick; - } - - public void setHolderItemCheckChange(OnHolderItemCheckChange holderItemCheckChange) { - this.holderItemCheckChange = holderItemCheckChange; - } - - private View.OnClickListener mOnClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - holderItemClick.onHolderItemClick(view, getAdapterPosition()); - } - }; + } - public View.OnClickListener getClickListener() { - return mOnClickListener; - } + public final void setOnClickListeners(View... views) { + for (View view : views) { + view.setOnClickListener(getClickListener()); + } + } - public CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - holderItemCheckChange.onHolderItemCheckChange(compoundButton, b, getAdapterPosition()); - } - }; + public final void setOnCheckChangeListeners(CompoundButton... compoundButtons) { + for (CompoundButton view : compoundButtons) { + view.setOnCheckedChangeListener(getCheckedChangeListener()); + } + } + } - public CompoundButton.OnCheckedChangeListener getCheckedChangeListener() { - return checkedChangeListener; - } + private class ProgressViewHolder extends EasyHolder { + ProgressViewHolder(View v) { + super(v); + isLoadingView = true; + swipeView = v; + startViewSize = 0; + endViewSize = 0; + setEnableSwipeToDelete(v, 0, 0); + } + } - public void setEnableSwipeToDelete(View swipeView, int startViewSize, int endViewSize) { - this.swipeView = swipeView; - this.startViewSize = startViewSize; - this.endViewSize = endViewSize; - } + public SwipeOpenItemTouchHelper helper = new SwipeOpenItemTouchHelper(new SwipeOpenItemTouchHelper.SimpleCallback( + SwipeOpenItemTouchHelper.START | SwipeOpenItemTouchHelper.END)); - @NonNull - @Override - public View getSwipeView() { - return swipeView; - } + public void enableSwipeAction(RecyclerView recyclerView) { - @NonNull - @Override - public RecyclerView.ViewHolder getViewHolder() { - return this; - } - @Override - public float getEndHiddenViewSize() { - return endViewSize; - } + helper.attachToRecyclerView(recyclerView); + } - @Override - public float getStartHiddenViewSize() { - return startViewSize; - } - @Override - public void notifyStartOpen() { + public EasyAdapter addOnDataUpdateListener(OnDataUpdate onDataUpdate) { + this.onDataUpdateArrayList.add(onDataUpdate); + return this; + } - } + private void onDataUpdate() { + for (OnDataUpdate onDataUpdate : onDataUpdateArrayList) { + onDataUpdate.onDataUpdate(getData()); + } + } - @Override - public void notifyEndOpen() { + public final void disableDataObserver() { + unregisterAdapterDataObserver(dataChangeObs); + } - } - } + public final void enableDataObserver() { + registerAdapterDataObserver(dataChangeObs); + } - private class ProgressViewHolder extends EasyHolder { - ProgressViewHolder(View v) { - super(v); - isLoadingView = true; - swipeView = v; - startViewSize = 0; - endViewSize = 0; - } + private RecyclerView.AdapterDataObserver dataChangeObs = new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + onDataUpdate(); } - public void enableSwipeAction(RecyclerView recyclerView) { - SwipeOpenItemTouchHelper helper = new SwipeOpenItemTouchHelper(new SwipeOpenItemTouchHelper.SimpleCallback( - SwipeOpenItemTouchHelper.START | SwipeOpenItemTouchHelper.END)); - helper.attachToRecyclerView(recyclerView); + @Override + public void onItemRangeChanged(int positionStart, int itemCount) { + super.onItemRangeChanged(positionStart, itemCount); + onDataUpdate(); } - - public EasyAdapter addOnDataUpdateListener(OnDataUpdate onDataUpdate) { - this.onDataUpdateArrayList.add(onDataUpdate); - return this; + @Override + public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) { + super.onItemRangeChanged(positionStart, itemCount, payload); + onDataUpdate(); } - private void onDataUpdate() { - for (OnDataUpdate onDataUpdate : onDataUpdateArrayList) { - onDataUpdate.onDataUpdate(getData()); - } + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + super.onItemRangeInserted(positionStart, itemCount); + onDataUpdate(); } - public final void disableDataObserver() { - unregisterAdapterDataObserver(dataChangeObs); + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + super.onItemRangeRemoved(positionStart, itemCount); + onDataUpdate(); } - public final void enableDataObserver() { - registerAdapterDataObserver(dataChangeObs); + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + super.onItemRangeMoved(fromPosition, toPosition, itemCount); + onDataUpdate(); } + }; - private RecyclerView.AdapterDataObserver dataChangeObs = new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - super.onChanged(); - onDataUpdate(); - } - - @Override - public void onItemRangeChanged(int positionStart, int itemCount) { - super.onItemRangeChanged(positionStart, itemCount); - onDataUpdate(); - } - - @Override - public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) { - super.onItemRangeChanged(positionStart, itemCount, payload); - onDataUpdate(); - } - - @Override - public void onItemRangeInserted(int positionStart, int itemCount) { - super.onItemRangeInserted(positionStart, itemCount); - onDataUpdate(); - } - - @Override - public void onItemRangeRemoved(int positionStart, int itemCount) { - super.onItemRangeRemoved(positionStart, itemCount); - onDataUpdate(); - } - @Override - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - super.onItemRangeMoved(fromPosition, toPosition, itemCount); - onDataUpdate(); - } - }; + public void invalidateObserver() { + onDataUpdate(); + } } \ No newline at end of file diff --git a/library/src/main/java/easyadapter/dc/com/library/InstantSpinner.java b/library/src/main/java/easyadapter/dc/com/library/InstantSpinner.java deleted file mode 100644 index 6e25a72..0000000 --- a/library/src/main/java/easyadapter/dc/com/library/InstantSpinner.java +++ /dev/null @@ -1,96 +0,0 @@ -package easyadapter.dc.com.library; - -import android.content.Context; -import android.graphics.Rect; -import android.text.method.KeyListener; -import android.util.AttributeSet; -import android.view.View; -import android.widget.AdapterView; - -/** - * Created by HB on 9/7/18. - */ -public class InstantSpinner extends android.support.v7.widget.AppCompatAutoCompleteTextView { - - private KeyListener keyListener; - private EasyAutoComplete.OnItemCallback onItemCallback; - - public InstantSpinner(Context context) { - super(context); - init(); - } - - public InstantSpinner(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public InstantSpinner(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - - } - - private void init() { - setThreshold(0); - keyListener = getKeyListener(); - makeEditable(false); - setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (getAdapter() != null) { - showDropDown(); - } - } - }); - - setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - onItemCallback.onItemCallback(position, InstantSpinner.this); - } - }); - } - - - @Override - public boolean enoughToFilter() { - return true; - } - - @Override - protected void onFocusChanged(boolean focused, int direction, - Rect previouslyFocusedRect) { - super.onFocusChanged(focused, direction, previouslyFocusedRect); - if (focused && getAdapter() != null) { - - performFiltering(getText(), 0); - post(new Runnable() { - @Override - public void run() { - showDropDown(); - } - }); - } - } - - private void makeEditable(boolean editable) { - if (editable) { - setCursorVisible(true); - setKeyListener(keyListener); - } else { - setKeyListener(null); - setCursorVisible(false); - setInputType(0); - } - } - - @Override - protected void performFiltering(CharSequence text, int keyCode) { - super.performFiltering("", keyCode); - } - - public void setItemSelectionCallback(EasyAutoComplete.OnItemCallback onItemCallback) { - this.onItemCallback = onItemCallback; - } -} diff --git a/library/src/main/java/easyadapter/dc/com/library/ObservableArrayList.java b/library/src/main/java/easyadapter/dc/com/library/ObservableArrayList.java deleted file mode 100644 index 3ff7676..0000000 --- a/library/src/main/java/easyadapter/dc/com/library/ObservableArrayList.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package easyadapter.dc.com.library; - -import android.databinding.ListChangeRegistry; -import android.databinding.ObservableList; - -import java.util.ArrayList; -import java.util.Collection; - -/** - * An {@link ObservableList} implementation using ArrayList as an implementation. - */ -public class ObservableArrayList extends ArrayList implements ObservableList { - private transient ListChangeRegistry mListeners = new ListChangeRegistry(); - - @Override - public void addOnListChangedCallback(OnListChangedCallback listener) { - if (mListeners == null) { - mListeners = new ListChangeRegistry(); - } - mListeners.add(listener); - } - - @Override - public void removeOnListChangedCallback(OnListChangedCallback listener) { - if (mListeners != null) { - mListeners.remove(listener); - } - } - - @Override - public boolean add(T object) { - super.add(object); - notifyAdd(size() - 1, 1); - return true; - } - - @Override - public void add(int index, T object) { - super.add(index, object); - notifyAdd(index, 1); - } - - @Override - public boolean addAll(Collection collection) { - int oldSize = size(); - boolean added = super.addAll(collection); - /*if (added) {*/ - notifyAdd(oldSize, size() - oldSize); - /*}*/ - return added; - } - - @Override - public boolean addAll(int index, Collection collection) { - boolean added = super.addAll(index, collection); - /*if (added) {*/ - notifyAdd(index, collection.size()); - /*}*/ - return added; - } - - @Override - public void clear() { - int oldSize = size(); - super.clear(); - /*if (oldSize != 0) {*/ - notifyRemove(0, oldSize); - /*}*/ - } - - @Override - public T remove(int index) { - T val = super.remove(index); - notifyRemove(index, 1); - return val; - } - - @Override - public boolean remove(Object object) { - int index = indexOf(object); - if (index >= 0) { - remove(index); - return true; - } else { - return false; - } - } - - @Override - public T set(int index, T object) { - T val = super.set(index, object); - if (mListeners != null) { - mListeners.notifyChanged(this, index, 1); - } - return val; - } - - @Override - protected void removeRange(int fromIndex, int toIndex) { - super.removeRange(fromIndex, toIndex); - notifyRemove(fromIndex, toIndex - fromIndex); - } - - private void notifyAdd(int start, int count) { - if (mListeners != null) { - mListeners.notifyInserted(this, start, count); - } - } - - private void notifyRemove(int start, int count) { - if (mListeners != null) { - mListeners.notifyRemoved(this, start, count); - } - } -}