diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index 30aa626..0000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 96cc43e..fb7f4a8 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,22 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 3b65dc8..1d50764 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,21 +1,22 @@
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 2edf4f5..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 7f68460..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index d62475f..3cf7eed 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ allprojects {
**Step 2.** Add the dependency
```
dependencies {
- implementation 'com.github.Omega-R:OmegaRecyclerView:1.9.3@aar' // AndroidX
+ implementation 'com.github.Omega-R.OmegaRecyclerView:omegarecyclerview:1.10.1@aar' // AndroidX
// or
// implementation 'com.github.Omega-R:OmegaRecyclerView:1.8.2@aar' // Android Support
}
@@ -33,7 +33,7 @@ dependencies {
# Usage
Example of usage in xml layout
```
-com.omega_r.libs.omegarecyclerview.OmegaRecyclerView
+ {
+public class ExpandableAdapter extends OmegaExpandableRecyclerView.Adapter {
@Override
protected ExGroupViewHolder provideGroupViewHolder(@NonNull ViewGroup viewGroup) {
@@ -353,8 +353,8 @@ public class ExpandableAdapter extends OmegaExpandableRecyclerView.Adapter> expandableViewData)
-void setItems(ExpandableViewData... expandableViewData)
-void setItems(GroupProvider... groupProviders)
+public final void setItems(@NonNull List> expandableViewData)
+public final void setItems(ExpandableViewData... expandableViewData)
+public final void setItemsAsGroupProviders(GroupProvider... groupProviders)
+public final void setItemsAsGroupProviders(@NonNull List> groupProviders)
```
Your view data (group and childs) should be wrapped with ```ExpandableViewData``` using one of the following ways:
@@ -387,6 +388,12 @@ public interface GroupProvider {
}
```
+It is available to update only child item using
+```
+// Adapter
+public void notifyChildChanged(CH child)
+```
+
You can set expandMode and childAnimation both with xml attr and programmatically
*Available expandModes are single and multiple*
diff --git a/app/build.gradle b/app/build.gradle
index 26db849..ca06a39 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,15 +1,15 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 28
+ compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion
defaultConfig {
applicationId "com.omega_r.omegarecyclerview"
- minSdkVersion 16
- targetSdkVersion 28
+ minSdkVersion rootProject.minSdkVersion
+ targetSdkVersion rootProject.targetSdkVersion
versionCode 1
versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
@@ -17,21 +17,22 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
- buildToolsVersion rootProject.buildToolsVersion
}
dependencies {
- implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'com.android.support:appcompat-v7:' + rootProject.supportLibVersion
- implementation 'com.android.support:support-v4:' + rootProject.supportLibVersion
- implementation 'com.android.support:design:' + rootProject.supportLibVersion
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.appcompat:appcompat:' + rootProject.appcompatVersion
+ implementation 'com.google.android.material:material:' + rootProject.materialVersion
implementation 'com.github.Omega-R.OmegaIntentBuilder:core:' + rootProject.omegaIntentBuilder
implementation 'com.github.Omega-R.OmegaIntentBuilder:annotations:' + rootProject.omegaIntentBuilder
annotationProcessor 'com.github.Omega-R.OmegaIntentBuilder:processor:' + rootProject.omegaIntentBuilder
- api project(':omegarecyclerviewlibs')
+ implementation project(':omegarecyclerview')
+ implementation project(':omegarecyclerview_fastscroll')
+ implementation project(':omegarecyclerview_expandable')
androidTestImplementation('com.android.support.test.espresso:espresso-core:' + rootProject.espressoVersion, {
exclude group: 'com.android.support', module: 'support-annotations'
diff --git a/app/src/androidTest/java/com/omega_r/omegarecyclerview/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/omega_r/omegarecyclerview/ExampleInstrumentedTest.java
index a601bb1..b83aea2 100644
--- a/app/src/androidTest/java/com/omega_r/omegarecyclerview/ExampleInstrumentedTest.java
+++ b/app/src/androidTest/java/com/omega_r/omegarecyclerview/ExampleInstrumentedTest.java
@@ -1,8 +1,8 @@
package com.omega_r.omegarecyclerview;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 065a6d1..9d9d278 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,7 +5,7 @@
@@ -25,7 +25,7 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapter.java
index 98c89ac..53aa337 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapter.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapter.java
@@ -3,6 +3,7 @@
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import com.omega_r.libs.omegarecyclerview.BaseListAdapter;
import com.omega_r.omegarecyclerview.R;
@@ -13,8 +14,9 @@ public ListAdapter(BaseListAdapter.OnItemClickListener clickListener,
super(clickListener, longClickListener);
}
+ @NonNull
@Override
- protected ViewHolder provideViewHolder(ViewGroup parent) {
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new SampleViewHolder(parent);
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapterActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapterActivity.java
index 07e5260..11edb88 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapterActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/ListAdapterExample/ListAdapterActivity.java
@@ -1,15 +1,14 @@
package com.omega_r.omegarecyclerview.ListAdapterExample;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import android.widget.Toast;
import com.omega_r.libs.omegarecyclerview.BaseListAdapter;
import com.omega_r.omegarecyclerview.R;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import omega.com.annotations.OmegaActivity;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/MainActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/MainActivity.java
index ab5bd0d..2de84f0 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/MainActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/MainActivity.java
@@ -1,10 +1,12 @@
package com.omega_r.omegarecyclerview;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import com.omega_r.libs.omegaintentbuilder.AppOmegaIntentBuilder;
+import com.omega_r.libs.omegaintentbuilder.OmegaIntentBuilder;
+import com.omega_r.omegarecyclerview.fastscroll_example.FastScrollActivity;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@@ -20,6 +22,7 @@ protected void onCreate(Bundle savedInstanceState) {
findViewById(R.id.button_viewpager).setOnClickListener(this);
findViewById(R.id.button_list_adapter).setOnClickListener(this);
findViewById(R.id.button_expandable_recyclerview).setOnClickListener(this);
+ findViewById(R.id.button_fastscroll).setOnClickListener(this);
}
/**
@@ -34,49 +37,47 @@ public void onClick(View view) {
AppOmegaIntentBuilder.from(this)
.appActivities()
.swipeMenuActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_sticky_header:
AppOmegaIntentBuilder.from(this)
.appActivities()
.stickyHeaderActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_pagination:
AppOmegaIntentBuilder.from(this)
.appActivities()
.paginationActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_sections:
AppOmegaIntentBuilder.from(this)
.appActivities()
.sectionsActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_viewpager:
AppOmegaIntentBuilder.from(this)
.appActivities()
.viewPagerActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_list_adapter:
AppOmegaIntentBuilder.from(this)
.appActivities()
.listAdapterActivity()
- .createIntentHandler()
.startActivity();
break;
case R.id.button_expandable_recyclerview:
AppOmegaIntentBuilder.from(this)
.appActivities()
.chooseExpandableActivity()
- .createIntentHandler()
+ .startActivity();
+ break;
+ case R.id.button_fastscroll:
+ OmegaIntentBuilder.from(this)
+ .activity(FastScrollActivity.class)
.startActivity();
break;
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/ChooseExpandableActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/ChooseExpandableActivity.java
index 5304da4..26ef51e 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/ChooseExpandableActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/ChooseExpandableActivity.java
@@ -1,7 +1,7 @@
package com.omega_r.omegarecyclerview.expandable_example;
import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import com.omega_r.libs.omegaintentbuilder.AppOmegaIntentBuilder;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableActivity.java
index 45ff0ea..baf519b 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableActivity.java
@@ -1,17 +1,24 @@
package com.omega_r.omegarecyclerview.expandable_example.core;
import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.view.View;
+import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.RadioButton;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.ExpandableItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations.DropDownItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations.FadeItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.ExpandableItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations.DropDownItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations.FadeItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.data.GroupProvider;
import com.omega_r.omegarecyclerview.R;
+import java.util.Arrays;
+import java.util.List;
+
import omega.com.annotations.OmegaActivity;
@OmegaActivity
@@ -27,6 +34,8 @@ protected OmegaExpandableRecyclerView.Adapter provideAdapter() {
return new ExpandableAdapter();
}
+ private List extends GroupProvider> items;
+
@LayoutRes
protected int provideContentLayoutRes() {
return R.layout.activity_expandable;
@@ -37,9 +46,46 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(provideContentLayoutRes());
+ createItems();
+
setupRecyclerView();
setupRadioButtons();
fillAdapter();
+
+ findViewById(R.id.button_test_update_child).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Quote quote = items.get(3).provideChilds().get(1);
+ quote.setQuote("UPDATED QUOTE");
+ mAdapter.notifyChildChanged(quote);
+ }
+ });
+ }
+
+ private void createItems() {
+ items = Arrays.asList(
+ SimpleData.from(
+ new QuoteGlobalInfo(getString(R.string.group_text_1), 1500),
+ new Quote(getString(R.string.child_text_1))
+ ),
+ SimpleData.from(
+ new QuoteGlobalInfo(getString(R.string.group_text_2), 1500),
+ new Quote(getString(R.string.child_text_2))
+ ),
+ SimpleData.from(
+ new QuoteGlobalInfo(getString(R.string.group_text_3), 1914),
+ new Quote(getString(R.string.child_text_3)),
+ new Quote(getString(R.string.child_text_5))
+ ),
+ SimpleData.from(
+ new QuoteGlobalInfo(getString(R.string.group_text_5), 1914),
+ new Quote(getString(R.string.child_text_1)),
+ new Quote(getString(R.string.child_text_2)),
+ new Quote(getString(R.string.child_text_3)),
+ new Quote(getString(R.string.child_text_4)),
+ new Quote(getString(R.string.child_text_5))
+ )
+ );
}
protected void setupRecyclerView() {
@@ -48,19 +94,7 @@ protected void setupRecyclerView() {
}
protected void fillAdapter() {
- mAdapter.setItems(
- SimpleData.from(new QuoteGlobalInfo(getString(R.string.group_text_1), 1500), getString(R.string.child_text_1)),
- SimpleData.from(new QuoteGlobalInfo(getString(R.string.group_text_2), 1500), getString(R.string.child_text_2)),
- SimpleData.from(new QuoteGlobalInfo(getString(R.string.group_text_3), 1914),
- getString(R.string.child_text_3),
- getString(R.string.child_text_5)),
- SimpleData.from(new QuoteGlobalInfo(getString(R.string.group_text_5), 1914),
- getString(R.string.child_text_1),
- getString(R.string.child_text_2),
- getString(R.string.child_text_3),
- getString(R.string.child_text_4),
- getString(R.string.child_text_5))
- );
+ mAdapter.setItemsAsGroupProviders(items);
}
protected void setupRadioButtons() {
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableAdapter.java
index e81afe8..4989389 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableAdapter.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/ExpandableAdapter.java
@@ -1,16 +1,13 @@
package com.omega_r.omegarecyclerview.expandable_example.core;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.view.ViewGroup;
import android.widget.TextView;
-import android.widget.Toast;
-import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
import com.omega_r.omegarecyclerview.R;
-public class ExpandableAdapter extends OmegaExpandableRecyclerView.Adapter {
+public class ExpandableAdapter extends OmegaExpandableRecyclerView.Adapter {
@Override
protected ExGroupViewHolder provideGroupViewHolder(@NonNull ViewGroup viewGroup) {
@@ -57,8 +54,8 @@ class ExChildViewHolder extends ChildViewHolder {
}
@Override
- protected void onBind(String item) {
- textView.setText(item);
+ protected void onBind(Quote item) {
+ textView.setText(item.getQuote());
}
}
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/Quote.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/Quote.java
new file mode 100644
index 0000000..c9b1456
--- /dev/null
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/Quote.java
@@ -0,0 +1,30 @@
+package com.omega_r.omegarecyclerview.expandable_example.core;
+
+public class Quote {
+ private String mQuote;
+
+ public Quote(String quote) {
+ mQuote = quote;
+ }
+
+ public String getQuote() {
+ return mQuote;
+ }
+
+ public void setQuote(String quote) {
+ mQuote = quote;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Quote quote = (Quote) o;
+ return mQuote.equals(quote.mQuote);
+ }
+
+ @Override
+ public int hashCode() {
+ return mQuote.hashCode();
+ }
+}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/SimpleData.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/SimpleData.java
index 927d3d1..4b86d33 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/SimpleData.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/core/SimpleData.java
@@ -1,22 +1,23 @@
package com.omega_r.omegarecyclerview.expandable_example.core;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.GroupProvider;
+
+import com.omega_r.libs.omegarecyclerview_expandable.data.GroupProvider;
import java.util.Arrays;
import java.util.List;
-public class SimpleData implements GroupProvider {
+public class SimpleData implements GroupProvider {
private QuoteGlobalInfo mQuoteGlobalInfo;
- private List mQuotes;
+ private List mQuotes;
- public static SimpleData from(QuoteGlobalInfo title, String... quotes) {
+ public static SimpleData from(QuoteGlobalInfo title, Quote... quotes) {
return new SimpleData(title, Arrays.asList(quotes));
}
- public SimpleData(QuoteGlobalInfo quoteGlobalInfo, List quotes) {
+ public SimpleData(QuoteGlobalInfo quoteGlobalInfo, List quotes) {
mQuoteGlobalInfo = quoteGlobalInfo;
mQuotes = quotes;
}
@@ -29,11 +30,11 @@ public void setQuoteGlobalInfo(QuoteGlobalInfo quoteGlobalInfo) {
mQuoteGlobalInfo = quoteGlobalInfo;
}
- public List getQuotes() {
+ public List getQuotes() {
return mQuotes;
}
- public void setQuotes(List quotes) {
+ public void setQuotes(List quotes) {
mQuotes = quotes;
}
@@ -43,7 +44,7 @@ public QuoteGlobalInfo provideGroup() {
}
@Override
- public List provideChilds() {
+ public List provideChilds() {
return mQuotes;
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyAdapter.java
index defc207..57d27c8 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyAdapter.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyAdapter.java
@@ -1,18 +1,20 @@
package com.omega_r.omegarecyclerview.expandable_example.support_sticky;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.BaseStickyHeaderDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.HeaderStickyDecoration;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.data.ExpandableViewData;
import com.omega_r.omegarecyclerview.R;
+import com.omega_r.omegarecyclerview.expandable_example.core.Quote;
import com.omega_r.omegarecyclerview.expandable_example.core.QuoteGlobalInfo;
-public class DefaultStickyAdapter extends OmegaExpandableRecyclerView.Adapter implements StickyHeaderAdapter {
+public class DefaultStickyAdapter extends OmegaExpandableRecyclerView.Adapter implements StickyAdapter {
@Override
protected ExGroupViewHolder provideGroupViewHolder(@NonNull ViewGroup viewGroup) {
@@ -25,21 +27,28 @@ protected ExChildViewHolder provideChildViewHolder(@NonNull ViewGroup viewGroup)
}
@Override
- public long getHeaderId(int position) {
- Integer providedId = getItem(position).getStickyId();
- return providedId == null ? BaseStickyHeaderDecoration.NO_HEADER_ID : providedId;
+ public long getStickyId(int position) {
+ ExpandableViewData item = getItem(position);
+ if (item == null) return HeaderStickyDecoration.NO_STICKY_ID;
+ Integer providedId = item.getStickyId();
+ return providedId == null ? HeaderStickyDecoration.NO_STICKY_ID : providedId;
}
@Override
- public StickyViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
+ public StickyViewHolder onCreateStickyViewHolder(ViewGroup parent) {
return new StickyViewHolder(parent);
}
@Override
- public void onBindHeaderViewHolder(StickyViewHolder viewHolder, int position) {
+ public void onBindStickyViewHolder(StickyViewHolder viewHolder, int position) {
viewHolder.bind(getItem(position).getGroup().getYear());
}
+ @Override
+ public void onClickStickyViewHolder(long id) {
+ // nothing
+ }
+
class ExGroupViewHolder extends GroupViewHolder {
private TextView textView;
@@ -75,8 +84,8 @@ class ExChildViewHolder extends ChildViewHolder {
}
@Override
- protected void onBind(String item) {
- textView.setText(item);
+ protected void onBind(Quote item) {
+ textView.setText(item.getQuote());
}
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyExpandableActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyExpandableActivity.java
index 6b0f672..5a203db 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyExpandableActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/expandable_example/support_sticky/DefaultStickyExpandableActivity.java
@@ -1,6 +1,6 @@
package com.omega_r.omegarecyclerview.expandable_example.support_sticky;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
import com.omega_r.omegarecyclerview.expandable_example.core.ExpandableActivity;
import omega.com.annotations.OmegaActivity;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollActivity.java
new file mode 100644
index 0000000..af94b8c
--- /dev/null
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollActivity.java
@@ -0,0 +1,21 @@
+package com.omega_r.omegarecyclerview.fastscroll_example;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.omegarecyclerview.R;
+
+public class FastScrollActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_fastscroll);
+ RecyclerView recyclerView = findViewById(R.id.recyclerview);
+ recyclerView.setAdapter(new FastScrollAdapter());
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollAdapter.java
new file mode 100644
index 0000000..83d62d1
--- /dev/null
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/fastscroll_example/FastScrollAdapter.java
@@ -0,0 +1,51 @@
+package com.omega_r.omegarecyclerview.fastscroll_example;
+
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
+import com.omega_r.omegarecyclerview.R;
+
+public class FastScrollAdapter extends OmegaRecyclerView.Adapter implements
+ com.omega_r.libs.omegarecyclerview_fastscroll.FastScrollAdapter.Text {
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new ViewHolder(parent);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ holder.textView.setText(String.valueOf(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return 50;
+ }
+
+ @Override
+ public String getText(int position) {
+ return String.valueOf(position);
+ }
+
+ @Override
+ public long getFastScrollGroupId(int position) {
+ return position;
+ }
+
+ class ViewHolder extends OmegaRecyclerView.ViewHolder {
+
+ final TextView textView;
+
+ ViewHolder(ViewGroup parent) {
+ super(parent, R.layout.item_text);
+ textView = findViewById(R.id.text_item);
+ }
+
+ }
+
+}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/Image.java b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/Image.java
index 4cbcef5..6ae2fb2 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/Image.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/Image.java
@@ -1,6 +1,6 @@
package com.omega_r.omegarecyclerview.pagination_example;
-import android.support.annotation.DrawableRes;
+import androidx.annotation.DrawableRes;
import com.omega_r.omegarecyclerview.R;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/ImageAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/ImageAdapter.java
index 4980008..12764a7 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/ImageAdapter.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/ImageAdapter.java
@@ -1,6 +1,6 @@
package com.omega_r.omegarecyclerview.pagination_example;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/PaginationActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/PaginationActivity.java
index 7635462..3de8c4a 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/PaginationActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/pagination_example/PaginationActivity.java
@@ -2,7 +2,7 @@
import android.os.Bundle;
import android.os.Handler;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.libs.omegarecyclerview.pagination.OnPageRequestListener;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/sections_example/SectionsActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/sections_example/SectionsActivity.java
index d17263e..3c516fe 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/sections_example/SectionsActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/sections_example/SectionsActivity.java
@@ -1,6 +1,6 @@
package com.omega_r.omegarecyclerview.sections_example;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderActivity.java
index 8b12e77..984732d 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderActivity.java
@@ -1,6 +1,6 @@
package com.omega_r.omegarecyclerview.sticky_header_example;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderAdapter.java b/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderAdapter.java
index 5e848ce..8903a87 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderAdapter.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/sticky_header_example/StickyHeaderAdapter.java
@@ -5,17 +5,21 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import android.widget.Toast;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
import com.omega_r.omegarecyclerview.R;
public class StickyHeaderAdapter extends OmegaRecyclerView.Adapter
- implements com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter {
+ implements StickyAdapter {
private LayoutInflater mInflater;
+ private final Context mContext;
public StickyHeaderAdapter(Context context) {
mInflater = LayoutInflater.from(context);
+ mContext = context;
}
@Override
@@ -35,19 +39,24 @@ public int getItemCount() {
}
@Override
- public long getHeaderId(int position) {
+ public long getStickyId(int position) {
return (long) position / 6;
}
@Override
- public HeaderHolder onCreateHeaderViewHolder(ViewGroup parent) {
+ public HeaderHolder onCreateStickyViewHolder(ViewGroup parent) {
View view = mInflater.inflate(R.layout.sticky_header_test, parent, false);
return new HeaderHolder(view);
}
@Override
- public void onBindHeaderViewHolder(HeaderHolder viewHolder, int position) {
- viewHolder.header.setText("Header " + getHeaderId(position));
+ public void onBindStickyViewHolder(HeaderHolder viewHolder, int position) {
+ viewHolder.header.setText("Header " + getStickyId(position));
+ }
+
+ @Override
+ public void onClickStickyViewHolder(long id) {
+ Toast.makeText(mContext, "onClickStickyViewHolder " + id, Toast.LENGTH_SHORT).show();
}
static class ViewHolder extends OmegaRecyclerView.ViewHolder {
@@ -56,6 +65,12 @@ static class ViewHolder extends OmegaRecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
item = (TextView) itemView;
+ item.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(v.getContext(), "Clicked", Toast.LENGTH_SHORT).show();
+ }
+ });
}
}
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/swipe_menu_example/SwipeMenuActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/swipe_menu_example/SwipeMenuActivity.java
index 4be3f19..66accab 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/swipe_menu_example/SwipeMenuActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/swipe_menu_example/SwipeMenuActivity.java
@@ -1,14 +1,11 @@
package com.omega_r.omegarecyclerview.swipe_menu_example;
-import android.support.v7.app.AppCompatActivity;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
-import android.support.v7.widget.LinearLayoutManager;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.omegarecyclerview.R;
-import java.util.List;
-
import omega.com.annotations.OmegaActivity;
@OmegaActivity
diff --git a/app/src/main/java/com/omega_r/omegarecyclerview/viewpager/ViewPagerActivity.java b/app/src/main/java/com/omega_r/omegarecyclerview/viewpager/ViewPagerActivity.java
index e49f216..8c44e6a 100644
--- a/app/src/main/java/com/omega_r/omegarecyclerview/viewpager/ViewPagerActivity.java
+++ b/app/src/main/java/com/omega_r/omegarecyclerview/viewpager/ViewPagerActivity.java
@@ -2,9 +2,9 @@
import android.annotation.SuppressLint;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
diff --git a/app/src/main/res/layout/activity_expandable.xml b/app/src/main/res/layout/activity_expandable.xml
index fc15ab7..08904be 100644
--- a/app/src/main/res/layout/activity_expandable.xml
+++ b/app/src/main/res/layout/activity_expandable.xml
@@ -29,6 +29,12 @@
android:text="@string/button_use_dropdown"
android:textColor="@color/white"/>
+
+
-
+
+
+
+
+
\ 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 edc4af2..1dbf850 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,54 +1,64 @@
-
+ android:layout_height="match_parent">
-
+ android:orientation="vertical"
+ android:padding="16dp"
+ tools:context="com.omega_r.omegarecyclerview.MainActivity">
-
+
-
+
-
+
-
+
-
+
+
-
+
+
+
+
+
-
+
diff --git a/app/src/main/res/layout/activity_view_pager.xml b/app/src/main/res/layout/activity_view_pager.xml
index d6d20b4..68b788f 100644
--- a/app/src/main/res/layout/activity_view_pager.xml
+++ b/app/src/main/res/layout/activity_view_pager.xml
@@ -17,10 +17,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
+ android:paddingLeft="10dp"
+ android:clipChildren="false"
+ android:clipToPadding="false"
app:autoScrollEnabled="true"
- app:autoScrollInterval="2500"
app:pageSize="1"
app:transformer="RotateUpTransformer"
app:infinite="true"/>
+
diff --git a/app/src/main/res/layout/fragment_test.xml b/app/src/main/res/layout/fragment_test.xml
index 6513e59..bfbb6fc 100644
--- a/app/src/main/res/layout/fragment_test.xml
+++ b/app/src/main/res/layout/fragment_test.xml
@@ -12,6 +12,6 @@
android:divider="@drawable/divider"
android:dividerHeight="1dp"
app:itemSpace="32dp"
- app:alphaDivider="0.5"
+ app:dividerAlpha="0.5"
app:dividerShow="middle"/>
diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml
index 096f68b..15b7881 100644
--- a/app/src/main/res/layout/item_image.xml
+++ b/app/src/main/res/layout/item_image.xml
@@ -9,7 +9,7 @@
diff --git a/app/src/main/res/layout/item_text.xml b/app/src/main/res/layout/item_text.xml
new file mode 100644
index 0000000..78d3961
--- /dev/null
+++ b/app/src/main/res/layout/item_text.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/sticky_header_test.xml b/app/src/main/res/layout/sticky_header_test.xml
index 74b095f..aa4e985 100644
--- a/app/src/main/res/layout/sticky_header_test.xml
+++ b/app/src/main/res/layout/sticky_header_test.xml
@@ -2,7 +2,7 @@
Core
Sticky header support
Group as sticky header
+ FastScroll Example
+ Test update child
diff --git a/build.gradle b/build.gradle
index ac3ea50..d885473 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,14 +1,37 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+
+ Properties properties = new Properties()
+ def localPropertiesPath = 'local.properties'
+ if (file(localPropertiesPath).exists()) {
+ properties.load(file(localPropertiesPath).newDataInputStream())
+ }
+
+ gradle.ext {
+ nexusUrl = properties.getProperty("nexusUrl") ?: ""
+ nexusUsername = properties.getProperty("nexusUsername")
+ nexusPassword = properties.getProperty("nexusPassword")
+ gitHash = { ->
+ def stdout = new ByteArrayOutputStream()
+ exec {
+ commandLine 'git', 'rev-parse', '--short', 'HEAD'
+ standardOutput = stdout
+ }
+ return stdout.toString().trim()
+ }
+ }
+
+ ext.kotlin_version = '1.3.72'
repositories {
- jcenter()
- maven { url 'https://jitpack.io' }
google()
+ maven { url gradle.nexusUrl }
+ jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.2.1'
+ classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -17,9 +40,8 @@ buildscript {
allprojects {
repositories {
- jcenter()
+ mavenCentral()
maven { url 'https://jitpack.io' }
- maven { url "https://maven.google.com" }
google()
}
}
@@ -30,8 +52,12 @@ task clean(type: Delete) {
ext {
buildToolsVersion = "28.0.3"
- supportLibVersion = "28.0.0"
+ compileSdkVersion = 28
+ minSdkVersion = 16
+ targetSdkVersion = 28
+ appcompatVersion = "1.1.0-rc01"
+ materialVersion = "1.1.0-alpha09"
espressoVersion = "3.0.1"
junitVersion = "4.12"
- omegaIntentBuilder = "1.1.2"
+ omegaIntentBuilder = "1.1.5"
}
diff --git a/gradle.properties b/gradle.properties
index aac7c9b..9e6fce1 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,6 +9,8 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
+android.enableJetifier=true
+android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1a97d31..b0fa419 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Oct 04 09:42:55 MSK 2018
+#Tue Jul 07 10:28:25 MSK 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/omegarecyclerviewlibs/.gitignore b/omegarecyclerview/.gitignore
similarity index 100%
rename from omegarecyclerviewlibs/.gitignore
rename to omegarecyclerview/.gitignore
diff --git a/omegarecyclerview/build.gradle b/omegarecyclerview/build.gradle
new file mode 100644
index 0000000..230a45e
--- /dev/null
+++ b/omegarecyclerview/build.gradle
@@ -0,0 +1,47 @@
+apply plugin: 'com.android.library'
+apply plugin: 'maven-publish'
+
+android {
+ compileSdkVersion rootProject.compileSdkVersion
+
+ defaultConfig {
+ minSdkVersion rootProject.minSdkVersion
+ targetSdkVersion rootProject.targetSdkVersion
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+
+publishing {
+ publications {
+ release(MavenPublication) {
+ groupId 'com.github.Omega-R.OmegaRecyclerView'
+ artifactId project.name
+ version project.hasProperty('version') ? project.version : gradle.gitHash()
+ afterEvaluate {
+ from components.release
+ }
+ }
+ }
+ repositories {
+ maven {
+ url gradle.nexusUrl
+ credentials {
+ username gradle.nexusUsername
+ password gradle.nexusPassword
+ }
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:' + rootProject.appcompatVersion
+ implementation 'com.google.android.material:material:' + rootProject.materialVersion
+}
diff --git a/omegarecyclerviewlibs/proguard-rules.pro b/omegarecyclerview/proguard-rules.pro
similarity index 100%
rename from omegarecyclerviewlibs/proguard-rules.pro
rename to omegarecyclerview/proguard-rules.pro
diff --git a/omegarecyclerview/src/main/AndroidManifest.xml b/omegarecyclerview/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..425e11c
--- /dev/null
+++ b/omegarecyclerview/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/omegarecyclerviewlibs/src/main/java/android/support/v7/widget/ExpandedRecyclerView.java b/omegarecyclerview/src/main/java/androidx/recyclerview/widget/ExpandedRecyclerView.java
similarity index 92%
rename from omegarecyclerviewlibs/src/main/java/android/support/v7/widget/ExpandedRecyclerView.java
rename to omegarecyclerview/src/main/java/androidx/recyclerview/widget/ExpandedRecyclerView.java
index 17f1db8..4cc901f 100644
--- a/omegarecyclerviewlibs/src/main/java/android/support/v7/widget/ExpandedRecyclerView.java
+++ b/omegarecyclerview/src/main/java/androidx/recyclerview/widget/ExpandedRecyclerView.java
@@ -1,11 +1,12 @@
-package android.support.v7.widget;
+package androidx.recyclerview.widget;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
public class ExpandedRecyclerView extends RecyclerView {
public static final int STEP_START = 1;
public static final int STEP_LAYOUT = 2;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java
similarity index 94%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java
index a5cf8a1..b8e2591 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseArrayAdapter.java
@@ -1,7 +1,7 @@
package com.omega_r.libs.omegarecyclerview;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import java.util.Arrays;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java
similarity index 86%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java
index ecda8f5..2060dba 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/BaseListAdapter.java
@@ -1,28 +1,22 @@
package com.omega_r.libs.omegarecyclerview;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class BaseListAdapter extends OmegaRecyclerView.Adapter.ViewHolder> {
- private static final int INDEX_NOT_FOUND = -1;
-
private List items;
@Nullable
- private OnItemClickListener clickListener = null;
+ private OnItemClickListener clickListener;
@Nullable
- private OnItemLongClickListener longClickListener = null;
-
-
- protected abstract BaseListAdapter.ViewHolder provideViewHolder(ViewGroup parent);
+ private OnItemLongClickListener longClickListener;
public BaseListAdapter(@NonNull List items,
@Nullable OnItemClickListener clickListener,
@@ -100,13 +94,6 @@ private void onLongItemClick(T item) {
}
}
- @NonNull
- @Override
- public BaseListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- return provideViewHolder(parent);
- }
-
- @SuppressWarnings("unchecked")
@Override
public void onBindViewHolder(@NonNull BaseListAdapter.ViewHolder holder, int position) {
holder.bind(getItem(position));
@@ -117,7 +104,9 @@ public int getItemCount() {
return items.size();
}
- public abstract class ViewHolder extends OmegaRecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
+ public abstract class ViewHolder extends OmegaRecyclerView.ViewHolder implements
+ View.OnClickListener,
+ View.OnLongClickListener {
private T item;
@@ -135,6 +124,7 @@ private void bind(T item) {
if (clickListener != null) {
itemView.setOnClickListener(this);
}
+
if (longClickListener != null) {
itemView.setOnLongClickListener(this);
}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java
similarity index 95%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java
index d4f1282..aac4cd7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/ClickViewHolder.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview;
-import android.support.annotation.LayoutRes;
+import androidx.annotation.LayoutRes;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java
similarity index 64%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java
index 9266eb9..2bb1bab 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java
@@ -7,59 +7,77 @@
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.support.v4.content.ContextCompat;
-import android.support.v7.widget.ExpandedRecyclerView;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.ExpandableStickyHeaderDecoration;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.ExpandedRecyclerView;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
import com.omega_r.libs.omegarecyclerview.header.HeaderFooterWrapperAdapter;
+import com.omega_r.libs.omegarecyclerview.header.SectionSize;
+import com.omega_r.libs.omegarecyclerview.item_decoration.BaseSpaceItemDecoration;
import com.omega_r.libs.omegarecyclerview.item_decoration.DividerItemDecoration;
-import com.omega_r.libs.omegarecyclerview.item_decoration.SpaceItemDecoration;
import com.omega_r.libs.omegarecyclerview.pagination.OnPageRequestListener;
import com.omega_r.libs.omegarecyclerview.pagination.PageRequester;
import com.omega_r.libs.omegarecyclerview.pagination.PaginationAdapter;
import com.omega_r.libs.omegarecyclerview.pagination.WrapperAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.BaseStickyHeaderDecoration;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.BaseStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.HeaderStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.MiddleStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
import com.omega_r.libs.omegarecyclerview.swipe_menu.SwipeMenuHelper;
import java.util.ArrayList;
import java.util.List;
import java.util.WeakHashMap;
+@SuppressWarnings("rawtypes")
public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenuHelper.Callback {
private static final int[] DEFAULT_DIVIDER_ATTRS = new int[]{android.R.attr.listDivider};
+ private static final int HEADER = 0;
+ private static final int FOOTER = 1;
+
+ private final WeakHashMap mLayoutParamCache = new WeakHashMap<>();
+ private final SwipeMenuHelper mSwipeMenuHelper = new SwipeMenuHelper(this);
+ private final PageRequester mPageRequester = new PageRequester();
+ private final List mHeadersList = new ArrayList<>();
+ private final List mFooterList = new ArrayList<>();
private View mEmptyView;
private int mEmptyViewId;
- private SwipeMenuHelper mSwipeMenuHelper;
- private PageRequester mPageRequester = new PageRequester();
- private StickyHeaderDecoration mStickyHeaderDecoration;
+ @Nullable
+ private BaseStickyDecoration mBaseStickyDecoration;
+ private BaseSpaceItemDecoration mBaseSpaceItemDecoration;
+ private int mStickyMode = StickyAdapter.Mode.HEADER;
@LayoutRes
private int mPaginationLayout = R.layout.pagination_omega_layout;
@LayoutRes
private int mPaginationErrorLayout = R.layout.pagination_error_omega_layout;
private boolean mFinishedInflate = false;
- private List mHeadersList = new ArrayList<>();
- private List mFooterList = new ArrayList<>();
- private WeakHashMap mLayoutParamCache = new WeakHashMap<>();
+ @Nullable
+ private DividerItemDecoration mDividerItemDecoration;
private int mItemSpace;
+ private int mDividerSize;
+ private boolean mIsAdapterConnected;
+ private int mHeaderType = SectionSize.DEFAULT.getValue();
+ private int mFooterType = SectionSize.DEFAULT.getValue();
+ private int mHeaderSpanSize;
+ private int mFooterSpanSize;
public OmegaRecyclerView(Context context) {
super(context);
@@ -81,13 +99,13 @@ private void init(Context context, @Nullable AttributeSet attrs, int defStyleAtt
initDefaultLayoutManager(attrs, defStyleAttr);
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.OmegaRecyclerView, defStyleAttr, 0);
- initDivider(a);
initItemSpace(a);
+ initDivider(a);
initEmptyView(a);
initPagination(a);
+ initStickyMode(a);
a.recycle();
}
- mSwipeMenuHelper = new SwipeMenuHelper(getContext(), this);
mPageRequester.attach(this);
}
@@ -103,12 +121,17 @@ private void initEmptyView(TypedArray a) {
}
}
- public void initItemSpace(TypedArray a) {
- if (a.hasValue(R.styleable.OmegaRecyclerView_itemSpace)) {
- int showDivider = a.getInt(R.styleable.OmegaRecyclerView_dividerShow, DividerItemDecoration.ShowDivider.NONE);
- mItemSpace = (int) a.getDimension(R.styleable.OmegaRecyclerView_itemSpace, 0);
- addItemDecoration(new SpaceItemDecoration(showDivider, mItemSpace));
- }
+ private void initItemSpace(TypedArray a) {
+ int showDivider = a.getInt(R.styleable.OmegaRecyclerView_dividerShow, DividerItemDecoration.ShowDivider.NONE);
+ mItemSpace = (int) a.getDimension(R.styleable.OmegaRecyclerView_itemSpace, 0);
+ mBaseSpaceItemDecoration = createSpaceItemDecoration(showDivider, mItemSpace);
+
+ if (a.hasValue(R.styleable.OmegaRecyclerView_itemSpace))
+ addItemDecoration(mBaseSpaceItemDecoration);
+ }
+
+ protected BaseSpaceItemDecoration createSpaceItemDecoration(int showDivider, int itemSpace) {
+ return new BaseSpaceItemDecoration(showDivider, itemSpace);
}
public void initDivider(TypedArray a) {
@@ -123,31 +146,32 @@ public void initDivider(TypedArray a) {
}
}
- float dividerHeight = a.getDimension(R.styleable.OmegaRecyclerView_dividerHeight,
+
+ mDividerSize = (int) a.getDimension(R.styleable.OmegaRecyclerView_dividerHeight,
+
a.getDimension(R.styleable.OmegaRecyclerView_android_dividerHeight, -1));
- float alpha = a.getFloat(R.styleable.OmegaRecyclerView_alphaDivider, 1);
- int itemSpace = (int) a.getDimension(R.styleable.OmegaRecyclerView_itemSpace, 0);
+ float alpha = a.getFloat(R.styleable.OmegaRecyclerView_dividerAlpha, 1);
- DividerItemDecoration decoration = new DividerItemDecoration(
+ mDividerItemDecoration = new DividerItemDecoration(
dividerDrawable,
- (int) dividerHeight,
+ mDividerSize,
showDivider,
- itemSpace / 2,
+ mItemSpace / 2,
alpha
);
int paddingStartDivider = a.getDimensionPixelSize(R.styleable.OmegaRecyclerView_dividerPaddingStart, 0);
int paddingEndDivider = a.getDimensionPixelSize(R.styleable.OmegaRecyclerView_dividerPaddingEnd, 0);
- decoration.setPaddingStart(paddingStartDivider);
- decoration.setPaddingEnd(paddingEndDivider);
+ mDividerItemDecoration.setPaddingStart(paddingStartDivider);
+ mDividerItemDecoration.setPaddingEnd(paddingEndDivider);
if (a.hasValue(R.styleable.OmegaRecyclerView_dividerPadding)) {
int paddingDivider = a.getDimensionPixelSize(R.styleable.OmegaRecyclerView_dividerPadding, 0);
- decoration.setPadding(paddingDivider);
+ mDividerItemDecoration.setPadding(paddingDivider);
}
- addItemDecoration(decoration);
+ addItemDecoration(mDividerItemDecoration);
}
}
}
@@ -161,14 +185,72 @@ private void initPagination(TypedArray a) {
}
}
+ private void initStickyMode(TypedArray a) {
+ mStickyMode = a.getInt(R.styleable.OmegaRecyclerView_stickyMode, mStickyMode);
+ }
+
+ private void initHeaderAndFooter(int section, TypedArray a) {
+ if (section == HEADER) {
+ if (a.hasValue(R.styleable.OmegaRecyclerView_Layout_sectionType)) {
+ mHeaderType = a.getInt(R.styleable.OmegaRecyclerView_Layout_sectionType, mHeaderType);
+ }
+ if (a.hasValue(R.styleable.OmegaRecyclerView_Layout_spanSize)) {
+ mHeaderSpanSize = a.getInt(R.styleable.OmegaRecyclerView_Layout_spanSize, 0);
+ }
+ } else if (section == FOOTER) {
+ if (a.hasValue(R.styleable.OmegaRecyclerView_Layout_sectionType)) {
+ mFooterType = a.getInt(R.styleable.OmegaRecyclerView_Layout_sectionType, mHeaderType);
+ }
+ if (a.hasValue(R.styleable.OmegaRecyclerView_Layout_spanSize)) {
+ mFooterSpanSize = a.getInt(R.styleable.OmegaRecyclerView_Layout_spanSize, 0);
+ }
+ }
+ }
+
+ private void checkLayoutManager(LayoutManager layout, RecyclerView.Adapter adapter) {
+ if (layout instanceof GridLayoutManager && adapter instanceof HeaderFooterWrapperAdapter) {
+ setFooterAndHeaderSpan(
+ (GridLayoutManager) layout,
+ (HeaderFooterWrapperAdapter) adapter
+ );
+ }
+ }
+
+ private void setFooterAndHeaderSpan(final GridLayoutManager lm, final HeaderFooterWrapperAdapter adapter) {
+ lm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
+ @Override
+ public int getSpanSize(int position) {
+ if (adapter.isHeadersVisible() && adapter.isHeader(adapter.getItemViewType(position))) {
+ return getItemSpan(lm, mHeaderType, mHeaderSpanSize);
+ }
+ if (adapter.isFootersVisible() && adapter.isFooter(adapter.getItemViewType(position))) {
+ return getItemSpan(lm, mFooterType, mFooterSpanSize);
+ }
+ return 1;
+ }
+ });
+ }
+
+ private int getItemSpan(GridLayoutManager lm, int spanType, int span) {
+ int maxSpan = lm.getSpanCount();
+ if (spanType == SectionSize.FULL.getValue()) {
+ return maxSpan;
+ }
+ if (spanType == SectionSize.CUSTOM.getValue() && span > 0) {
+ return Math.min(span, maxSpan);
+ }
+ return 1;
+ }
+
@Override
@SuppressWarnings("unchecked")
public void setAdapter(RecyclerView.Adapter adapter) {
+ mIsAdapterConnected = true;
unregisterObservers();
if (adapter == null) {
super.setAdapter(null);
- updateStickyHeader(null);
+ updateStickyDecoration(null);
return;
}
@@ -185,13 +267,28 @@ public void setAdapter(RecyclerView.Adapter adapter) {
shellAdapter = new HeaderFooterWrapperAdapter(shellAdapter);
((HeaderFooterWrapperAdapter) shellAdapter).setHeaders(mHeadersList);
((HeaderFooterWrapperAdapter) shellAdapter).setFooters(mFooterList);
+ checkLayoutManager(getLayoutManager(), shellAdapter);
}
}
super.setAdapter(shellAdapter);
mPageRequester.reset();
registerObservers(shellAdapter);
- updateStickyHeader(shellAdapter);
+ updateStickyDecoration(shellAdapter);
+ }
+
+ @Nullable
+ public RecyclerView.Adapter getRealAdapter() {
+ return getRealAdapter(getAdapter());
+ }
+
+ private RecyclerView.Adapter getRealAdapter(RecyclerView.Adapter adapter) {
+ if (adapter instanceof HeaderFooterWrapperAdapter) {
+ return getRealAdapter(((HeaderFooterWrapperAdapter) adapter).getWrappedAdapter());
+ } else if (adapter instanceof WrapperAdapter) {
+ return getRealAdapter(((WrapperAdapter) adapter).getLastWrappedAdapter());
+ }
+ return adapter;
}
private void unregisterObservers() {
@@ -213,52 +310,68 @@ private void registerObservers(RecyclerView.Adapter adapter) {
adapter.registerAdapterDataObserver(mEmptyObserver);
}
- private void updateStickyHeader(@Nullable RecyclerView.Adapter adapter) {
+ protected void updateStickyDecoration(@Nullable RecyclerView.Adapter adapter) {
if (adapter == null) {
- if (mStickyHeaderDecoration != null) removeItemDecoration(mStickyHeaderDecoration);
+ if (mBaseStickyDecoration != null) removeItemDecoration(mBaseStickyDecoration);
} else {
- StickyHeaderAdapter stickyHeaderAdapter = null;
- OmegaExpandableRecyclerView.Adapter expandableAdapter = null;
-
+ StickyAdapter stickyAdapter = null;
if (adapter instanceof WrapperAdapter) {
RecyclerView.Adapter wrappedAdapter = ((WrapperAdapter) adapter).getLastWrappedAdapter();
- if (wrappedAdapter instanceof StickyHeaderAdapter) {
- stickyHeaderAdapter = (StickyHeaderAdapter) wrappedAdapter;
+ if (wrappedAdapter instanceof StickyAdapter) {
+ stickyAdapter = (StickyAdapter) wrappedAdapter;
}
} else if (adapter instanceof HeaderFooterWrapperAdapter) {
- if (((HeaderFooterWrapperAdapter) adapter).getStickyHeaderAdapter() != null) {
- stickyHeaderAdapter = (StickyHeaderAdapter) adapter;
+ if (((HeaderFooterWrapperAdapter) adapter).getStickyAdapter() != null) {
+ stickyAdapter = (StickyAdapter) adapter;
}
- } else if (adapter instanceof StickyHeaderAdapter) {
- stickyHeaderAdapter = (StickyHeaderAdapter) adapter;
- }
-
- if (adapter instanceof OmegaExpandableRecyclerView.Adapter) {
- expandableAdapter = (OmegaExpandableRecyclerView.Adapter) adapter;
+ } else if (adapter instanceof StickyAdapter) {
+ stickyAdapter = (StickyAdapter) adapter;
}
-
- if (mStickyHeaderDecoration == null) {
- mStickyHeaderDecoration = provideStickyHeaderDecoration(stickyHeaderAdapter, expandableAdapter);
- if (mStickyHeaderDecoration == null) return;
- mStickyHeaderDecoration.setItemSpace(mItemSpace);
- addItemDecoration(mStickyHeaderDecoration);
+ if (mBaseStickyDecoration == null) {
+ mBaseStickyDecoration = provideStickyDecoration(adapter, stickyAdapter);
+ if (mBaseStickyDecoration == null) return;
+ mBaseStickyDecoration.setItemSpace(mItemSpace + mDividerSize);
+ addItemDecoration(mBaseStickyDecoration);
} else {
- mStickyHeaderDecoration.setStickyHeaderAdapter(stickyHeaderAdapter);
- if (mStickyHeaderDecoration instanceof ExpandableStickyHeaderDecoration) {
- ((ExpandableStickyHeaderDecoration) mStickyHeaderDecoration).setExpandableAdapter(expandableAdapter);
- }
+ mBaseStickyDecoration.setStickyAdapter(stickyAdapter);
invalidateItemDecorations();
}
}
}
@Nullable
- protected StickyHeaderDecoration provideStickyHeaderDecoration(@Nullable StickyHeaderAdapter adapter,
- @Nullable OmegaExpandableRecyclerView.Adapter expandableAdapter) {
- if (adapter == null) return null;
- return new BaseStickyHeaderDecoration(adapter);
+ protected BaseStickyDecoration provideStickyDecoration(@NonNull RecyclerView.Adapter adapter, @Nullable StickyAdapter stickyAdapter) {
+ if (stickyAdapter == null) return null;
+ switch (mStickyMode) {
+ case StickyAdapter.Mode.MIDDLE:
+ return new MiddleStickyDecoration(stickyAdapter);
+ case StickyAdapter.Mode.HEADER:
+ default:
+ return new HeaderStickyDecoration(stickyAdapter);
+ }
+ }
+
+ @Nullable
+ protected final BaseStickyDecoration getStickyDecoration() {
+ return mBaseStickyDecoration;
+ }
+
+ public void smoothScrollToRealPosition(int position) {
+ int scrollPosition = position;
+
+ RecyclerView.Adapter adapter = getAdapter();
+ if (adapter instanceof HeaderFooterWrapperAdapter) {
+ if (((HeaderFooterWrapperAdapter) adapter).isHeadersVisible()) {
+ scrollPosition += mHeadersList.size();
+ }
+ }
+ super.smoothScrollToPosition(scrollPosition);
}
+ @NonNull
+ protected final BaseSpaceItemDecoration getSpaceDecoration() {
+ return mBaseSpaceItemDecoration;
+ }
@Override
public void addView(View view, int index, ViewGroup.LayoutParams params) {
@@ -267,10 +380,10 @@ public void addView(View view, int index, ViewGroup.LayoutParams params) {
} else {
view.setLayoutParams(params);
SectionState sectionState = mLayoutParamCache.get(params);
- Integer integer = sectionState.position;
+ if (sectionState == null) return;
view.setTag(R.id.section_show_divider, sectionState.showDivider);
- if (integer == 0) {
+ if (sectionState.position == 0) {
mHeadersList.add(view);
} else {
mFooterList.add(view);
@@ -278,6 +391,38 @@ public void addView(View view, int index, ViewGroup.LayoutParams params) {
}
}
+ @Override
+ public int getChildCount() {
+ if (!mIsAdapterConnected && areSectionsInitialized()) {
+ return super.getChildCount() + mHeadersList.size() + mFooterList.size();
+ }
+
+ return super.getChildCount();
+ }
+
+ @Override
+ public View getChildAt(int index) {
+ if (!mIsAdapterConnected && areSectionsInitialized()) {
+ int realChildrenCount = super.getChildCount();
+ int headersCount = mHeadersList.size();
+ int footersCount = mFooterList.size();
+
+ if (index < realChildrenCount) {
+ return super.getChildAt(index);
+ } else if (index < realChildrenCount + headersCount) {
+ return mHeadersList.get(index - realChildrenCount);
+ } else if (index < realChildrenCount + headersCount + footersCount) {
+ return mFooterList.get(index - realChildrenCount - headersCount);
+ }
+
+ }
+ return super.getChildAt(index);
+ }
+
+ private boolean areSectionsInitialized() {
+ return mHeadersList != null && mFooterList != null;
+ }
+
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -325,6 +470,7 @@ public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
final TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.OmegaRecyclerView_Layout);
int section = typedArray.getInt(R.styleable.OmegaRecyclerView_Layout_layout_section, 0);
boolean showDivider = typedArray.getBoolean(R.styleable.OmegaRecyclerView_Layout_layout_showDivider, true);
+ initHeaderAndFooter(section, typedArray);
typedArray.recycle();
mLayoutParamCache.put(layoutParams, new SectionState(section, showDivider));
}
@@ -350,17 +496,21 @@ private void findEmptyView() {
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- boolean isIntercepted = super.onInterceptTouchEvent(ev);
- if (ev.getActionIndex() != 0) return true;
- int action = ev.getAction();
+ boolean result = mSwipeMenuHelper.handleInterceptTouchEvent(ev, super.onInterceptTouchEvent(ev));
+ if (mBaseStickyDecoration != null && !result)
+ return mBaseStickyDecoration.onTouchEvent(this, ev, result);
+ return result;
+ }
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- isIntercepted = mSwipeMenuHelper.handleListDownTouchEvent(ev, isIntercepted);
- break;
- }
+ @Override
+ public boolean onTouchEvent(MotionEvent e) {
+ boolean result = super.onTouchEvent(e);
+ return mBaseStickyDecoration == null ? result : mBaseStickyDecoration.onTouchEvent(this, e, result);
+ }
- return isIntercepted;
+ @Override
+ public boolean onFilterTouchEventForSecurity(MotionEvent ev) {
+ return mSwipeMenuHelper.handleTouchEventForSecurity(ev, super.onFilterTouchEventForSecurity(ev));
}
private Drawable getDefaultDivider() {
@@ -402,12 +552,50 @@ public View transformTouchView(int touchPosition, View touchView) {
}
public void setDividerAlpha(float dividerAlpha) {
+ if (0 > dividerAlpha || dividerAlpha > 1) return;
+
+ if (mDividerItemDecoration != null) {
+ mDividerItemDecoration.setDividerAlpha(dividerAlpha);
+ }
+
+ boolean hasDividerDecoration = false;
for (int i = 0; i < getItemDecorationCount(); i++) {
RecyclerView.ItemDecoration itemDecoration = getItemDecorationAt(i);
if (itemDecoration instanceof DividerItemDecoration) {
- ((DividerItemDecoration) itemDecoration).setDividerAlpha(dividerAlpha);
+ hasDividerDecoration = true;
+ invalidateItemDecorations();
+ break;
}
}
+
+ if (!hasDividerDecoration && mDividerItemDecoration != null) {
+ addItemDecoration(mDividerItemDecoration);
+ }
+ }
+
+ public void setDividerDrawable(@Nullable Drawable drawable) {
+ if (mDividerItemDecoration != null && drawable != null) {
+ mDividerItemDecoration.setDividerDrawable(drawable);
+ }
+
+ boolean hasDividerDecoration = false;
+ for (int i = 0; i < getItemDecorationCount(); i++) {
+ RecyclerView.ItemDecoration itemDecoration = getItemDecorationAt(i);
+ if (itemDecoration instanceof DividerItemDecoration) {
+ hasDividerDecoration = true;
+ if (drawable == null) {
+ removeItemDecoration(itemDecoration);
+ break;
+ } else {
+ invalidateItemDecorations();
+ break;
+ }
+ }
+ }
+
+ if (drawable != null && !hasDividerDecoration) {
+ addItemDecoration(mDividerItemDecoration);
+ }
}
public void setPaginationCallback(OnPageRequestListener callback) {
@@ -415,7 +603,7 @@ public void setPaginationCallback(OnPageRequestListener callback) {
if (adapter instanceof HeaderFooterWrapperAdapter) {
adapter = ((HeaderFooterWrapperAdapter) adapter).getWrappedAdapter();
}
- if (adapter != null && mPageRequester.getCallback() != null && !(adapter instanceof PaginationAdapter)) {
+ if (adapter != null && !(adapter instanceof PaginationAdapter)) {
setAdapter(new PaginationAdapter(adapter, mPaginationLayout, mPaginationErrorLayout));
}
mPageRequester.setPaginationCallback(callback);
@@ -466,6 +654,10 @@ public void hidePagination() {
}
}
+ public void resetPagination() {
+ mPageRequester.reset();
+ }
+
public void setHeadersVisibility(boolean visible) {
RecyclerView.Adapter adapter = getAdapter();
if (adapter instanceof HeaderFooterWrapperAdapter) {
@@ -480,6 +672,40 @@ public void setFootersVisibility(boolean visible) {
}
}
+ public void setHeaderSpanSize(int spanSize) {
+ mHeaderSpanSize = spanSize;
+ checkLayoutManager(getLayoutManager(), getAdapter());
+ }
+
+ public int getHeaderSpanSize() {
+ return mHeaderSpanSize;
+ }
+
+ public void setFooterSpanSize(int spanSize) {
+ mFooterSpanSize = spanSize;
+ checkLayoutManager(getLayoutManager(), getAdapter());
+ }
+
+ public int getFooterSpanSize() {
+ return mFooterSpanSize;
+ }
+
+ public void setHeaderType(SectionSize sizeType) {
+ mHeaderType = sizeType.getValue();
+ }
+
+ public SectionSize getHeaderType() {
+ return SectionSize.valueOf(mHeaderType);
+ }
+
+ public void setFooterType(SectionSize sizeType) {
+ mFooterType = sizeType.getValue();
+ }
+
+ public SectionSize getFooterType() {
+ return SectionSize.valueOf(mFooterType);
+ }
+
private final AdapterDataObserver mEmptyObserver = new AdapterDataObserver() {
@Override
public void onChanged() {
@@ -547,7 +773,8 @@ public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
public abstract static class Adapter extends RecyclerView.Adapter {
- private RecyclerView recyclerView;
+ @Nullable
+ protected RecyclerView recyclerView;
public boolean isDividerAllowedAbove(int position) {
return true;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java
similarity index 79%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java
index 37df97e..87a80df 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/HeaderFooterWrapperAdapter.java
@@ -1,20 +1,21 @@
package com.omega_r.libs.omegarecyclerview.header;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.libs.omegarecyclerview.R;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.BaseStickyHeaderDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.HeaderStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
import java.util.List;
-public class HeaderFooterWrapperAdapter extends OmegaRecyclerView.Adapter implements StickyHeaderAdapter {
+public class HeaderFooterWrapperAdapter extends OmegaRecyclerView.Adapter implements StickyAdapter {
// Defines available view type integers for headers and footers.
private static final int BASE_HEADER_VIEW_TYPE = -1 << 10;
@@ -34,6 +35,12 @@ public HeaderFooterWrapperAdapter(T adapter) {
super.setHasStableIds(mRealAdapter.hasStableIds());
}
+ @Override
+ public void onAttachedToRecyclerView(RecyclerView recyclerView) {
+ super.onAttachedToRecyclerView(recyclerView);
+ mRealAdapter.onAttachedToRecyclerView(recyclerView);
+ }
+
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -131,11 +138,11 @@ public T getWrappedAdapter() {
return mRealAdapter;
}
- private boolean isHeader(int viewType) {
+ public boolean isHeader(int viewType) {
return viewType >= BASE_HEADER_VIEW_TYPE && viewType < (BASE_HEADER_VIEW_TYPE + mHeaderArray.size());
}
- private boolean isFooter(int viewType) {
+ public boolean isFooter(int viewType) {
return viewType >= BASE_FOOTER_VIEW_TYPE && viewType < (BASE_FOOTER_VIEW_TYPE + mFooterArray.size());
}
@@ -144,7 +151,8 @@ private boolean isHeaderPosition(int position) {
}
private boolean isFooterPosition(int position) {
- return position >= mRealAdapter.getItemCount() + mHeaderArray.size();
+ return mFooterArray.size() > position - mRealAdapter.getItemCount() - mHeaderArray.size() &&
+ position >= mRealAdapter.getItemCount() + mHeaderArray.size();
}
public void setHeaders(@NonNull List list) {
@@ -181,6 +189,10 @@ public void setHeadersVisible(boolean visible) {
}
}
+ public boolean isHeadersVisible() {
+ return mHeadersVisibility;
+ }
+
public void setFootersVisible(boolean visible) {
if (mFootersVisibility != visible) {
if (visible) {
@@ -193,6 +205,10 @@ public void setFootersVisible(boolean visible) {
}
}
+ public boolean isFootersVisible() {
+ return mFootersVisibility;
+ }
+
private void copyTo(SparseArray fromArray, SparseArray toArray) {
toArray.clear();
@@ -202,27 +218,27 @@ private void copyTo(SparseArray fromArray, SparseArray toArray) {
}
@Override
- public long getHeaderId(int position) {
+ public long getStickyId(int position) {
if (position < 0 || mRealAdapter.getItemCount() <= position) {
- return BaseStickyHeaderDecoration.NO_HEADER_ID;
+ return HeaderStickyDecoration.NO_STICKY_ID;
}
- StickyHeaderAdapter stickyHeaderAdapter = getStickyHeaderAdapter();
- if (stickyHeaderAdapter == null) {
- return BaseStickyHeaderDecoration.NO_HEADER_ID;
+ StickyAdapter stickyAdapter = getStickyAdapter();
+ if (stickyAdapter == null) {
+ return HeaderStickyDecoration.NO_STICKY_ID;
}
int realAdapterItemCount = mRealAdapter.getItemCount();
if (realAdapterItemCount == 0) {
- return BaseStickyHeaderDecoration.NO_HEADER_ID;
+ return HeaderStickyDecoration.NO_STICKY_ID;
}
if (isHeaderPosition(position)) {
- return stickyHeaderAdapter.getHeaderId(0);
+ return stickyAdapter.getStickyId(0);
}
if (isFooterPosition(position)) {
- return stickyHeaderAdapter.getHeaderId(realAdapterItemCount - 1);
+ return stickyAdapter.getStickyId(realAdapterItemCount - 1);
}
- return stickyHeaderAdapter.getHeaderId(position);
+ return stickyAdapter.getStickyId(position);
}
public int applyRealPositionToChildPosition(int realPosition) {
@@ -234,26 +250,32 @@ public int applyChildPositionToRealPosition(int childPosition) {
}
@Nullable
- public StickyHeaderAdapter getStickyHeaderAdapter() {
- if (mRealAdapter instanceof StickyHeaderAdapter) {
- return (StickyHeaderAdapter) mRealAdapter;
+ public StickyAdapter getStickyAdapter() {
+ if (mRealAdapter instanceof StickyAdapter) {
+ return (StickyAdapter) mRealAdapter;
}
return null;
}
@Override
- public RecyclerView.ViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
- StickyHeaderAdapter stickyHeaderAdapter = getStickyHeaderAdapter();
- assert stickyHeaderAdapter != null;
- return stickyHeaderAdapter.onCreateHeaderViewHolder(parent);
+ public RecyclerView.ViewHolder onCreateStickyViewHolder(ViewGroup parent) {
+ StickyAdapter stickyAdapter = getStickyAdapter();
+ assert stickyAdapter != null;
+ return stickyAdapter.onCreateStickyViewHolder(parent);
}
@Override
- public void onBindHeaderViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
- StickyHeaderAdapter stickyHeaderAdapter = getStickyHeaderAdapter();
- assert stickyHeaderAdapter != null;
+ public void onBindStickyViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
+ StickyAdapter stickyAdapter = getStickyAdapter();
+ assert stickyAdapter != null;
//noinspection unchecked
- stickyHeaderAdapter.onBindHeaderViewHolder(viewHolder, position);
+ stickyAdapter.onBindStickyViewHolder(viewHolder, position);
+ }
+
+ @Override
+ public void onClickStickyViewHolder(long id) {
+ StickyAdapter stickyAdapter = getStickyAdapter();
+ if (stickyAdapter != null) stickyAdapter.onClickStickyViewHolder(id);
}
@Override
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java
similarity index 95%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java
index 769616d..b411735 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionContentFrameLayout.java
@@ -1,7 +1,7 @@
package com.omega_r.libs.omegarecyclerview.header;
import android.content.Context;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionSize.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionSize.java
new file mode 100644
index 0000000..884ac57
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/header/SectionSize.java
@@ -0,0 +1,32 @@
+package com.omega_r.libs.omegarecyclerview.header;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum SectionSize {
+
+ CUSTOM(-1),
+ FULL(0),
+ DEFAULT(1);
+
+ private final int value;
+ private static final Map map = new HashMap<>();
+
+ SectionSize(int value) {
+ this.value = value;
+ }
+
+ static {
+ for (SectionSize sectionSize: SectionSize.values()) {
+ map.put(sectionSize.value, sectionSize);
+ }
+ }
+
+ public static SectionSize valueOf(int sectionSize) {
+ return map.get(sectionSize);
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java
similarity index 95%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java
index 5a7e615..d30bab6 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseItemDecoration.java
@@ -1,9 +1,9 @@
package com.omega_r.libs.omegarecyclerview.item_decoration;
import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.LinearLayout;
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseSpaceItemDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseSpaceItemDecoration.java
new file mode 100644
index 0000000..ac380c8
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/BaseSpaceItemDecoration.java
@@ -0,0 +1,47 @@
+package com.omega_r.libs.omegarecyclerview.item_decoration;
+
+import android.graphics.Rect;
+
+import com.omega_r.libs.omegarecyclerview.item_decoration.decoration_helpers.DividerDecorationHelper;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class BaseSpaceItemDecoration extends BaseItemDecoration {
+
+ private final int mItemSpace;
+
+ public BaseSpaceItemDecoration(int showDivider, int space) {
+ super(showDivider);
+ mItemSpace = space;
+ }
+
+ @Override
+ void getItemOffset(@NonNull Rect outRect, @NonNull RecyclerView parent,
+ @NonNull DividerDecorationHelper helper, int position, int itemCount) {
+ int countBeginEndPositions = getCountBeginEndPositions(parent);
+ int itemSpace = getItemSpace(parent, position, itemCount);
+
+ if (isShowBeginDivider() || countBeginEndPositions <= position) helper.setStart(outRect, itemSpace);
+ if (isShowEndDivider() && position == itemCount - countBeginEndPositions) helper.setEnd(outRect, itemSpace);
+
+ if (countBeginEndPositions > 1) {
+ if (position % countBeginEndPositions != 0 || isShowBeginDivider()) helper.setOtherStart(outRect, itemSpace);
+ if (position / (countBeginEndPositions - 1) > 0 && isShowEndDivider()) helper.setOtherEnd(outRect, itemSpace);
+ }
+ }
+
+ protected int getItemSpace(@NonNull RecyclerView parent, int position, int itemCount) {
+ return mItemSpace;
+ }
+
+ private int getCountBeginEndPositions(RecyclerView recyclerView) {
+ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
+ if (layoutManager instanceof GridLayoutManager) {
+ return ((GridLayoutManager) layoutManager).getSpanCount();
+ } else return 1;
+ }
+
+}
+
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java
similarity index 83%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java
index 204fe14..5ffc06d 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/DividerItemDecoration.java
@@ -3,27 +3,30 @@
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.libs.omegarecyclerview.item_decoration.decoration_helpers.DividerDecorationHelper;
public class DividerItemDecoration extends BaseItemDecoration {
- private final int mOffset;
+ private final Rect mViewRect = new Rect();
+ private final Rect mItemRect = new Rect();
+ private final int mOriginalDividerSize;
+ private final int mOffset;
private float mDividerAlpha;
private Drawable mDivider;
private int mDividerSize;
private int mPaddingStart;
private int mPaddingEnd;
- private Rect mViewRect = new Rect();
- private Rect mItemRect = new Rect();
+
public DividerItemDecoration(Drawable divider, int dividerSize, int showDivider, int offset, float dividerAlpha) {
super(showDivider);
+ mOriginalDividerSize = dividerSize;
mDivider = divider;
mDividerSize = dividerSize;
mOffset = offset;
@@ -55,6 +58,10 @@ public void setDividerAlpha(float dividerAlpha) {
public void setDividerDrawable(@NonNull Drawable dividerDrawable) {
mDivider = dividerDrawable;
+ if (mOriginalDividerSize < 0) {
+ mDividerSize = mOriginalDividerSize;
+ updateSize();
+ }
}
private void updateSize() {
@@ -98,16 +105,20 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull
DividerDecorationHelper helper = DividerDecorationHelper.getHelper(getOrientation(), parent);
if (parent.getClipToPadding()) {
+ mViewRect.set(parent.getPaddingLeft(),
+ parent.getPaddingTop(),
+ parent.getWidth() - parent.getPaddingRight(),
+ parent.getHeight() - parent.getPaddingBottom());
+
+ c.clipRect(mViewRect);
+
mItemRect.set(parent.getPaddingLeft() + mPaddingStart,
parent.getPaddingTop() + mPaddingStart,
parent.getWidth() - parent.getPaddingRight() - mPaddingEnd,
parent.getHeight() - parent.getPaddingBottom() - mPaddingEnd);
-
helper.setStart(mItemRect, helper.getStart(mItemRect) - mPaddingStart);
helper.setEnd(mItemRect, helper.getEnd(mItemRect) + mPaddingEnd);
- c.clipRect(mItemRect);
-
} else {
mItemRect.set(mPaddingStart, mPaddingStart,
parent.getWidth() - mPaddingEnd, parent.getHeight() - mPaddingEnd);
@@ -118,7 +129,7 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull
// show beginning divider
if (isShowBeginDivider()) {
- child = parent.getChildAt(0);
+ child = getFirstChild(parent);
int adapterPosition = getAdapterPosition(parent, child);
if (adapterPosition == 0 && isShowDividerAbove(parent, 0)) {
offsetIndex = 1;
@@ -133,7 +144,8 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull
if (isShowMiddleDivider()) {
for (int i = offsetIndex; i < childCount; i++) {
child = parent.getChildAt(i);
- if (isShowDividerAbove(parent, getAdapterPosition(parent, child))) {
+ int adapterPosition = getAdapterPosition(parent, child);
+ if (adapterPosition > 0 && isShowDividerAbove(parent, adapterPosition)) {
updateViewRect(parent, child);
helper.setStart(mItemRect, helper.getStart(mViewRect) - helper.getOffset(mOffset));
helper.setEnd(mItemRect, helper.getStart(mItemRect) - helper.getOffset(mDividerSize));
@@ -159,6 +171,22 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull
}
}
+ // Bug with Expandable adapter and hide animation.
+ // RecyclerView getChild - returns wrong child (ChildClippingFrameLayout).
+ private View getFirstChild(RecyclerView parent) {
+ int count = parent.getChildCount();
+ View topView = null;
+ for (int i = 0; i < count; i++) {
+ View view = parent.getChildAt(i);
+ if (topView == null) {
+ topView = view;
+ } else if (topView.getY() > view.getY()) {
+ topView = view;
+ }
+ }
+ return topView;
+ }
+
private void updateViewRect(RecyclerView parent, View view) {
view.getHitRect(mViewRect);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java
similarity index 69%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java
index fb35077..2f37088 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/decoration_helpers/DividerDecorationHelper.java
@@ -1,9 +1,9 @@
package com.omega_r.libs.omegarecyclerview.item_decoration.decoration_helpers;
import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
import static com.omega_r.libs.omegarecyclerview.item_decoration.DividerItemDecoration.Orientation;
@@ -46,6 +46,14 @@ public static DividerDecorationHelper getHelper(int orientation, RecyclerView pa
public abstract int getEnd(Rect rect);
+ public abstract void setOtherStart(Rect rect, int start);
+
+ public abstract void setOtherEnd(Rect rect, int end);
+
+ public abstract int getOtherStart(Rect rect);
+
+ public abstract int getOtherEnd(Rect rect);
+
public int getOffset(int offset) {
return offset;
}
@@ -78,6 +86,26 @@ public int getEnd(Rect rect) {
return rect.bottom;
}
+ @Override
+ public void setOtherStart(Rect rect, int start) {
+ rect.left = start;
+ }
+
+ @Override
+ public void setOtherEnd(Rect rect, int end) {
+ rect.right = end;
+ }
+
+ @Override
+ public int getOtherStart(Rect rect) {
+ return rect.left;
+ }
+
+ @Override
+ public int getOtherEnd(Rect rect) {
+ return rect.right;
+ }
+
}
class ReverseVerticalDividerDecorationHelper extends DividerDecorationHelper {
@@ -106,6 +134,26 @@ public int getEnd(Rect rect) {
return rect.top;
}
+ @Override
+ public void setOtherStart(Rect rect, int start) {
+ rect.right = start;
+ }
+
+ @Override
+ public void setOtherEnd(Rect rect, int end) {
+ rect.left = end;
+ }
+
+ @Override
+ public int getOtherStart(Rect rect) {
+ return rect.right;
+ }
+
+ @Override
+ public int getOtherEnd(Rect rect) {
+ return rect.left;
+ }
+
@Override
public int getOffset(int offset) {
return -offset;
@@ -139,6 +187,26 @@ public int getEnd(Rect rect) {
return rect.right;
}
+ @Override
+ public void setOtherStart(Rect rect, int start) {
+ rect.top = start;
+ }
+
+ @Override
+ public void setOtherEnd(Rect rect, int end) {
+ rect.bottom = end;
+ }
+
+ @Override
+ public int getOtherStart(Rect rect) {
+ return rect.top;
+ }
+
+ @Override
+ public int getOtherEnd(Rect rect) {
+ return rect.bottom;
+ }
+
}
class ReverseHorizontalDividerDecorationHelper extends DividerDecorationHelper {
@@ -167,6 +235,26 @@ public int getEnd(Rect rect) {
return rect.left;
}
+ @Override
+ public void setOtherStart(Rect rect, int start) {
+ rect.bottom = start;
+ }
+
+ @Override
+ public void setOtherEnd(Rect rect, int end) {
+ rect.top = end;
+ }
+
+ @Override
+ public int getOtherStart(Rect rect) {
+ return rect.bottom;
+ }
+
+ @Override
+ public int getOtherEnd(Rect rect) {
+ return rect.top;
+ }
+
@Override
public int getOffset(int offset) {
return -offset;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/OnPageRequestListener.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/OnPageRequestListener.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/OnPageRequestListener.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/OnPageRequestListener.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java
similarity index 95%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java
index c9c8572..e755d49 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PageRequester.java
@@ -1,8 +1,8 @@
package com.omega_r.libs.omegarecyclerview.pagination;
import android.graphics.Rect;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
public class PageRequester extends RecyclerView.ItemDecoration {
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java
similarity index 98%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java
index 4813fcd..c97d7e7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationAdapter.java
@@ -1,7 +1,7 @@
package com.omega_r.libs.omegarecyclerview.pagination;
-import android.support.annotation.LayoutRes;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.LayoutRes;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java
similarity index 89%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java
index 90dca01..195d43f 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/PaginationViewCreator.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview.pagination;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java
similarity index 98%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java
index ffc7784..e1fc1e7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/pagination/WrapperAdapter.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview.pagination;
-import android.support.v7.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView;
import android.view.ViewGroup;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/BaseStickyDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/BaseStickyDecoration.java
new file mode 100644
index 0000000..031d1fc
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/BaseStickyDecoration.java
@@ -0,0 +1,40 @@
+package com.omega_r.libs.omegarecyclerview.sticky_decoration;
+
+import android.view.MotionEvent;
+
+import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+@SuppressWarnings("rawtypes")
+public abstract class BaseStickyDecoration extends RecyclerView.ItemDecoration {
+
+ public static final long NO_STICKY_ID = -1L;
+
+ @Nullable
+ protected StickyAdapter mStickyAdapter;
+ protected int mItemSpace;
+
+ public BaseStickyDecoration(@Nullable StickyAdapter adapter) {
+ mStickyAdapter = adapter;
+ }
+
+ public boolean onTouchEvent(@NonNull RecyclerView parent, @NonNull MotionEvent ev, boolean defaultResult) {
+ return defaultResult;
+ }
+
+ @CallSuper
+ public final void setStickyAdapter(@Nullable StickyAdapter adapter) {
+ mStickyAdapter = adapter;
+ }
+
+ public final void setItemSpace(int itemSpace) {
+ mItemSpace = itemSpace;
+ }
+
+ protected final boolean hasSticker(int position) {
+ return mStickyAdapter != null && mStickyAdapter.getStickyId(position) != NO_STICKY_ID;
+ }
+
+}
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/HeaderStickyDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/HeaderStickyDecoration.java
new file mode 100644
index 0000000..0c407ce
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/HeaderStickyDecoration.java
@@ -0,0 +1,87 @@
+package com.omega_r.libs.omegarecyclerview.sticky_decoration;
+
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+import static com.omega_r.libs.omegarecyclerview.utils.ViewUtils.isReverseLayout;
+
+@SuppressWarnings("rawtypes")
+public class HeaderStickyDecoration extends StickyDecoration {
+
+ public HeaderStickyDecoration(StickyAdapter adapter) {
+ super(adapter);
+ }
+
+ @Override
+ public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
+ @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+ super.getItemOffsets(outRect, view, parent, state);
+ RecyclerView.Adapter adapter = parent.getAdapter();
+ if (adapter == null) return;
+
+ int position = parent.getChildAdapterPosition(view);
+ int topOffset = 0;
+ if (position != RecyclerView.NO_POSITION && hasSticker(position)
+ && showHeaderAboveItem(parent, position)) {
+
+ RecyclerView.ViewHolder stickyHolder = getStickyHolder(parent, position);
+ if(stickyHolder != null) {
+ View header = stickyHolder.itemView;
+ topOffset = header.getHeight();
+ if (isReverseLayout(parent)) {
+ if (position != adapter.getItemCount() - 1) topOffset -= mItemSpace;
+ } else {
+ if (position != 0) {
+ if (mItemSpace > topOffset) {
+ topOffset = 0;
+ } else {
+ topOffset -= mItemSpace;
+ }
+ }
+ }
+ }
+ }
+ outRect.set(0, topOffset, 0, 0);
+ }
+
+ private boolean showHeaderAboveItem(@NonNull RecyclerView parent, int position) {
+ if (mStickyAdapter == null) return false;
+ RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
+ if (layoutManager == null) return false;
+
+ if (isReverseLayout(parent)) {
+ int itemCount = layoutManager.getItemCount();
+ return position == (itemCount - 1) || mStickyAdapter.getStickyId(position + 1)
+ != mStickyAdapter.getStickyId(position);
+ } else {
+ return position == 0 || mStickyAdapter.getStickyId(position - 1)
+ != mStickyAdapter.getStickyId(position);
+ }
+ }
+
+ @Override
+ int getOffset(@Nullable RecyclerView.ViewHolder stickyHolder, int stickerHeight, View next) {
+ if (stickyHolder == null) return 0;
+ return ((int) next.getY()) - (stickerHeight + stickyHolder.itemView.getHeight());
+ }
+
+ @Override
+ protected int getStickerTop(boolean isReverseLayout, View child, View sticker, int layoutPos) {
+ int stickerHeight = sticker.getHeight();
+
+ int topMargin = 0;
+ ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
+ if (layoutParams instanceof ViewGroup.MarginLayoutParams) {
+ topMargin = ((ViewGroup.MarginLayoutParams) layoutParams).topMargin;
+ }
+
+ if (layoutPos == 0) stickerHeight = Math.max(stickerHeight, mItemSpace);
+ return (int) Math.max(0, child.getY() - stickerHeight - topMargin);
+ }
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/MiddleStickyDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/MiddleStickyDecoration.java
new file mode 100644
index 0000000..fce4808
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/MiddleStickyDecoration.java
@@ -0,0 +1,29 @@
+package com.omega_r.libs.omegarecyclerview.sticky_decoration;
+
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class MiddleStickyDecoration extends StickyDecoration {
+
+ public MiddleStickyDecoration(@NonNull StickyAdapter adapter) {
+ super(adapter);
+ }
+
+ @Override
+ protected int getStickerTop(boolean isReverseLayout, View child, View sticker, int layoutPos) {
+ int top = (int) child.getY();
+ if (!isReverseLayout && layoutPos == 0 && top > 0) {
+ return Math.max(0, top - mItemSpace);
+ }
+ return Math.max(0, top);
+ }
+
+ @Override
+ int getOffset(@Nullable RecyclerView.ViewHolder stickyHolder, int stickerHeight, View next) {
+ return (int) (next.getY() - stickerHeight);
+ }
+
+}
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyAdapter.java
new file mode 100644
index 0000000..6cc72f6
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyAdapter.java
@@ -0,0 +1,23 @@
+package com.omega_r.libs.omegarecyclerview.sticky_decoration;
+
+import androidx.recyclerview.widget.RecyclerView;
+import android.view.ViewGroup;
+
+public interface StickyAdapter {
+
+ long getStickyId(int position);
+
+ T onCreateStickyViewHolder(ViewGroup parent);
+
+ void onBindStickyViewHolder(T viewHolder, int position);
+
+ void onClickStickyViewHolder(long id);
+
+ interface Mode {
+
+ int HEADER = 0;
+ int MIDDLE = 1;
+
+ }
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyDecoration.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyDecoration.java
new file mode 100644
index 0000000..935ed89
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_decoration/StickyDecoration.java
@@ -0,0 +1,235 @@
+package com.omega_r.libs.omegarecyclerview.sticky_decoration;
+
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static androidx.recyclerview.widget.RecyclerView.NO_POSITION;
+import static com.omega_r.libs.omegarecyclerview.utils.ViewUtils.isReverseLayout;
+import static java.lang.Math.abs;
+
+@SuppressWarnings("rawtypes")
+abstract class StickyDecoration extends BaseStickyDecoration {
+
+ private static final float CLICK_MOVE_BIAS = 150;
+
+ private final Map mStickyRectMap = new HashMap<>();
+ private long mClickedStickyId = NO_STICKY_ID;
+ private float mActionDownX;
+ private float mActionDownY;
+
+ public StickyDecoration(@Nullable StickyAdapter adapter) {
+ super(adapter);
+ }
+
+ @Override
+ public final boolean onTouchEvent(@NonNull RecyclerView parent, @NonNull MotionEvent ev, boolean defaultResult) {
+ if (mStickyAdapter == null) return defaultResult;
+
+ RecyclerView.Adapter adapter = parent.getAdapter();
+ if (adapter == null || adapter.getItemCount() == 0) return defaultResult;
+
+ switch (ev.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mActionDownX = ev.getX();
+ mActionDownY = ev.getY();
+ mClickedStickyId = NO_STICKY_ID;
+ return handleActionDown(parent, ev, defaultResult);
+ case MotionEvent.ACTION_UP:
+ if (mStickyAdapter != null && mClickedStickyId != NO_STICKY_ID) {
+ float eventX = ev.getX();
+ float eventY = ev.getY();
+ if (abs(mActionDownX - eventX) <= CLICK_MOVE_BIAS && abs(mActionDownY - eventY) <= CLICK_MOVE_BIAS) {
+ mStickyAdapter.onClickStickyViewHolder(mClickedStickyId);
+ }
+ }
+ break;
+ }
+ return super.onTouchEvent(parent, ev, defaultResult);
+ }
+
+ private boolean handleActionDown(@NonNull RecyclerView parent, @NonNull final MotionEvent ev, boolean defaultResult) {
+ int eventX = (int) ev.getX();
+ int eventY = (int) ev.getY();
+ for (Long stickyId : mStickyRectMap.keySet()) {
+ Rect rect = mStickyRectMap.get(stickyId);
+ if (stickyId != NO_STICKY_ID && rect != null && !rect.isEmpty() && rect.contains(eventX, eventY)) {
+ mClickedStickyId = stickyId;
+ return true;
+ }
+ }
+ return defaultResult;
+ }
+
+ @Override
+ public final void onDrawOver(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+ super.onDrawOver(canvas, parent, state);
+ invalidateRectMap();
+
+ int count = parent.getChildCount();
+ long previousStickerId = -1;
+ if (isReverseLayout(parent)) {
+ for (int layoutPos = count - 1; layoutPos >= 0; layoutPos--) {
+ previousStickerId = calculateStickerIdAndDrawIt(canvas, parent, true, layoutPos, previousStickerId);
+ }
+ } else {
+ for (int layoutPos = 0; layoutPos < count; layoutPos++) {
+ previousStickerId = calculateStickerIdAndDrawIt(canvas, parent, false, layoutPos, previousStickerId);
+ }
+ }
+ }
+
+ private void invalidateRectMap() {
+ for (Rect rect : mStickyRectMap.values()) {
+ rect.setEmpty();
+ }
+ }
+
+ private long calculateStickerIdAndDrawIt(Canvas canvas, RecyclerView parent, boolean isReverseLayout,
+ int layoutPos, long previousStickerId) {
+ long previousId = previousStickerId;
+ View childView = parent.getChildAt(layoutPos);
+ int adapterPosition = parent.getChildAdapterPosition(childView);
+
+ if (mStickyAdapter != null && adapterPosition != RecyclerView.NO_POSITION && hasSticker(adapterPosition)) {
+ long currentStickerId = mStickyAdapter.getStickyId(adapterPosition);
+
+ if (currentStickerId != previousId) {
+ RecyclerView.ViewHolder stickyHolder = getStickyHolder(parent, adapterPosition);
+ previousId = currentStickerId;
+
+ if (stickyHolder != null) {
+ View stickerView = stickyHolder.itemView;
+ int top = getStickerTop(isReverseLayout, childView, stickerView, layoutPos + 1);
+
+ long previousStickyId = adapterPosition == 0 ? currentStickerId : mStickyAdapter.getStickyId(adapterPosition - 1);
+
+ if (layoutPos == 0 && top > 0 && adapterPosition > 0
+ && hasSticker(adapterPosition - 1)
+ && previousStickyId != currentStickerId) {
+
+ RecyclerView.ViewHolder previousStickyViewHolder = getStickyHolder(parent, adapterPosition - 1);
+
+ if (previousStickyViewHolder != null) {
+ int previousTop = top - previousStickyViewHolder.itemView.getHeight();
+ if (previousTop > 0) previousTop = 0;
+ drawSticky(canvas, childView, previousStickyViewHolder, previousTop);
+ drawSticky(canvas, childView, stickyHolder, top);
+ }
+ } else {
+ top = getStickerTop(parent, isReverseLayout, childView, stickerView, adapterPosition, layoutPos);
+ drawSticky(canvas, childView, stickyHolder, top);
+ updateStickerRect(previousId, top, stickerView);
+ }
+ }
+ }
+ }
+ return previousId;
+ }
+
+ private void updateStickerRect(long stickyId, int stickerTop, View stickerView) {
+ Rect rect = mStickyRectMap.get(stickyId);
+ if (rect == null) {
+ rect = new Rect();
+ mStickyRectMap.put(stickyId, rect);
+ }
+ rect.set(stickerView.getLeft(), stickerTop, stickerView.getRight(), stickerTop + stickerView.getHeight());
+ }
+
+ private void drawSticky(Canvas canvas, View childView, RecyclerView.ViewHolder stickyHolder, int top) {
+ if (stickyHolder == null) return;
+
+ View stickerView = stickyHolder.itemView;
+ canvas.save();
+ int left = childView.getLeft();
+ canvas.translate(left, top);
+
+ stickerView.setTranslationX(left);
+ stickerView.setTranslationY(top);
+ stickerView.draw(canvas);
+ canvas.restore();
+ }
+
+ private int getStickerTop(RecyclerView parent, boolean isReverseLayout, View child, View sticker, int adapterPos, int layoutPos) {
+ int childCount = parent.getChildCount();
+ int stickerHeight = sticker.getHeight();
+ if (mStickyAdapter != null) {
+ long currentStickerId = mStickyAdapter.getStickyId(adapterPos);
+
+ if (isReverseLayout && layoutPos == childCount - 1) {
+ for (int i = childCount - 1; i >= 1; i--) {
+ int offset = calculateOffset(parent, stickerHeight, currentStickerId, i);
+ if (offset < 0) {
+ return offset;
+ }
+ }
+ } else if (!isReverseLayout && layoutPos == 0) {
+ for (int i = 1; i < childCount; i++) {
+ int offset = calculateOffset(parent, stickerHeight, currentStickerId, i);
+ if (offset < 0) {
+ return offset;
+ }
+ }
+ }
+ }
+ return getStickerTop(isReverseLayout, child, sticker, layoutPos);
+ }
+
+ abstract int getStickerTop(boolean isReverseLayout, View child, View sticker, int layoutPos);
+
+ private int calculateOffset(@NonNull RecyclerView parent, int stickerHeight, long currentStickyId, int nextPosition) {
+ int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(nextPosition));
+ if (mStickyAdapter != null && adapterPosHere != RecyclerView.NO_POSITION) {
+ long nextId = mStickyAdapter.getStickyId(adapterPosHere);
+ if (nextId != currentStickyId && nextId != NO_STICKY_ID) {
+ View next = parent.getChildAt(nextPosition);
+ RecyclerView.ViewHolder stickyHolder = getStickyHolder(parent, adapterPosHere);
+ return getOffset(stickyHolder, stickerHeight, next);
+ }
+ }
+ return 0;
+ }
+
+ abstract int getOffset(@Nullable RecyclerView.ViewHolder stickyHolder, int stickerHeight, View next);
+
+ @Nullable
+ RecyclerView.ViewHolder getStickyHolder(RecyclerView parent, int position) {
+ if (mStickyAdapter == null) return null;
+ RecyclerView.ViewHolder holder = mStickyAdapter.onCreateStickyViewHolder(parent);
+ View header = holder.itemView;
+
+ //noinspection unchecked
+ mStickyAdapter.onBindStickyViewHolder(holder, position);
+
+ int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getMeasuredWidth(), getMeasureStickerWidthMode());
+ int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getMeasuredHeight(), getMeasureStickerHeightMode());
+
+ int childWidth = ViewGroup.getChildMeasureSpec(widthSpec,
+ parent.getPaddingLeft() + parent.getPaddingRight(), header.getLayoutParams().width);
+ int childHeight = ViewGroup.getChildMeasureSpec(heightSpec,
+ parent.getPaddingTop() + parent.getPaddingBottom(), header.getLayoutParams().height);
+
+ header.measure(childWidth, childHeight);
+ header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());
+
+ return holder;
+ }
+
+ protected int getMeasureStickerWidthMode() {
+ return View.MeasureSpec.EXACTLY;
+ }
+
+ protected int getMeasureStickerHeightMode() {
+ return View.MeasureSpec.UNSPECIFIED;
+ }
+
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeDirection.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeDirection.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeDirection.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeDirection.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java
similarity index 88%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java
index 08ae773..2d874b9 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeHorizontalMenuLayout.java
@@ -1,15 +1,17 @@
package com.omega_r.libs.omegarecyclerview.swipe_menu;
import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v4.view.ViewCompat;
+
+import androidx.annotation.NonNull;
+import androidx.core.view.ViewCompat;
+
+import android.graphics.Canvas;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewParent;
-import com.omega_r.libs.omegarecyclerview.swipe_menu.listener.SwipeSwitchListener;
+
import com.omega_r.libs.omegarecyclerview.swipe_menu.swiper.LeftHorizontalSwiper;
import com.omega_r.libs.omegarecyclerview.swipe_menu.swiper.RightHorizontalSwiper;
import com.omega_r.libs.omegarecyclerview.swipe_menu.swiper.Swiper;
@@ -23,6 +25,7 @@ public class SwipeHorizontalMenuLayout extends SwipeMenuLayout {
private boolean mDownMenuOpen;
private boolean isLeftSwipeEnabled = true;
private boolean isRightSwipeEnabled = true;
+ private boolean mFixedPositionMenuEnabled;
public SwipeHorizontalMenuLayout(Context context) {
super(context);
@@ -50,6 +53,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) {
case MotionEvent.ACTION_MOVE:
int disX = (int) (ev.getX() - mDownX);
int disY = (int) (ev.getY() - mDownY);
+ mLastX = (int) ev.getX();
isIntercepted = Math.abs(disX) > mScaledTouchSlop && Math.abs(disX) > Math.abs(disY);
break;
case MotionEvent.ACTION_UP:
@@ -90,17 +94,13 @@ public boolean onTouchEvent(MotionEvent ev) {
if (eventX > mLastX && !isLeftSwipeEnabled && !isNotInPlace()) break;
int disX = (int) (mLastX - ev.getX());
- int disY = (int) (mLastY - ev.getY());
- if (!mDragging
- && Math.abs(disX) > mScaledTouchSlop
- && Math.abs(disX) > Math.abs(disY)) {
+ if (!mDragging) {
ViewParent parent = getParent();
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
mDragging = true;
- }
- if (mDragging) {
+ } else {
if (mCurrentSwiper == null || shouldResetSwiper) {
if (disX < 0) {
if (mBeginSwiper != null)
@@ -333,9 +333,9 @@ public void smoothCloseMenu(int duration) {
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (mContentView == null) return;
- int parentViewWidth = ViewCompat.getMeasuredWidthAndState(this);
- int contentViewWidth = ViewCompat.getMeasuredWidthAndState(mContentView);
- int contentViewHeight = ViewCompat.getMeasuredHeightAndState(mContentView);
+ int parentViewWidth = getMeasuredWidthAndState();
+ int contentViewWidth = mContentView.getMeasuredWidthAndState();
+ int contentViewHeight = mContentView.getMeasuredHeightAndState();
LayoutParams lp = (LayoutParams) mContentView.getLayoutParams();
int lGap = getPaddingLeft() + lp.leftMargin;
int tGap = getPaddingTop() + lp.topMargin;
@@ -346,8 +346,8 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
tGap + contentViewHeight);
if (mEndSwiper != null) {
- int menuViewWidth = ViewCompat.getMeasuredWidthAndState(mEndSwiper.getMenuView());
- int menuViewHeight = ViewCompat.getMeasuredHeightAndState(mEndSwiper.getMenuView());
+ int menuViewWidth = mEndSwiper.getMenuView().getMeasuredWidthAndState();
+ int menuViewHeight = mEndSwiper.getMenuView().getMeasuredHeightAndState();
lp = (LayoutParams) mEndSwiper.getMenuView().getLayoutParams();
tGap = getPaddingTop() + lp.topMargin;
mEndSwiper.getMenuView().layout(parentViewWidth,
@@ -357,8 +357,8 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
if (mBeginSwiper != null) {
- int menuViewWidth = ViewCompat.getMeasuredWidthAndState(mBeginSwiper.getMenuView());
- int menuViewHeight = ViewCompat.getMeasuredHeightAndState(mBeginSwiper.getMenuView());
+ int menuViewWidth = mBeginSwiper.getMenuView().getMeasuredWidthAndState();
+ int menuViewHeight = mBeginSwiper.getMenuView().getMeasuredHeightAndState();
lp = (LayoutParams) mBeginSwiper.getMenuView().getLayoutParams();
tGap = getPaddingTop() + lp.topMargin;
mBeginSwiper.getMenuView().layout(-menuViewWidth,
@@ -402,4 +402,33 @@ public void setSwipeEnable(SwipeDirection direction, boolean swipeEnable) {
}
}
+ public void setFixedPositionMenuEnabled(boolean enabled) {
+ mFixedPositionMenuEnabled = enabled;
+ }
+
+ @Override
+ protected void onScrollChanged(int l, int t, int oldl, int oldt) {
+ super.onScrollChanged(l, t, oldl, oldt);
+ if (mFixedPositionMenuEnabled) {
+ if (mBeginSwiper != null) {
+ mBeginSwiper.getMenuView().setTranslationX(l == 0 ? 0 : mBeginSwiper.getMenuView().getWidth() + l);
+ }
+ if (mEndSwiper != null) {
+ mEndSwiper.getMenuView().setTranslationX(l == 0 ? 0 : -mEndSwiper.getMenuView().getWidth() + l);
+ }
+ }
+ }
+
+ @Override
+ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+ if (mFixedPositionMenuEnabled) {
+ int saveCount = canvas.save();
+ canvas.clipRect(child.getLeft(), child.getTop(), child.getRight(), child.getBottom());
+ boolean result = super.drawChild(canvas, child, drawingTime);
+ canvas.restoreToCount(saveCount);
+ return result;
+ } else {
+ return super.drawChild(canvas, child, drawingTime);
+ }
+ }
}
\ No newline at end of file
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java
similarity index 58%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java
index 03ddbe8..6447cd7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java
@@ -1,11 +1,11 @@
package com.omega_r.libs.omegarecyclerview.swipe_menu;
-import android.content.Context;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
import android.view.ViewGroup;
+import androidx.annotation.Nullable;
+
import java.util.ArrayList;
import java.util.List;
@@ -13,19 +13,29 @@ public class SwipeMenuHelper {
private static final int INVALID_POSITION = -1;
- private Callback mCallback;
-
+ private final Callback mCallback;
+ @Nullable
private SwipeHorizontalMenuLayout mOldSwipedView;
-
private int mOldTouchedPosition = INVALID_POSITION;
- public SwipeMenuHelper(Context context, Callback callback) {
+ public SwipeMenuHelper(Callback callback) {
mCallback = callback;
- ViewConfiguration.get(context);
}
- public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercepted) {
- boolean isIntercepted = defaultIntercepted;
+ public boolean handleTouchEventForSecurity(MotionEvent ev, boolean defaultResult) {
+ if (mOldSwipedView == null ||
+ ev.getActionIndex() == 0 ||
+ ev.getActionMasked() != MotionEvent.ACTION_POINTER_DOWN) return defaultResult;
+
+ int pointerId = ev.getPointerId(ev.getActionIndex());
+ SwipeHorizontalMenuLayout touchingView = getTouchingView(ev.getX(pointerId), ev.getY(pointerId));
+ return mOldSwipedView.equals(touchingView) && defaultResult;
+ }
+
+ public boolean handleInterceptTouchEvent(MotionEvent ev, boolean defaultResult) {
+ if (ev.getActionIndex() != 0 || ev.getAction() != MotionEvent.ACTION_DOWN) return defaultResult;
+
+ boolean isIntercepted = defaultResult;
View touchingView = findChildViewUnder((int) ev.getX(), (int) ev.getY());
int touchingPosition;
@@ -42,16 +52,11 @@ public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercept
}
}
- touchingView = mCallback.transformTouchView(touchingPosition, touchingView);
-
- if (touchingView instanceof ViewGroup) {
- View itemView = getSwipeMenuView((ViewGroup) touchingView);
- if (itemView instanceof SwipeHorizontalMenuLayout) {
- mOldSwipedView = (SwipeHorizontalMenuLayout) itemView;
- mOldTouchedPosition = touchingPosition;
- }
+ touchingView = extractSwipeMenuView(mCallback.transformTouchView(touchingPosition, touchingView));
+ if (touchingView != null) {
+ mOldSwipedView = (SwipeHorizontalMenuLayout) touchingView;
+ mOldTouchedPosition = touchingPosition;
}
-
if (isIntercepted) {
mOldSwipedView = null;
mOldTouchedPosition = INVALID_POSITION;
@@ -60,21 +65,28 @@ public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercept
return isIntercepted;
}
- private View getSwipeMenuView(ViewGroup itemView) {
- if (itemView instanceof SwipeHorizontalMenuLayout) {
- return itemView;
+ private SwipeHorizontalMenuLayout getTouchingView(float eventX, float eventY) {
+ View touchingView = findChildViewUnder(eventX, eventY);
+ if (touchingView != null) {
+ int touchingPosition = mCallback.getPositionForView(touchingView);
+ touchingView = mCallback.transformTouchView(touchingPosition, touchingView);
}
+ return extractSwipeMenuView(touchingView);
+ }
+
+ @Nullable
+ private SwipeHorizontalMenuLayout extractSwipeMenuView(@Nullable View view) {
+ if (view instanceof SwipeHorizontalMenuLayout) return (SwipeHorizontalMenuLayout) view;
List unvisited = new ArrayList<>();
- unvisited.add(itemView);
+ if (view != null) unvisited.add(view);
while (!unvisited.isEmpty()) {
View child = unvisited.remove(0);
+ if (child instanceof SwipeHorizontalMenuLayout) return (SwipeHorizontalMenuLayout) child;
if (!(child instanceof ViewGroup)) continue;
- if (child instanceof SwipeHorizontalMenuLayout) return child;
-
ViewGroup group = (ViewGroup) child;
int childCount = group.getChildCount();
@@ -83,7 +95,7 @@ private View getSwipeMenuView(ViewGroup itemView) {
}
}
- return itemView;
+ return null;
}
private View findChildViewUnder(float x, float y) {
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java
similarity index 97%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java
index 1fddcaf..ead6dc5 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuLayout.java
@@ -1,14 +1,13 @@
package com.omega_r.libs.omegarecyclerview.swipe_menu;
import android.content.Context;
-import android.content.res.TypedArray;
-import android.support.annotation.Nullable;
+
+import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
-import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import android.widget.OverScroller;
@@ -18,7 +17,6 @@
import java.text.NumberFormat;
import java.util.Locale;
-import com.omega_r.libs.omegarecyclerview.R;
import com.omega_r.libs.omegarecyclerview.swipe_menu.listener.SwipeFractionListener;
import com.omega_r.libs.omegarecyclerview.swipe_menu.listener.SwipeSwitchListener;
import com.omega_r.libs.omegarecyclerview.swipe_menu.swiper.Swiper;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java
similarity index 96%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java
index 8fddfaa..e77903a 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeViewHolder.java
@@ -1,13 +1,11 @@
package com.omega_r.libs.omegarecyclerview.swipe_menu;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import android.widget.LinearLayout;
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.libs.omegarecyclerview.swipe_menu.listener.SwipeFractionListener;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeFractionListener.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeFractionListener.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeFractionListener.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeFractionListener.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeSwitchListener.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeSwitchListener.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeSwitchListener.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/listener/SwipeSwitchListener.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/LeftHorizontalSwiper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/LeftHorizontalSwiper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/LeftHorizontalSwiper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/LeftHorizontalSwiper.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/RightHorizontalSwiper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/RightHorizontalSwiper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/RightHorizontalSwiper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/RightHorizontalSwiper.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/Swiper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/Swiper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/Swiper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/swiper/Swiper.java
diff --git a/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/utils/ViewUtils.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/utils/ViewUtils.java
new file mode 100644
index 0000000..36ac6dc
--- /dev/null
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/utils/ViewUtils.java
@@ -0,0 +1,19 @@
+package com.omega_r.libs.omegarecyclerview.utils;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class ViewUtils {
+
+ public static boolean isReverseLayout(@Nullable RecyclerView recyclerView) {
+ if (recyclerView == null) return false;
+ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
+ if (layoutManager == null) return false;
+ if (layoutManager instanceof LinearLayoutManager) {
+ return ((LinearLayoutManager) layoutManager).getReverseLayout();
+ }
+ return false;
+ }
+
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/DefaultPagerAdapter.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/DefaultPagerAdapter.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/DefaultPagerAdapter.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/DefaultPagerAdapter.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/Direction.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/Direction.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/Direction.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/Direction.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java
similarity index 98%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java
index 0979bdd..cb3c8d8 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/OmegaPagerRecyclerView.java
@@ -3,12 +3,12 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.ViewPager;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.viewpager.widget.ViewPager;
+import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Interpolator;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java
similarity index 91%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java
index 26cc28d..e8e5f6c 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/ViewPagerLayoutManager.java
@@ -7,14 +7,14 @@
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Parcelable;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityRecordCompat;
-import android.support.v7.widget.LinearSmoothScroller;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.accessibility.AccessibilityEventCompat;
+import androidx.core.view.accessibility.AccessibilityRecordCompat;
+import androidx.recyclerview.widget.LinearSmoothScroller;
+import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.view.View;
@@ -28,9 +28,11 @@
import com.omega_r.libs.omegarecyclerview.viewpager.orientation.VerticalHelper;
import com.omega_r.libs.omegarecyclerview.viewpager.transform.ItemTransformer;
-import static android.support.v7.widget.RecyclerView.HORIZONTAL;
-import static android.support.v7.widget.RecyclerView.NO_POSITION;
-import static android.support.v7.widget.RecyclerView.VERTICAL;
+import static android.view.View.MeasureSpec.UNSPECIFIED;
+import static androidx.recyclerview.widget.RecyclerView.HORIZONTAL;
+import static androidx.recyclerview.widget.RecyclerView.NO_POSITION;
+import static androidx.recyclerview.widget.RecyclerView.UNDEFINED_DURATION;
+import static androidx.recyclerview.widget.RecyclerView.VERTICAL;
public class ViewPagerLayoutManager extends RecyclerView.LayoutManager {
@@ -87,6 +89,9 @@ public class ViewPagerLayoutManager extends RecyclerView.LayoutManager {
private int mOrientation;
private boolean mIsInfinite;
+ private int mHeight;
+ private int mWidth;
+
ViewPagerLayoutManager(@NonNull Context context,
@Nullable AttributeSet attrs, int defStyleAttr,
@NonNull ScrollStateListener scrollStateListener) {
@@ -117,6 +122,8 @@ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State
mCurrentPosition = mPendingPosition = NO_POSITION;
mScrolled = mPendingScroll = 0;
return;
+ } else if (!mIsInfinite && state.getItemCount() <= mCurrentPosition) {
+ mCurrentPosition = NO_POSITION;
}
if (mCurrentPosition == NO_POSITION) {
mCurrentPosition = calculateFirstPosition();
@@ -126,6 +133,8 @@ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State
if (mIsFirstOrEmptyLayout) {
initChildDimensions(recycler);
}
+ } else if (mHeight != getHeight() || mWidth != getWidth()) {
+ initChildDimensions(recycler);
}
updateRecyclerDimensions();
detachAndScrapAttachedViews(recycler);
@@ -145,6 +154,8 @@ public void onLayoutCompleted(RecyclerView.State state) {
}
private void initChildDimensions(RecyclerView.Recycler recycler) {
+ mWidth = getWidth();
+ mHeight = getHeight();
View viewToMeasure = getMeasuredChildForAdapterPosition(0, recycler);
int childViewWidth = getMeasuredWidthWithMargin(viewToMeasure);
@@ -188,8 +199,8 @@ private View getMeasuredChildForAdapterPosition(int position, RecyclerView.Recyc
View view = recycler.getViewForPosition(calculateRealPosition(position));
addView(view);
- int width = getWidth();
- int height = getHeight();
+ int width = getWidth() - getPaddingLeft() - getPaddingRight();
+ int height = getHeight() - getPaddingTop() - getPaddingBottom();
switch (mOrientation) {
case HORIZONTAL:
width *= mPageSize;
@@ -199,8 +210,23 @@ private View getMeasuredChildForAdapterPosition(int position, RecyclerView.Recyc
break;
}
- final int widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
- final int heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
+ int widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
+ int heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);
+
+ switch (mOrientation) {
+ case HORIZONTAL:
+ int heightMode = getHeightMode();
+ if (heightMode == View.MeasureSpec.AT_MOST || heightMode == UNSPECIFIED) {
+ heightSpec = View.MeasureSpec.makeMeasureSpec(0, UNSPECIFIED);
+ }
+ break;
+ case VERTICAL:
+ int widthMode = getWidthMode();
+ if (widthMode == View.MeasureSpec.AT_MOST || widthMode == UNSPECIFIED) {
+ widthSpec = View.MeasureSpec.makeMeasureSpec(0, UNSPECIFIED);
+ }
+ break;
+ }
measureChildWithDecorationsAndMargin(view, widthSpec, heightSpec);
return view;
}
@@ -234,7 +260,10 @@ private int getMeasuredHeightWithMargin(View child) {
}
private void updateRecyclerDimensions() {
- mRecyclerCenterPoint.set(getWidth() / 2, getHeight() / 2);
+ mRecyclerCenterPoint.set(
+ (getWidth() + getPaddingLeft() - getPaddingRight()) / 2,
+ (getHeight() + getPaddingTop() - getPaddingBottom()) / 2
+ );
}
private void fill(RecyclerView.Recycler recycler) {
@@ -242,7 +271,11 @@ private void fill(RecyclerView.Recycler recycler) {
mOrientationHelper.setCurrentViewCenter(mRecyclerCenterPoint, mScrolled, mCurrentViewCenterPoint);
- final int endBound = mOrientationHelper.getViewEnd(getWidth(), getHeight());
+ final int endBound = getClipToPadding() ?
+ mOrientationHelper.getViewEnd(
+ getWidth() - getPaddingRight(),
+ getHeight() - getPaddingBottom())
+ : mOrientationHelper.getViewEnd(getWidth(), getHeight());
if (mScrolled >= 0) {
layoutViews(recycler, Direction.START, endBound); //Layout items before the current item
@@ -428,6 +461,9 @@ private int calculateScrollPosition(int position) {
int itemCount = super.getItemCount();
if (mIsInfinite && itemCount != 0) {
int currentWindowPosition = mCurrentPosition / itemCount;
+ if (mCurrentPosition > position + (currentWindowPosition * itemCount)) {
+ currentWindowPosition++;
+ }
return currentWindowPosition * itemCount + position;
}
return position;
@@ -663,8 +699,12 @@ public Parcelable onSaveInstanceState() {
@Override
public void onRestoreInstanceState(Parcelable state) {
- Bundle bundle = (Bundle) state;
- mCurrentPosition = bundle.getInt(KEY_EXTRA_POSITION);
+ if (state instanceof Bundle) {
+ Bundle bundle = (Bundle) state;
+ mCurrentPosition = bundle.getInt(KEY_EXTRA_POSITION);
+ } else {
+ super.onRestoreInstanceState(state);
+ }
}
@Override
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/AccordionTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/AccordionTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/AccordionTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/AccordionTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/BackgroundToForegroundTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/BackgroundToForegroundTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/BackgroundToForegroundTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/BackgroundToForegroundTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeInTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeInTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeInTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeInTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeOutTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeOutTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeOutTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/CubeOutTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/DepthPageTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/DepthPageTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/DepthPageTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/DepthPageTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FadeTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FadeTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FadeTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FadeTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FlipTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FlipTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FlipTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/FlipTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ForegroundToBackgroundTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ForegroundToBackgroundTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ForegroundToBackgroundTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ForegroundToBackgroundTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java
similarity index 98%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java
index e69f7e7..81c22d7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/Pivot.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview.viewpager.default_transformers;
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
import android.view.View;
import java.lang.annotation.Retention;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateDownTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateDownTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateDownTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateDownTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateUpTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateUpTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateUpTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/RotateUpTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java
similarity index 98%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java
index f7b7d62..dcb169a 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ScaleTransformer.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview.viewpager.default_transformers;
-import android.support.annotation.FloatRange;
+import androidx.annotation.FloatRange;
import android.view.View;
import com.omega_r.libs.omegarecyclerview.viewpager.transform.ItemTransformer;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/StackTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/StackTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/StackTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/StackTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/TabletTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/TabletTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/TabletTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/TabletTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomInTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomInTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomInTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomInTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomOutSlideTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomOutSlideTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomOutSlideTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/default_transformers/ZoomOutSlideTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/HorizontalHelper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/HorizontalHelper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/HorizontalHelper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/HorizontalHelper.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/OrientationHelper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/OrientationHelper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/OrientationHelper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/OrientationHelper.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/VerticalHelper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/VerticalHelper.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/VerticalHelper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/orientation/VerticalHelper.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformer.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformer.java
similarity index 100%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformer.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformer.java
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java
similarity index 92%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java
rename to omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java
index bb6b724..ad74bed 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java
+++ b/omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/viewpager/transform/ItemTransformerWrapper.java
@@ -1,6 +1,6 @@
package com.omega_r.libs.omegarecyclerview.viewpager.transform;
-import android.support.v4.view.ViewPager;
+import androidx.viewpager.widget.ViewPager;
import android.view.View;
public class ItemTransformerWrapper implements ItemTransformer {
diff --git a/omegarecyclerviewlibs/src/main/res/drawable/ic_error_omega.xml b/omegarecyclerview/src/main/res/drawable/ic_error_omega.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/drawable/ic_error_omega.xml
rename to omegarecyclerview/src/main/res/drawable/ic_error_omega.xml
diff --git a/omegarecyclerviewlibs/src/main/res/layout/pagination_error_omega_layout.xml b/omegarecyclerview/src/main/res/layout/pagination_error_omega_layout.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/layout/pagination_error_omega_layout.xml
rename to omegarecyclerview/src/main/res/layout/pagination_error_omega_layout.xml
diff --git a/omegarecyclerviewlibs/src/main/res/layout/pagination_omega_layout.xml b/omegarecyclerview/src/main/res/layout/pagination_omega_layout.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/layout/pagination_omega_layout.xml
rename to omegarecyclerview/src/main/res/layout/pagination_omega_layout.xml
diff --git a/omegarecyclerviewlibs/src/main/res/values/attrs.xml b/omegarecyclerview/src/main/res/values/attrs.xml
similarity index 86%
rename from omegarecyclerviewlibs/src/main/res/values/attrs.xml
rename to omegarecyclerview/src/main/res/values/attrs.xml
index 1746493..470d330 100644
--- a/omegarecyclerviewlibs/src/main/res/values/attrs.xml
+++ b/omegarecyclerview/src/main/res/values/attrs.xml
@@ -16,10 +16,14 @@
-
+
+
+
+
+
@@ -27,6 +31,12 @@
+
+
+
+
+
+
@@ -71,6 +81,7 @@
+
diff --git a/omegarecyclerviewlibs/src/main/res/values/ids.xml b/omegarecyclerview/src/main/res/values/ids.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/values/ids.xml
rename to omegarecyclerview/src/main/res/values/ids.xml
diff --git a/omegarecyclerviewlibs/src/main/res/values/integers.xml b/omegarecyclerview/src/main/res/values/integers.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/values/integers.xml
rename to omegarecyclerview/src/main/res/values/integers.xml
diff --git a/omegarecyclerviewlibs/src/main/res/values/strings.xml b/omegarecyclerview/src/main/res/values/strings.xml
similarity index 100%
rename from omegarecyclerviewlibs/src/main/res/values/strings.xml
rename to omegarecyclerview/src/main/res/values/strings.xml
diff --git a/omegarecyclerview_expandable/.gitignore b/omegarecyclerview_expandable/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/omegarecyclerview_expandable/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/omegarecyclerview_expandable/build.gradle b/omegarecyclerview_expandable/build.gradle
new file mode 100644
index 0000000..ca8f491
--- /dev/null
+++ b/omegarecyclerview_expandable/build.gradle
@@ -0,0 +1,48 @@
+apply plugin: 'com.android.library'
+apply plugin: 'maven-publish'
+
+android {
+ compileSdkVersion rootProject.compileSdkVersion
+
+ defaultConfig {
+ minSdkVersion rootProject.minSdkVersion
+ targetSdkVersion rootProject.targetSdkVersion
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+publishing {
+ publications {
+ release(MavenPublication) {
+ groupId 'com.github.Omega-R.OmegaRecyclerView'
+ artifactId project.name
+ version project.hasProperty('version') ? project.version : gradle.gitHash()
+ afterEvaluate {
+ from components.release
+ }
+ }
+ }
+ repositories {
+ maven {
+ url gradle.nexusUrl
+ credentials {
+ username gradle.nexusUsername
+ password gradle.nexusPassword
+ }
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation project(':omegarecyclerview')
+ implementation 'androidx.appcompat:appcompat:' + rootProject.appcompatVersion
+ implementation 'com.google.android.material:material:' + rootProject.materialVersion
+}
+
diff --git a/omegarecyclerview_expandable/consumer-rules.pro b/omegarecyclerview_expandable/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
diff --git a/omegarecyclerview_expandable/proguard-rules.pro b/omegarecyclerview_expandable/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/omegarecyclerview_expandable/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/omegarecyclerview_expandable/src/androidTest/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleInstrumentedTest.java b/omegarecyclerview_expandable/src/androidTest/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..7dd3dc2
--- /dev/null
+++ b/omegarecyclerview_expandable/src/androidTest/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleInstrumentedTest.java
@@ -0,0 +1,27 @@
+package com.omega_r.libs.omegarecyclerview_expandable;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.omega_r.libs.omegarecyclerview_expandable.test", appContext.getPackageName());
+ }
+}
diff --git a/omegarecyclerviewlibs/src/main/AndroidManifest.xml b/omegarecyclerview_expandable/src/main/AndroidManifest.xml
similarity index 50%
rename from omegarecyclerviewlibs/src/main/AndroidManifest.xml
rename to omegarecyclerview_expandable/src/main/AndroidManifest.xml
index fe00fa6..ede94fd 100644
--- a/omegarecyclerviewlibs/src/main/AndroidManifest.xml
+++ b/omegarecyclerview_expandable/src/main/AndroidManifest.xml
@@ -1,4 +1,2 @@
-
-
+ package="com.omega_r.libs.omegarecyclerview_expandable" />
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ChildClippingFrameLayout.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ChildClippingFrameLayout.java
similarity index 91%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ChildClippingFrameLayout.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ChildClippingFrameLayout.java
index 7553519..5a4a4cd 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ChildClippingFrameLayout.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ChildClippingFrameLayout.java
@@ -1,17 +1,18 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view;
+package com.omega_r.libs.omegarecyclerview_expandable;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.RectF;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
import java.util.List;
public class ChildClippingFrameLayout extends FrameLayout {
@@ -26,15 +27,15 @@ public ChildClippingFrameLayout(View contentView) {
super(contentView.getContext());
setWillNotDraw(false);
- addView(contentView);
setupLayoutParams(contentView);
+ addView(contentView);
}
private void setupLayoutParams(@NonNull View contentView) {
MarginLayoutParams contentMarginLp = (MarginLayoutParams) contentView.getLayoutParams();
- FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
- FrameLayout.LayoutParams.MATCH_PARENT,
- FrameLayout.LayoutParams.WRAP_CONTENT);
+ LayoutParams lp = new LayoutParams(
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT);
lp.topMargin = contentMarginLp.topMargin;
lp.bottomMargin = contentMarginLp.bottomMargin;
diff --git a/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableSpaceItemDecoration.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableSpaceItemDecoration.java
new file mode 100644
index 0000000..f935a21
--- /dev/null
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableSpaceItemDecoration.java
@@ -0,0 +1,40 @@
+package com.omega_r.libs.omegarecyclerview_expandable;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.libs.omegarecyclerview.item_decoration.BaseSpaceItemDecoration;
+
+import static com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView.Adapter.VH_TYPE_CHILD;
+import static com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView.Adapter.VH_TYPE_GROUP;
+
+@SuppressWarnings("rawtypes")
+public class ExpandableSpaceItemDecoration extends BaseSpaceItemDecoration {
+
+ private int mGroupItemSpace = 0;
+
+ public ExpandableSpaceItemDecoration(int showDivider, int itemSpace) {
+ super(showDivider, itemSpace);
+ }
+
+ public void setGroupSpace(int groupSpace) {
+ mGroupItemSpace = groupSpace;
+ }
+
+ @Override
+ protected int getItemSpace(@NonNull RecyclerView parent, int position, int itemCount) {
+ RecyclerView.Adapter adapter = parent.getAdapter();
+ if (adapter == null) return super.getItemSpace(parent, position, itemCount);
+
+ int viewType = adapter.getItemViewType(position);
+ switch (viewType) {
+ case VH_TYPE_GROUP:
+ return mGroupItemSpace;
+ case VH_TYPE_CHILD:
+ if (position > 0 && adapter.getItemViewType(position - 1) == VH_TYPE_GROUP) return 0;
+ }
+
+ return super.getItemSpace(parent, position, itemCount);
+ }
+
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ExpandableStickyHeaderDecoration.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableStickyDecoration.java
similarity index 85%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ExpandableStickyHeaderDecoration.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableStickyDecoration.java
index 3bc9720..c92c633 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/ExpandableStickyHeaderDecoration.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/ExpandableStickyDecoration.java
@@ -1,17 +1,18 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view;
+package com.omega_r.libs.omegarecyclerview_expandable;
import android.graphics.Canvas;
import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.util.Pair;
-import android.support.v7.widget.RecyclerView;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderDecoration;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.util.Pair;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.BaseStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
import java.util.ArrayList;
import java.util.Collections;
@@ -20,26 +21,15 @@
import java.util.List;
import java.util.Map;
-public class ExpandableStickyHeaderDecoration extends StickyHeaderDecoration {
+import static com.omega_r.libs.omegarecyclerview.utils.ViewUtils.isReverseLayout;
- private static final int OFFSET_NOT_FOUND = Integer.MIN_VALUE;
- private static final Comparator ASCENDING_COMPARATOR = new Comparator() {
- @Override
- public int compare(Integer o1, Integer o2) {
- return o1.compareTo(o2);
- }
- };
+public class ExpandableStickyDecoration extends BaseStickyDecoration {
- private Rect mViewRect = new Rect();
-
- @Nullable
- private StickyHeaderAdapter mStickyHeaderAdapter;
+ private static final int OFFSET_NOT_FOUND = Integer.MIN_VALUE;
+ private final Rect mViewRect = new Rect();
@Nullable
private OmegaExpandableRecyclerView.Adapter mExpandableAdapter;
-
- private int mItemSpace;
-
private final Map mGroupHeaderHolders = new HashMap<>();
private final Map mStickyHeaderHolders = new HashMap<>();
@@ -47,23 +37,13 @@ public int compare(Integer o1, Integer o2) {
private final SparseArray> mRecyclerViewItemsByAdapterPosition = new SparseArray<>();
private final List mAdapterPositions = new ArrayList<>();
- public ExpandableStickyHeaderDecoration(@Nullable StickyHeaderAdapter adapter,
- @Nullable OmegaExpandableRecyclerView.Adapter expandableAdapter) {
- mStickyHeaderAdapter = adapter;
+ ExpandableStickyDecoration(@Nullable StickyAdapter adapter,
+ @Nullable OmegaExpandableRecyclerView.Adapter expandableAdapter) {
+ super(adapter);
mExpandableAdapter = expandableAdapter;
}
- @Override
- public void setStickyHeaderAdapter(@Nullable StickyHeaderAdapter adapter) {
- mStickyHeaderAdapter = adapter;
- }
-
- @Override
- public void setItemSpace(int itemSpace) {
- mItemSpace = itemSpace;
- }
-
- public void setExpandableAdapter(@Nullable OmegaExpandableRecyclerView.Adapter adapter) {
+ void setExpandableAdapter(@Nullable OmegaExpandableRecyclerView.Adapter adapter) {
mExpandableAdapter = adapter;
}
@@ -80,16 +60,18 @@ public void onDrawOver(@NonNull Canvas canvas, @NonNull RecyclerView parent, @No
mAdapterPositions.add(adapterPosition);
}
- Collections.sort(mAdapterPositions, ASCENDING_COMPARATOR);
+ Collections.sort(mAdapterPositions);
if (isReverseLayout(parent)) {
for (int i = mAdapterPositions.size() - 1; i >= 0; i--) {
Pair foundedView = mRecyclerViewItemsByAdapterPosition.get(mAdapterPositions.get(i));
+ if (foundedView == null || foundedView.first == null || foundedView.second == null) continue;
drawHeadersWithIdUpdate(canvas, parent, foundedView.second, true, foundedView.first, mAdapterPositions.get(i));
}
} else {
for (int i = 0; i < mAdapterPositions.size(); i++) {
Pair foundedView = mRecyclerViewItemsByAdapterPosition.get(mAdapterPositions.get(i));
+ if (foundedView == null || foundedView.first == null || foundedView.second == null) continue;
drawHeadersWithIdUpdate(canvas, parent, foundedView.second, false, foundedView.first, mAdapterPositions.get(i));
}
}
@@ -200,8 +182,8 @@ private void drawHeader(Canvas canvas, RecyclerView.ViewHolder header, int left,
@Nullable
private RecyclerView.ViewHolder findStickyHeaderWithIdUpdate(RecyclerView recyclerView, int adapterPos) {
- if (mStickyHeaderAdapter != null && hasStickyHeader(adapterPos)) {
- long stickyHeaderId = mStickyHeaderAdapter.getHeaderId(adapterPos);
+ if (mStickyAdapter != null && hasSticker(adapterPos)) {
+ long stickyHeaderId = mStickyAdapter.getStickyId(adapterPos);
if (stickyHeaderId != mDrawingInfo.sticky.id) {
RecyclerView.ViewHolder holder = getStickyHeader(recyclerView, adapterPos);
if (holder != null) {
@@ -233,11 +215,11 @@ private RecyclerView.ViewHolder findGroupHeaderWithIdUpdate(RecyclerView recycle
}
private int getStickyHeaderTop(final RecyclerView parent, boolean isReverseLayout, View child, View header, int adapterPos, int layoutPosition) {
- if (mStickyHeaderAdapter == null) return 0;
+ if (mStickyAdapter == null) return 0;
int childCount = parent.getChildCount();
final int headerHeight = header.getHeight();
int top = ((int) child.getY()) - headerHeight;
- final long currentHeaderId = mStickyHeaderAdapter.getHeaderId(adapterPos);
+ final long currentHeaderId = mStickyAdapter.getStickyId(adapterPos);
return calculateTop(isReverseLayout, layoutPosition, childCount, top, new Function() {
@Override
@@ -272,7 +254,8 @@ public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull R
int headerHeight = 0;
if (position != RecyclerView.NO_POSITION) {
- if (mStickyHeaderAdapter != null && hasStickyHeader(position) && showHeaderAboveItem(parent, position)) {
+
+ if (mStickyAdapter != null && hasSticker(position) && showHeaderAboveItem(parent, position)) {
RecyclerView.ViewHolder header = getStickyHeader(parent, position);
if (header != null) {
headerHeight += header.itemView.getHeight() - mItemSpace;
@@ -289,19 +272,19 @@ public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull R
}
private boolean showHeaderAboveItem(RecyclerView parent, int position) {
- if (mStickyHeaderAdapter == null) return false;
+ if (mStickyAdapter == null || parent.getLayoutManager() == null) return false;
if (isReverseLayout(parent)) {
int itemCount = parent.getLayoutManager().getItemCount();
- return position == (itemCount - 1) || mStickyHeaderAdapter.getHeaderId(position + 1)
- != mStickyHeaderAdapter.getHeaderId(position);
+ return position == (itemCount - 1) || mStickyAdapter.getStickyId(position + 1)
+ != mStickyAdapter.getStickyId(position);
} else {
- return position == 0 || mStickyHeaderAdapter.getHeaderId(position - 1)
- != mStickyHeaderAdapter.getHeaderId(position);
+ return position == 0 || mStickyAdapter.getStickyId(position - 1)
+ != mStickyAdapter.getStickyId(position);
}
}
private boolean showGroupHeaderAboveItem(RecyclerView parent, int position) {
- if (mExpandableAdapter == null) return false;
+ if (mExpandableAdapter == null || parent.getLayoutManager() == null) return false;
if (isReverseLayout(parent)) {
int itemCount = parent.getLayoutManager().getItemCount();
return position == (itemCount - 1) || mExpandableAdapter.getGroupUniqueId(position + 1)
@@ -320,11 +303,6 @@ private void notifyParentGroupHeaderShown(RecyclerView parent, RecyclerView.View
}
}
- private boolean hasStickyHeader(int position) {
- if (mStickyHeaderAdapter == null) return false;
- return mStickyHeaderAdapter.getHeaderId(position) != NO_HEADER_ID;
- }
-
private int calculateTop(boolean isReverseLayout, int layoutPos, int childCount, int simpleTop, Function calculateFunc) {
if (isReverseLayout && layoutPos == childCount - 1) {
for (int i = childCount - 1; i >= 1; i--) {
@@ -345,11 +323,11 @@ private int calculateTop(boolean isReverseLayout, int layoutPos, int childCount,
}
private int calculateStickyOffset(RecyclerView parent, int headerHeight, long currentHeaderId, int nextPosition) {
- if (mStickyHeaderAdapter == null) return 0;
+ if (mStickyAdapter == null) return 0;
int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(nextPosition));
if (adapterPosHere != RecyclerView.NO_POSITION) {
- long nextId = mStickyHeaderAdapter.getHeaderId(adapterPosHere);
- if (nextId != currentHeaderId && nextId != NO_HEADER_ID) {
+ long nextId = mStickyAdapter.getStickyId(adapterPosHere);
+ if (nextId != currentHeaderId && nextId != NO_STICKY_ID) {
View next = parent.getChildAt(nextPosition);
RecyclerView.ViewHolder viewHolder = getStickyHeader(parent, adapterPosHere);
if (viewHolder == null) return 0;
@@ -364,7 +342,7 @@ private int calculateGroupOffset(RecyclerView parent, long currentHeaderId, int
int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(nextPosition));
if (adapterPosHere != RecyclerView.NO_POSITION) {
long nextId = mExpandableAdapter.getGroupUniqueId(adapterPosHere);
- if (nextId != currentHeaderId && nextId != NO_HEADER_ID) {
+ if (nextId != currentHeaderId && nextId != NO_STICKY_ID) {
View next = parent.getChildAt(nextPosition);
RecyclerView.ViewHolder viewHolder = getGroupHeader(parent, adapterPosHere);
if (viewHolder == null) return OFFSET_NOT_FOUND;
@@ -395,19 +373,19 @@ private RecyclerView.ViewHolder getGroupHeader(RecyclerView parent, int position
@Nullable
private RecyclerView.ViewHolder getStickyHeader(RecyclerView parent, int position) {
- if (mStickyHeaderAdapter == null) return null;
+ if (mStickyAdapter == null) return null;
- long id = mStickyHeaderAdapter.getHeaderId(position);
+ long id = mStickyAdapter.getStickyId(position);
RecyclerView.ViewHolder holder = mStickyHeaderHolders.get(id);
boolean isHolderExists = holder != null;
if (!isHolderExists) {
- holder = mStickyHeaderAdapter.onCreateHeaderViewHolder(parent);
+ holder = mStickyAdapter.onCreateStickyViewHolder(parent);
mStickyHeaderHolders.put(id, holder);
}
//noinspection unchecked
- mStickyHeaderAdapter.onBindHeaderViewHolder(holder, position);
+ mStickyAdapter.onBindStickyViewHolder(holder, position);
measureAndLayoutHolder(parent, holder);
return holder;
}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/OmegaExpandableRecyclerView.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/OmegaExpandableRecyclerView.java
similarity index 83%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/OmegaExpandableRecyclerView.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/OmegaExpandableRecyclerView.java
index 1bd6f42..7ead19a 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/OmegaExpandableRecyclerView.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/OmegaExpandableRecyclerView.java
@@ -1,4 +1,4 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view;
+package com.omega_r.libs.omegarecyclerview_expandable;
import android.content.Context;
import android.content.res.Resources;
@@ -9,14 +9,6 @@
import android.os.Bundle;
import android.os.Parcelable;
import android.os.SystemClock;
-import android.support.annotation.CallSuper;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.DefaultItemAnimator;
-import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
@@ -24,21 +16,31 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.CallSuper;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.DefaultItemAnimator;
+import androidx.recyclerview.widget.RecyclerView;
+
import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
import com.omega_r.libs.omegarecyclerview.R;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.AnimationHelper;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.ExpandableItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.OnAnimationEndListener;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations.DropDownItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations.FadeItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.ExpandableViewData;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.FlatGroupingList;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.GroupProvider;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.Range;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.UniqueIdProvider;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.layout_manager.ExpandableLayoutManager;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderAdapter;
-import com.omega_r.libs.omegarecyclerview.sticky_header.StickyHeaderDecoration;
+import com.omega_r.libs.omegarecyclerview.item_decoration.BaseSpaceItemDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.BaseStickyDecoration;
+import com.omega_r.libs.omegarecyclerview.sticky_decoration.StickyAdapter;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.AnimationHelper;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.ExpandableItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.OnAnimationEndListener;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations.DropDownItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations.FadeItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.data.ExpandableViewData;
+import com.omega_r.libs.omegarecyclerview_expandable.data.FlatGroupingList;
+import com.omega_r.libs.omegarecyclerview_expandable.data.GroupProvider;
+import com.omega_r.libs.omegarecyclerview_expandable.data.Range;
+import com.omega_r.libs.omegarecyclerview_expandable.data.UniqueIdProvider;
+import com.omega_r.libs.omegarecyclerview_expandable.layout_manager.ExpandableLayoutManager;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -104,7 +106,7 @@ public OmegaExpandableRecyclerView(Context context, @Nullable AttributeSet attrs
private void init() {
setItemAnimator(requestItemAnimator());
- setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {
+ setChildDrawingOrderCallback(new ChildDrawingOrderCallback() {
@Override
public int onGetChildDrawingOrder(int childCount, int i) {
return childCount - i - 1;
@@ -138,11 +140,34 @@ private void parseAttributes(AttributeSet attributeSet, int defStyleAttr) {
mExpandMode = attrs.getInteger(R.styleable.OmegaExpandableRecyclerView_expandMode, EXPAND_MODE_SINGLE);
mShouldUseStickyGroups = attrs.getBoolean(R.styleable.OmegaExpandableRecyclerView_stickyGroups, false);
mItemsBackgroundRes = attrs.getResourceId(R.styleable.OmegaExpandableRecyclerView_backgrounds, NO_RESOURCE);
+ initGroupItemSpace(attrs);
} finally {
attrs.recycle();
}
}
+ private void initGroupItemSpace(TypedArray a) {
+ BaseSpaceItemDecoration decoration = getSpaceDecoration();
+ int groupItemSpace = (int) a.getDimension(R.styleable.OmegaExpandableRecyclerView_groupItemSpace, 0);
+ if (groupItemSpace > 0) {
+ ((ExpandableSpaceItemDecoration) decoration).setGroupSpace(groupItemSpace);
+ if (!hasSpaceDecoration()) addItemDecoration(decoration);
+ }
+ }
+
+ private boolean hasSpaceDecoration() {
+ for (int i = 0; i < getItemDecorationCount(); i++) {
+ RecyclerView.ItemDecoration decoration = getItemDecorationAt(i);
+ if (decoration instanceof BaseSpaceItemDecoration) return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected BaseSpaceItemDecoration createSpaceItemDecoration(int showDivider, int itemSpace) {
+ return new ExpandableSpaceItemDecoration(showDivider, itemSpace);
+ }
+
@Override
protected void initDefaultLayoutManager(@Nullable AttributeSet attrs, int defStyleAttr) {
if (getLayoutManager() == null) {
@@ -213,13 +238,25 @@ protected void onRestoreInstanceState(Parcelable state) {
}
}
+ @Override
+ protected void updateStickyDecoration(@Nullable RecyclerView.Adapter adapter) {
+ BaseStickyDecoration stickyDecoration = getStickyDecoration();
+ if (adapter != null && stickyDecoration != null) {
+ if (adapter instanceof OmegaExpandableRecyclerView.Adapter
+ && stickyDecoration instanceof ExpandableStickyDecoration) {
+ ((ExpandableStickyDecoration) stickyDecoration).setExpandableAdapter((Adapter) adapter);
+ }
+ }
+ super.updateStickyDecoration(adapter);
+ }
+
@Nullable
@Override
- protected StickyHeaderDecoration provideStickyHeaderDecoration(@Nullable StickyHeaderAdapter adapter, @Nullable Adapter expandableAdapter) {
- if (mShouldUseStickyGroups) {
- return new ExpandableStickyHeaderDecoration(adapter, expandableAdapter);
+ protected BaseStickyDecoration provideStickyDecoration(@NonNull RecyclerView.Adapter adapter, @Nullable StickyAdapter stickyAdapter) {
+ if (adapter instanceof OmegaExpandableRecyclerView.Adapter && mShouldUseStickyGroups) {
+ return new ExpandableStickyDecoration(stickyAdapter, (Adapter) adapter);
} else {
- return super.provideStickyHeaderDecoration(adapter, expandableAdapter);
+ return super.provideStickyDecoration(adapter, stickyAdapter);
}
}
@@ -317,9 +354,18 @@ public Adapter() {
@NonNull
private List> convertFrom(GroupProvider[] groupProviders) {
+ return convertFrom(Arrays.asList(groupProviders));
+ }
+
+ @NonNull
+ private List> convertFrom(List> groupProviders) {
List> expandableViewData = new ArrayList<>();
for (GroupProvider groupProvider : groupProviders) {
- expandableViewData.add(ExpandableViewData.of(groupProvider.provideGroup(), groupProvider.provideStickyId(), groupProvider.provideChilds()));
+ expandableViewData.add(ExpandableViewData.of(
+ groupProvider.provideGroup(),
+ groupProvider.provideStickyId(),
+ groupProvider.provideChilds()
+ ));
}
return expandableViewData;
}
@@ -335,7 +381,11 @@ public final void setItems(ExpandableViewData... expandableViewData) {
}
@SafeVarargs
- public final void setItems(GroupProvider... groupProviders) {
+ public final void setItemsAsGroupProviders(GroupProvider... groupProviders) {
+ setItems(convertFrom(groupProviders));
+ }
+
+ public final void setItemsAsGroupProviders(@NonNull List> groupProviders) {
setItems(convertFrom(groupProviders));
}
@@ -502,6 +552,7 @@ public List> getItems() {
return items.getItems();
}
+ @Nullable
public ExpandableViewData getItem(int position) {
return items.getDataAtVisiblePosition(position);
}
@@ -523,6 +574,13 @@ public Resources getResources() {
return getContext().getResources();
}
+ public void notifyChildChanged(CH child) {
+ int visiblePosition = items.getVisiblePosition(child);
+ if (visiblePosition != FlatGroupingList.POSITION_NOT_FOUND) {
+ tryNotifyItemChanged(visiblePosition);
+ }
+ }
+
public abstract class GroupViewHolder extends BaseViewHolder implements OnAnimationEndListener {
private final int expandedResLevel;
@@ -621,7 +679,7 @@ private void bindWithBackground(CH item, @DrawableRes int backgroundsRes, int ba
//endregion
//region ViewHolders
- static abstract class BaseViewHolder extends OmegaRecyclerView.ViewHolder {
+ static abstract class BaseViewHolder extends ViewHolder {
private T item;
BaseViewHolder(ViewGroup parent, @LayoutRes int res) {
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/AnimationHelper.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/AnimationHelper.java
similarity index 91%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/AnimationHelper.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/AnimationHelper.java
index 74c7997..29566dc 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/AnimationHelper.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/AnimationHelper.java
@@ -1,10 +1,10 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation;
+package com.omega_r.libs.omegarecyclerview_expandable.animation;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
import java.util.ArrayList;
import java.util.List;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/ExpandableItemAnimator.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/ExpandableItemAnimator.java
similarity index 96%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/ExpandableItemAnimator.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/ExpandableItemAnimator.java
index 7a64d83..51f82b7 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/ExpandableItemAnimator.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/ExpandableItemAnimator.java
@@ -1,17 +1,18 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation;
+package com.omega_r.libs.omegarecyclerview_expandable.animation;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.support.v7.widget.SimpleItemAnimator;
import android.view.View;
import android.view.ViewPropertyAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
+import androidx.recyclerview.widget.SimpleItemAnimator;
+
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
import java.util.ArrayList;
import java.util.List;
@@ -75,10 +76,18 @@ public void runPendingAnimations() {
if (additionsPending) runAddActions(removalsPending, movesPending, changesPending);
View someView = null;
- if (removalsPending) someView = mPendingChanges.removals.get(0).itemView;
- if (someView == null && movesPending) someView = mPendingChanges.moves.get(0).holder.itemView;
- if (someView == null && changesPending) someView = mPendingChanges.changes.get(0).oldHolder.itemView;
- if (someView == null && additionsPending) someView = mPendingChanges.additions.get(0).itemView;
+ if (removalsPending) {
+ someView = mPendingChanges.removals.get(0).itemView;
+ }
+ if (someView == null && movesPending) {
+ someView = mPendingChanges.moves.get(0).holder.itemView;
+ }
+ if (someView == null && changesPending) {
+ someView = mPendingChanges.changes.get(0).oldHolder.itemView;
+ }
+ if (someView == null && additionsPending) {
+ someView = mPendingChanges.additions.get(0).itemView;
+ }
if (someView != null) {
ViewCompat.postOnAnimationDelayed(someView, mPendingCleaner, getTotalDelay(removalsPending, movesPending, changesPending));
}
@@ -501,7 +510,11 @@ private void runChangeAnimation(final AnimationHelper.ChangeInfo changeInfo) {
ViewHolder holder = changeInfo.oldHolder;
final View view = holder == null ? null : holder.itemView;
ViewHolder newHolder = changeInfo.newHolder;
- final View newView = newHolder != null ? newHolder.itemView : null;
+ final View newView = newHolder != null ?
+ (newHolder instanceof OmegaExpandableRecyclerView.Adapter.ChildViewHolder ?
+ ((OmegaExpandableRecyclerView.Adapter.ChildViewHolder) newHolder).contentView
+ : newHolder.itemView)
+ : null;
if (view != null) {
mChangeAnimations.add(changeInfo.oldHolder);
@@ -525,7 +538,8 @@ public void onAnimationEnd(Animator animator) {
mChangeAnimations.remove(changeInfo.oldHolder);
dispatchFinishedWhenDone();
}
- }).start();
+ })
+ .start();
}
if (newView != null) {
diff --git a/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/OnAnimationEndListener.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/OnAnimationEndListener.java
new file mode 100644
index 0000000..61322ee
--- /dev/null
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/OnAnimationEndListener.java
@@ -0,0 +1,6 @@
+package com.omega_r.libs.omegarecyclerview_expandable.animation;
+
+public interface OnAnimationEndListener {
+ void onAnimationEnd();
+}
+
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/DropDownItemAnimator.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/DropDownItemAnimator.java
similarity index 93%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/DropDownItemAnimator.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/DropDownItemAnimator.java
index 468e66a..a9e8eda 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/DropDownItemAnimator.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/DropDownItemAnimator.java
@@ -1,16 +1,17 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations;
+package com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.os.Build;
-import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewPropertyAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.ChildClippingFrameLayout;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.ExpandableItemAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.layout_manager.ExpandableLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.libs.omegarecyclerview_expandable.ChildClippingFrameLayout;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.ExpandableItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.layout_manager.ExpandableLayoutManager;
import java.util.ArrayList;
import java.util.List;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/FadeItemAnimator.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/FadeItemAnimator.java
similarity index 86%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/FadeItemAnimator.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/FadeItemAnimator.java
index a0d5564..99184a9 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/standard_animations/FadeItemAnimator.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/animation/standard_animations/FadeItemAnimator.java
@@ -1,9 +1,9 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.standard_animations;
+package com.omega_r.libs.omegarecyclerview_expandable.animation.standard_animations;
import android.view.ViewPropertyAnimator;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation.ExpandableItemAnimator;
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.animation.ExpandableItemAnimator;
public final class FadeItemAnimator extends ExpandableItemAnimator {
private static final int FADE_DURATION = 100;
diff --git a/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableType.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableType.java
new file mode 100644
index 0000000..c711f15
--- /dev/null
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableType.java
@@ -0,0 +1,5 @@
+package com.omega_r.libs.omegarecyclerview_expandable.data;
+
+public enum ExpandableType {
+ GROUP, CHILD
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableViewData.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableViewData.java
similarity index 92%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableViewData.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableViewData.java
index aeb96a6..b9aa5d2 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableViewData.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/ExpandableViewData.java
@@ -1,8 +1,8 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
+package com.omega_r.libs.omegarecyclerview_expandable.data;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/FlatGroupingList.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/FlatGroupingList.java
similarity index 96%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/FlatGroupingList.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/FlatGroupingList.java
index 1464ad4..ecddd47 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/FlatGroupingList.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/FlatGroupingList.java
@@ -1,8 +1,10 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
+package com.omega_r.libs.omegarecyclerview_expandable.data;
import android.os.Bundle;
import android.os.Parcelable;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -143,7 +145,9 @@ public List> getItems() {
return mItems;
}
+ @Nullable
public ExpandableViewData getDataAtVisiblePosition(int pos) {
+ if (0 > pos || pos > mPositions.size() - 1) return null;
return mItems.get(mPositions.get(pos).groupIndex);
}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/GroupProvider.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/GroupProvider.java
similarity index 58%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/GroupProvider.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/GroupProvider.java
index e925d80..de9af73 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/GroupProvider.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/GroupProvider.java
@@ -1,6 +1,6 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
+package com.omega_r.libs.omegarecyclerview_expandable.data;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
import java.util.List;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/PositionData.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/PositionData.java
similarity index 86%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/PositionData.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/PositionData.java
index bb89333..c8a7aa6 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/PositionData.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/PositionData.java
@@ -1,4 +1,4 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
+package com.omega_r.libs.omegarecyclerview_expandable.data;
public class PositionData {
public static final int POSITION_NOT_FOUND = -1;
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/Range.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/Range.java
similarity index 92%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/Range.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/Range.java
index a48d421..f6195bc 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/Range.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/Range.java
@@ -1,6 +1,6 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
+package com.omega_r.libs.omegarecyclerview_expandable.data;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import java.io.Serializable;
import java.util.ArrayList;
diff --git a/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/UniqueIdProvider.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/UniqueIdProvider.java
new file mode 100644
index 0000000..2a9528d
--- /dev/null
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/data/UniqueIdProvider.java
@@ -0,0 +1,5 @@
+package com.omega_r.libs.omegarecyclerview_expandable.data;
+
+public interface UniqueIdProvider {
+ long provideUniqueId();
+}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/layout_manager/ExpandableLayoutManager.java b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/layout_manager/ExpandableLayoutManager.java
similarity index 80%
rename from omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/layout_manager/ExpandableLayoutManager.java
rename to omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/layout_manager/ExpandableLayoutManager.java
index 5e38eb1..091f23a 100644
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/layout_manager/ExpandableLayoutManager.java
+++ b/omegarecyclerview_expandable/src/main/java/com/omega_r/libs/omegarecyclerview_expandable/layout_manager/ExpandableLayoutManager.java
@@ -1,17 +1,18 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.layout_manager;
+package com.omega_r.libs.omegarecyclerview_expandable.layout_manager;
import android.content.Context;
import android.os.Build;
-import android.support.annotation.Nullable;
-import android.support.v7.widget.ExpandedRecyclerView;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.OmegaExpandableRecyclerView;
-import com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data.Range;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.ExpandedRecyclerView;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.libs.omegarecyclerview_expandable.OmegaExpandableRecyclerView;
+import com.omega_r.libs.omegarecyclerview_expandable.data.Range;
public class ExpandableLayoutManager extends LinearLayoutManager {
@@ -54,8 +55,8 @@ public void onDetachedFromWindow(RecyclerView view, RecyclerView.Recycler recycl
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
- if (mRecyclerView != null) {
- if (mRecyclerView.getLayoutStep() == ExpandedRecyclerView.STEP_LAYOUT) mAddedRange.clear();
+ if (mRecyclerView != null && mRecyclerView.getLayoutStep() == ExpandedRecyclerView.STEP_LAYOUT) {
+ mAddedRange.clear();
}
}
@@ -76,6 +77,7 @@ public void addView(View child) {
((OmegaExpandableRecyclerView.Adapter.ChildViewHolder) holder).contentView.setAlpha(0f);
}
}
+
super.addView(child);
}
diff --git a/omegarecyclerview_expandable/src/main/res/values/strings.xml b/omegarecyclerview_expandable/src/main/res/values/strings.xml
new file mode 100644
index 0000000..4fcf74c
--- /dev/null
+++ b/omegarecyclerview_expandable/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ omegarecyclerview_expandable
+
diff --git a/omegarecyclerview_expandable/src/test/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleUnitTest.java b/omegarecyclerview_expandable/src/test/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleUnitTest.java
new file mode 100644
index 0000000..8ff8e3e
--- /dev/null
+++ b/omegarecyclerview_expandable/src/test/java/com/omega_r/libs/omegarecyclerview_expandable/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.omega_r.libs.omegarecyclerview_expandable;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/.gitignore b/omegarecyclerview_fastscroll/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/omegarecyclerview_fastscroll/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/omegarecyclerview_fastscroll/build.gradle b/omegarecyclerview_fastscroll/build.gradle
new file mode 100644
index 0000000..b065f40
--- /dev/null
+++ b/omegarecyclerview_fastscroll/build.gradle
@@ -0,0 +1,48 @@
+apply plugin: 'com.android.library'
+apply plugin: 'maven-publish'
+
+android {
+ compileSdkVersion rootProject.compileSdkVersion
+
+ defaultConfig {
+ minSdkVersion rootProject.minSdkVersion
+ targetSdkVersion rootProject.targetSdkVersion
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+publishing {
+ publications {
+ release(MavenPublication) {
+ groupId 'com.github.Omega-R.OmegaRecyclerView'
+ artifactId project.name
+ version project.hasProperty('version') ? project.version : gradle.gitHash()
+ afterEvaluate {
+ from components.release
+ }
+ }
+ }
+ repositories {
+ maven {
+ url gradle.nexusUrl
+ credentials {
+ username gradle.nexusUsername
+ password gradle.nexusPassword
+ }
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation project(':omegarecyclerview')
+ implementation 'androidx.appcompat:appcompat:' + rootProject.appcompatVersion
+ implementation 'com.google.android.material:material:' + rootProject.materialVersion
+ implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+}
diff --git a/omegarecyclerview_fastscroll/proguard-rules.pro b/omegarecyclerview_fastscroll/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/omegarecyclerview_fastscroll/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/omegarecyclerview_fastscroll/src/main/AndroidManifest.xml b/omegarecyclerview_fastscroll/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e74ebd3
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/DrawableUtils.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/DrawableUtils.java
new file mode 100644
index 0000000..a5418c2
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/DrawableUtils.java
@@ -0,0 +1,50 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+import android.content.Context;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.RotateDrawable;
+import android.graphics.drawable.ScaleDrawable;
+
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.core.graphics.drawable.DrawableCompat;
+
+import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION_CODES.KITKAT;
+
+@SuppressWarnings("WeakerAccess")
+public class DrawableUtils {
+
+ public static Drawable getTintedDrawable(Context context, @NonNull Drawable drawable, @ColorRes int color) {
+ return getTintedDrawable(drawable, ContextCompat.getColor(context, color));
+ }
+
+ public static Drawable getTintedDrawable(@NonNull Drawable drawable, @ColorInt int color) {
+ Drawable mutate = DrawableCompat.wrap(drawable).mutate();
+ DrawableCompat.setTint(mutate, color);
+ return mutate;
+ }
+
+ public static int getAlpha(@NonNull Drawable drawable) {
+ if (SDK_INT >= KITKAT) return drawable.getAlpha();
+
+ if (drawable instanceof ColorDrawable) {
+ return ((ColorDrawable) drawable).getColor() >>> 24;
+ } else if( drawable instanceof BitmapDrawable) {
+ return ((BitmapDrawable) drawable).getPaint().getAlpha();
+ } else if(drawable instanceof RotateDrawable) {
+ Drawable rotateDrawable = ((RotateDrawable) drawable).getDrawable();
+ if (rotateDrawable != null) return getAlpha(rotateDrawable);
+ } else if( drawable instanceof ScaleDrawable) {
+ Drawable scaleDrawable = ((ScaleDrawable) drawable).getDrawable();
+ if (scaleDrawable != null) return getAlpha(scaleDrawable);
+ }
+
+ return DrawableCompat.getAlpha(drawable);
+ }
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAdapter.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAdapter.java
new file mode 100644
index 0000000..8a0644c
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAdapter.java
@@ -0,0 +1,25 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+public interface FastScrollAdapter {
+
+ long getFastScrollGroupId(int position);
+
+ interface Text extends FastScrollAdapter {
+
+ String getText(int position);
+
+ }
+
+ interface ViewHolder extends FastScrollAdapter {
+
+ T onCreateFastScrollViewHolder(ViewGroup parent);
+
+ void onBindFastScrollViewHolder(T viewHolder, int position);
+
+ }
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAutoHide.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAutoHide.java
new file mode 100644
index 0000000..76681bf
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollAutoHide.java
@@ -0,0 +1,10 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+public interface FastScrollAutoHide {
+
+ int NONE = 0;
+ int SCROLLBAR = 1;
+ int TRACK = 2;
+ int BUBBLE = 4;
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollVisibility.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollVisibility.java
new file mode 100644
index 0000000..7136f62
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/FastScrollVisibility.java
@@ -0,0 +1,10 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+interface FastScrollVisibility {
+
+ int NONE = 0;
+ int SCROLLBAR = 1;
+ int TRACK = 2;
+ int BUBBLE = 4;
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/OmegaFastScrollRecyclerView.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/OmegaFastScrollRecyclerView.java
new file mode 100644
index 0000000..9d78b97
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/OmegaFastScrollRecyclerView.java
@@ -0,0 +1,797 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.util.SparseArray;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
+
+import static android.view.View.MeasureSpec.EXACTLY;
+import static com.omega_r.libs.omegarecyclerview.utils.ViewUtils.isReverseLayout;
+import static com.omega_r.libs.omegarecyclerview_fastscroll.Position.LEFT;
+import static com.omega_r.libs.omegarecyclerview_fastscroll.Position.RIGHT;
+
+public class OmegaFastScrollRecyclerView extends OmegaRecyclerView {
+
+ private static final long ANIM_DURATION_IN_MILLIS = 300;
+ private static final long BUBBLE_ANIM_DURATION_IN_MILLIS = 100;
+ private static final long TRACK_HIDE_DELAY_IN_MILLIS = 1500;
+ private static final int MAX_ALPHA = 255;
+ private static final int MIN_ALPHA = 0;
+
+ private final OnScrollListener mScrollListener = new OnScrollListener() {
+
+ private boolean isFirstScroll = true;
+
+ @Override
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ if (!isEnabled() || getFastScrollAdapter() == null) return;
+ OmegaFastScrollRecyclerView.this.onScrollScreenStateChanged(newState);
+ }
+
+ @Override
+ public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+ if (isFirstScroll) {
+ isFirstScroll = false;
+ return;
+ }
+ if (!isEnabled() || getFastScrollAdapter() == null) return;
+ OmegaFastScrollRecyclerView.this.onScrolled();
+ }
+ };
+
+ private final ValueAnimator mShowTrackAnimator = ValueAnimator.ofInt();
+ private final ValueAnimator mHideTrackAnimator = ValueAnimator.ofInt();
+ private final ValueAnimator mShowScrollbarAnimator = ValueAnimator.ofInt();
+ private final ValueAnimator mHideScrollbarAnimator = ValueAnimator.ofInt();
+ private final ValueAnimator mShowBubbleAnimator = ValueAnimator.ofInt();
+ private final ValueAnimator mHideBubbleAnimator = ValueAnimator.ofInt();
+
+ private final Runnable mHiderRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (isShowTrack() && isAutoHideTrack()) hideTrack();
+ if (isShowScrollbar() && isAutoHideScrollbar()) hideScrollbar();
+ if (isShowBubble() && isAutoHideBubble()) hideBubble();
+ }
+ };
+
+ private final SparseArray mHolderSparseArray = new SparseArray<>();
+ private final Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Rect mTextBounds = new Rect();
+
+ private Drawable mBubbleUpDrawable;
+ private Drawable mBubbleDownDrawable;
+ @Nullable
+ private Drawable mBubbleDrawable;
+
+ private Drawable mTrackDrawable;
+ private int mTrackPaddingLeft;
+ private int mTrackPaddingTop;
+ private int mTrackPaddingRight;
+ private int mTrackPaddingBottom;
+
+ private final Rect mScrollbarBounds = new Rect();
+ private final Paint mScrollbarPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+ private Position mPosition;
+ private int mElementsVisibility = FastScrollVisibility.NONE;
+ private int mAutoHide = FastScrollAutoHide.NONE;
+
+ private boolean mIsScrollbarVisible;
+ private boolean mIsScrollbarTouched;
+ private boolean mIsTrackVisible;
+ private boolean mIsTrackTouched;
+ private boolean mIsBubbleVisible;
+ private boolean mIsBubbleTouched;
+
+ private long mAnimDuration = ANIM_DURATION_IN_MILLIS;
+ private long mBubbleAnimDuration = BUBBLE_ANIM_DURATION_IN_MILLIS;
+ private long mHideTrackDelay = TRACK_HIDE_DELAY_IN_MILLIS;
+
+ private float mLastEventY;
+
+ public OmegaFastScrollRecyclerView(Context context) {
+ super(context);
+ init(context, null, 0);
+ }
+
+ public OmegaFastScrollRecyclerView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs, 0);
+ }
+
+ public OmegaFastScrollRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context, attrs, defStyle);
+ }
+
+ private void init(Context context, @Nullable AttributeSet attrs, int defStyle) {
+ mPosition = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL ? LEFT : RIGHT;
+ mTrackDrawable = ContextCompat.getDrawable(context, R.drawable.ic_track);
+ initBubbleDrawables(mPosition);
+
+ mTrackPaddingLeft = getResources().getDimensionPixelSize(R.dimen.fastscroll_track_padding_left);
+ mTrackPaddingTop = getResources().getDimensionPixelSize(R.dimen.fastscroll_track_padding_top);
+ mTrackPaddingRight = getResources().getDimensionPixelSize(R.dimen.fastscroll_track_padding_right);
+ mTrackPaddingBottom = getResources().getDimensionPixelSize(R.dimen.fastscroll_track_padding_bottom);
+
+ mScrollbarPaint.setStyle(Paint.Style.FILL);
+
+ mTextPaint.setColor(Color.WHITE);
+ mTextPaint.setTextSize(90);
+ mTextPaint.setTextAlign(Paint.Align.CENTER);
+
+ if (attrs != null) {
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.OmegaFastScrollRecyclerView);
+ initAttrs(typedArray);
+ typedArray.recycle();
+ }
+
+ if (isShowScrollbar() && !isAutoHideScrollbar()) mIsScrollbarVisible = true;
+ if (isShowTrack() && !isAutoHideTrack()) mIsTrackVisible = true;
+ if (isShowTrack() && !isAutoHideBubble()) mIsBubbleVisible = true;
+
+ initAnimators();
+ addOnScrollListener(mScrollListener);
+ setWillNotDraw(false);
+ }
+
+ private void initAttrs(@NonNull TypedArray typedArray) {
+ int position = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_position, 0);
+ Position newPosition;
+ if (position == 0) {
+ newPosition = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL ? LEFT : RIGHT;
+ } else {
+ newPosition = Position.values()[position - 1];
+ }
+ if (newPosition != mPosition) {
+ mPosition = newPosition;
+ initBubbleDrawables(mPosition);
+ }
+
+ mTrackDrawable = getTintedDrawable(typedArray, mTrackDrawable,
+ R.styleable.OmegaFastScrollRecyclerView_trackDrawable, R.styleable.OmegaFastScrollRecyclerView_omega_trackColor);
+ mBubbleUpDrawable = getTintedDrawable(typedArray, mBubbleUpDrawable,
+ R.styleable.OmegaFastScrollRecyclerView_bubbleUpDrawable, R.styleable.OmegaFastScrollRecyclerView_bubbleUpColor);
+ mBubbleDownDrawable = getTintedDrawable(typedArray, mBubbleDownDrawable, R
+ .styleable.OmegaFastScrollRecyclerView_bubbleDownDrawable, R.styleable.OmegaFastScrollRecyclerView_bubbleDownColor);
+
+ int trackPadding = typedArray.getDimensionPixelSize(R.styleable.OmegaFastScrollRecyclerView_fastScrollTrackPadding, -1);
+ if (trackPadding != -1) {
+ mTrackPaddingLeft = trackPadding;
+ mTrackPaddingTop = trackPadding;
+ mTrackPaddingRight = trackPadding;
+ mTrackPaddingBottom = trackPadding;
+ }
+
+ mTrackPaddingLeft = typedArray.getDimensionPixelSize(
+ R.styleable.OmegaFastScrollRecyclerView_fastScrollTrackPaddingLeft,
+ mTrackPaddingLeft
+ );
+ mTrackPaddingTop = typedArray.getDimensionPixelSize(
+ R.styleable.OmegaFastScrollRecyclerView_fastScrollTrackPaddingTop,
+ mTrackPaddingTop
+ );
+ mTrackPaddingRight = typedArray.getDimensionPixelSize(
+ R.styleable.OmegaFastScrollRecyclerView_fastScrollTrackPaddingRight,
+ mTrackPaddingRight
+ );
+ mTrackPaddingBottom = typedArray.getDimensionPixelSize(
+ R.styleable.OmegaFastScrollRecyclerView_fastScrollTrackPaddingBottom,
+ mTrackPaddingBottom
+ );
+
+ mElementsVisibility = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_fastScrollVisibility, FastScrollVisibility.NONE);
+ mAutoHide = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_fastScrollAutoHide, FastScrollAutoHide.NONE);
+
+ int scrollbarColor = typedArray.getColor(R.styleable.OmegaFastScrollRecyclerView_fastScrollbarColor, Color.TRANSPARENT);
+ if (scrollbarColor != Color.TRANSPARENT) mScrollbarPaint.setColor(scrollbarColor);
+ int scrollbarWidth = typedArray.getDimensionPixelSize(R.styleable.OmegaFastScrollRecyclerView_fastScrollbarWidth, 0);
+ if (scrollbarWidth >= 0) mScrollbarPaint.setStrokeWidth(scrollbarWidth);
+
+ mAnimDuration = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_fastScrollAnimDuration, (int) mAnimDuration);
+ mBubbleAnimDuration = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_fastScrollBubbleAnimDuration, (int) mBubbleAnimDuration);
+ mHideTrackDelay = typedArray.getInt(R.styleable.OmegaFastScrollRecyclerView_fastScrollHideTrackDelay, (int) mHideTrackDelay);
+
+ if (isShowBubble() && isAutoHideBubble()) {
+ mBubbleUpDrawable.setAlpha(MIN_ALPHA);
+ mBubbleDownDrawable.setAlpha(MIN_ALPHA);
+ }
+
+ mTextPaint.setColor(typedArray.getColor(R.styleable.OmegaFastScrollRecyclerView_fastScrollTextColor, Color.WHITE));
+ int textSize = typedArray.getDimensionPixelSize(R.styleable.OmegaFastScrollRecyclerView_fastScrollTextSize,
+ getResources().getDimensionPixelSize(R.dimen.fastscroll_text_size));
+ mTextPaint.setTextSize(textSize);
+ }
+
+ private Drawable getTintedDrawable(@NonNull TypedArray typedArray, Drawable defaultDrawable, int drawableIndex, int colorIndex) {
+ Drawable drawable = typedArray.getDrawable(drawableIndex);
+ int trackColor = typedArray.getColor(colorIndex, Color.TRANSPARENT);
+
+ if (drawable != null && trackColor != Color.TRANSPARENT) return DrawableUtils.getTintedDrawable(drawable, trackColor);
+ if (trackColor != Color.TRANSPARENT) return DrawableUtils.getTintedDrawable(defaultDrawable, trackColor);
+
+ return defaultDrawable;
+ }
+
+ private void initBubbleDrawables(Position position) {
+ switch (position) {
+ case LEFT:
+ mBubbleUpDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_bubble_up_left);
+ mBubbleDownDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_bubble_down_left);
+ break;
+ case RIGHT:
+ mBubbleUpDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_bubble_up_right);
+ mBubbleDownDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_bubble_down_right);
+ break;
+ }
+ }
+
+ private void initAnimators() {
+ ValueAnimator.AnimatorUpdateListener scrollbarAnimator = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int left = (int) animation.getAnimatedValue();
+ int right = (int) (left + mScrollbarPaint.getStrokeWidth());
+ mScrollbarBounds.set(left, mScrollbarBounds.top, right, mScrollbarBounds.bottom);
+ invalidate();
+ }
+ };
+ mShowScrollbarAnimator.setDuration(mAnimDuration);
+ mShowScrollbarAnimator.addUpdateListener(scrollbarAnimator);
+ mShowScrollbarAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsScrollbarVisible = true;
+ }
+ });
+ mHideScrollbarAnimator.setDuration(mAnimDuration);
+ mHideScrollbarAnimator.addUpdateListener(scrollbarAnimator);
+ mHideScrollbarAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsScrollbarVisible = false;
+ }
+ });
+
+ ValueAnimator.AnimatorUpdateListener trackAnimator = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int left = (int) animation.getAnimatedValue();
+ int right = left + mTrackDrawable.getIntrinsicWidth();
+ Rect bounds = mTrackDrawable.getBounds();
+ mTrackDrawable.setBounds(left, bounds.top, right, bounds.bottom);
+ invalidate();
+ }
+ };
+ mShowTrackAnimator.setDuration(mAnimDuration);
+ mShowTrackAnimator.addUpdateListener(trackAnimator);
+ mShowTrackAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsTrackVisible = true;
+ }
+ });
+ mHideTrackAnimator.setDuration(mAnimDuration);
+ mHideTrackAnimator.addUpdateListener(trackAnimator);
+ mHideTrackAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsTrackVisible = false;
+ }
+ });
+
+ ValueAnimator.AnimatorUpdateListener bubbleAnimator = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int alpha = (int) animation.getAnimatedValue();
+ mBubbleUpDrawable.setAlpha(alpha);
+ mBubbleDownDrawable.setAlpha(alpha);
+ invalidate();
+ }
+ };
+ mShowBubbleAnimator.setDuration(mBubbleAnimDuration);
+ mShowBubbleAnimator.addUpdateListener(bubbleAnimator);
+ mShowBubbleAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsBubbleVisible = true;
+ }
+ });
+ mHideBubbleAnimator.setDuration(mBubbleAnimDuration);
+ mHideBubbleAnimator.addUpdateListener(bubbleAnimator);
+ mHideBubbleAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mIsBubbleVisible = false;
+ }
+ });
+ }
+
+ @Override
+ protected void onSizeChanged(int width, int height, int oldw, int oldh) {
+ super.onSizeChanged(width, height, oldw, oldh);
+ if (isShowScrollbar()) {
+ boolean isAutoHideScrollbar = isAutoHideScrollbar();
+ if (isAutoHideScrollbar) {
+ mScrollbarBounds.set(mScrollbarBounds.left, 0, mScrollbarBounds.right, height);
+ return;
+ }
+
+ int scrollbarWidth = (int) mScrollbarPaint.getStrokeWidth();
+ int left = 0;
+ int right = scrollbarWidth;
+ if (mPosition == RIGHT) {
+ right = getWidth();
+ left = right - scrollbarWidth;
+ }
+ mScrollbarBounds.set(left, 0, right, height);
+ }
+ if (isShowTrack() && !isAutoHideTrack()) {
+ Rect bounds = mTrackDrawable.getBounds();
+ int trackWidth = mTrackDrawable.getIntrinsicWidth();
+
+ int left = 0;
+ int right = 0;
+ switch (mPosition) {
+ case LEFT:
+ left = mTrackPaddingLeft;
+ right = left + trackWidth;
+ break;
+ case RIGHT:
+ left = width - mTrackPaddingRight - trackWidth;
+ right = left + trackWidth;
+ break;
+ }
+ mTrackDrawable.setBounds(left, bounds.top, right, bounds.bottom);
+ onScrolled();
+ }
+ if (isShowBubble() && (!isShowTrack() || !isAutoHideTrack())) onScrolled();
+ }
+
+ @Override
+ public void setAdapter(RecyclerView.Adapter adapter) {
+ super.setAdapter(adapter);
+ if (adapter != null && !(adapter instanceof FastScrollAdapter)) {
+ throw new IllegalArgumentException("RecyclerView.Adapter should be instanceof FastScrollAdapter");
+ }
+ }
+
+ @Nullable
+ private FastScrollAdapter getFastScrollAdapter() {
+ RecyclerView.Adapter adapter = getAdapter();
+ return adapter == null ? null : (FastScrollAdapter) adapter;
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ mShowBubbleAnimator.cancel();
+ mShowScrollbarAnimator.cancel();
+ mShowTrackAnimator.cancel();
+ mHideBubbleAnimator.cancel();
+ mHideScrollbarAnimator.cancel();
+ mHideTrackAnimator.cancel();
+ super.onDetachedFromWindow();
+ }
+
+ @Override
+ @SuppressLint("ClickableViewAccessibility")
+ public boolean onTouchEvent(MotionEvent event) {
+ if (!isEnabled() || getVisibility() != VISIBLE) return super.onTouchEvent(event);
+ if (!isShowScrollbar() && !isShowTrack() && !isShowBubble()) return super.onTouchEvent(event);
+
+ int action = event.getAction();
+ float eventX = event.getX();
+ float eventY = event.getY();
+
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ mIsScrollbarTouched = isScrollbarTouched(eventX);
+ mIsTrackTouched = isTrackTouched(eventX, eventY);
+ mIsBubbleTouched = isBubbleTouched(eventX, eventY);
+ if (mIsTrackTouched || mIsScrollbarTouched || mIsBubbleTouched) {
+ mLastEventY = eventY;
+ requestDisallowInterceptTouchEvent(true);
+ removeOnScrollListener(mScrollListener);
+ removeCallbacks(mHiderRunnable);
+
+ if (mIsTrackTouched) {
+ showBubble();
+ } else if (!mIsBubbleTouched) {
+ updateRecyclerViewPosition(eventY);
+ onScrolled(eventY);
+ }
+ showScrollbar();
+ showTrack();
+ return true;
+ }
+ case MotionEvent.ACTION_MOVE:
+ if (mIsTrackTouched || mIsScrollbarTouched || mIsBubbleTouched) {
+ float diff = eventY - mLastEventY;
+ Rect bounds = mTrackDrawable.getBounds();
+ float y = bounds.top + diff;
+ mLastEventY = eventY;
+ y = Math.min(getHeight(), Math.max(0, y));
+ updateRecyclerViewPosition(isReverseLayout(this) ? y + bounds.height() : y);
+ onScrolled(y);
+ return true;
+ }
+ case MotionEvent.ACTION_UP:
+ if (mIsTrackTouched || mIsScrollbarTouched || mIsBubbleTouched) {
+ postDelayed(mHiderRunnable, mHideTrackDelay);
+ requestDisallowInterceptTouchEvent(false);
+ mIsTrackTouched = isShowTrack() && !isAutoHideTrack();
+ mIsScrollbarTouched = isShowScrollbar() && !isAutoHideScrollbar();
+ mIsBubbleTouched = isShowBubble() && !isAutoHideBubble();
+ invalidate();
+ addOnScrollListener(mScrollListener);
+ hideBubble();
+ return true;
+ }
+ }
+ return super.onTouchEvent(event);
+ }
+
+ private boolean isTrackTouched(float eventX, float eventY) {
+ Rect bounds = mTrackDrawable.getBounds();
+ int left = bounds.left - mTrackPaddingLeft;
+ int right = bounds.right + mTrackPaddingRight;
+ int top = bounds.top + mTrackPaddingTop;
+ int bottom = bounds.bottom + mTrackPaddingBottom;
+ return left <= eventX && eventX <= right && top <= eventY && eventY <= bottom;
+ }
+
+ private boolean isScrollbarTouched(float eventX) {
+ return mScrollbarBounds.left <= eventX && eventX <= mScrollbarBounds.right;
+ }
+
+ private boolean isBubbleTouched(float eventX, float eventY) {
+ if (mBubbleDrawable == null) return false;
+ Rect bounds = mBubbleDrawable.getBounds();
+ return bounds.left <= eventX && eventX <= bounds.right
+ && bounds.top <= eventY && eventY <= bounds.bottom;
+ }
+
+ private void updateRecyclerViewPosition(float eventY) {
+ RecyclerView.LayoutManager layoutManager = getLayoutManager();
+ RecyclerView.Adapter adapter = getAdapter();
+ if (layoutManager == null || adapter == null) return;
+
+ int itemCount = adapter.getItemCount();
+ float positionPercent = (eventY * 100) / getHeight();
+ int newPosition = Math.round((itemCount * positionPercent) / 100);
+ if (isReverseLayout(this)) newPosition = itemCount - newPosition;
+
+ if (layoutManager instanceof LinearLayoutManager) {
+ ((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(newPosition, 0);
+ } else {
+ layoutManager.scrollToPosition(newPosition);
+ }
+ }
+
+ private void onScrollScreenStateChanged(int newState) {
+ switch (newState) {
+ case RecyclerView.SCROLL_STATE_DRAGGING:
+ case RecyclerView.SCROLL_STATE_SETTLING:
+ removeCallbacks(mHiderRunnable);
+ showScrollbar();
+ showTrack();
+ showBubble();
+ break;
+ case RecyclerView.SCROLL_STATE_IDLE:
+ postDelayed(mHiderRunnable, mHideTrackDelay);
+ break;
+ }
+ }
+
+ private void showTrack() {
+ if (!isShowTrack() || !isAutoHideTrack()) return;
+ Rect bounds = mTrackDrawable.getBounds();
+ int trackWidth = mTrackDrawable.getIntrinsicWidth();
+ int from = 0;
+ int to = 0;
+ switch (mPosition) {
+ case LEFT:
+ from = bounds.right == 0 ? -trackWidth : bounds.left;
+ to = mTrackPaddingLeft;
+ break;
+ case RIGHT:
+ from = bounds.right == 0 ? getWidth() : bounds.left;
+ to = getWidth() - mTrackPaddingRight - trackWidth;
+ break;
+ }
+ mHideTrackAnimator.cancel();
+ mShowTrackAnimator.cancel();
+ mShowTrackAnimator.setIntValues(from, to);
+ mShowTrackAnimator.start();
+ }
+
+ private void hideTrack() {
+ if (!isShowTrack() || !isAutoHideTrack()) return;
+ Rect bounds = mTrackDrawable.getBounds();
+ int from = 0;
+ int to = 0;
+ switch (mPosition) {
+ case LEFT:
+ from = bounds.left;
+ to = -mTrackDrawable.getIntrinsicWidth();
+ break;
+ case RIGHT:
+ from = bounds.left;
+ to = getWidth();
+ break;
+ }
+ mShowTrackAnimator.cancel();
+ mHideTrackAnimator.cancel();
+ mHideTrackAnimator.setIntValues(from, to);
+ mHideTrackAnimator.start();
+ }
+
+ private void showScrollbar() {
+ if (!isShowScrollbar() || !isAutoHideScrollbar()) return;
+ int scrollbarWidth = (int) mScrollbarPaint.getStrokeWidth();
+ Rect bounds = mScrollbarBounds;
+ int from = 0;
+ int to = 0;
+ switch (mPosition) {
+ case LEFT:
+ from = bounds.right == 0 ? -scrollbarWidth : bounds.left;
+ to = 0;
+ break;
+ case RIGHT:
+ from = bounds.right == 0 ? getWidth() : bounds.left;
+ to = getWidth() - scrollbarWidth;
+ break;
+ }
+ mHideScrollbarAnimator.cancel();
+ mShowScrollbarAnimator.cancel();
+ mShowScrollbarAnimator.setIntValues(from, to);
+ mShowScrollbarAnimator.start();
+ }
+
+ private void hideScrollbar() {
+ if (!isShowScrollbar() || !isAutoHideScrollbar()) return;
+ Rect bounds = mScrollbarBounds;
+ int from = 0;
+ int to = 0;
+ switch (mPosition) {
+ case LEFT:
+ from = bounds.left;
+ to = (int) -mScrollbarPaint.getStrokeWidth();
+ break;
+ case RIGHT:
+ from = bounds.left;
+ to = getWidth();
+ break;
+ }
+ mShowScrollbarAnimator.cancel();
+ mHideScrollbarAnimator.cancel();
+ mHideScrollbarAnimator.setIntValues(from, to);
+ mHideScrollbarAnimator.start();
+ }
+
+ private void showBubble() {
+ if (mBubbleDrawable == null) return;
+ if (!isShowBubble() || !isAutoHideBubble() || mIsBubbleVisible || !mIsTrackTouched) return;
+ int startAlpha = DrawableUtils.getAlpha(mBubbleDrawable);
+ if (startAlpha == MAX_ALPHA) startAlpha = MIN_ALPHA;
+ mHideBubbleAnimator.cancel();
+ mShowBubbleAnimator.cancel();
+ mShowBubbleAnimator.setIntValues(startAlpha, MAX_ALPHA);
+ mShowBubbleAnimator.start();
+ }
+
+ private void hideBubble() {
+ if (mBubbleDrawable == null) return;
+ if (!isShowBubble() || !isAutoHideBubble() || !mIsBubbleVisible) return;
+ mShowBubbleAnimator.cancel();
+ mHideBubbleAnimator.cancel();
+ mHideBubbleAnimator.setIntValues(DrawableUtils.getAlpha(mBubbleDrawable), MIN_ALPHA);
+ mHideBubbleAnimator.start();
+ }
+
+ private void onScrolled() {
+ int width = getWidth();
+ int height = getHeight();
+
+ int scrollPosition = getScrollPosition();
+ updateTrackPosition(height, width, scrollPosition);
+ updateBubblePosition(height, width, scrollPosition);
+ invalidate();
+ }
+
+ private int getScrollPosition() {
+ int height = getHeight();
+ int scrollRange = computeVerticalScrollRange() - height;
+ int scrollOffset = computeVerticalScrollOffset();
+ double scrollPercents = (scrollOffset == 0) ? 0 : (scrollOffset * 100.0 / scrollRange);
+ height = height - mTrackPaddingTop - mTrackPaddingBottom - mTrackDrawable.getIntrinsicHeight();
+ if (isReverseLayout(this) && scrollRange < 0) return height;
+ return (int) (mTrackPaddingTop + ((height * scrollPercents) / 100));
+ }
+
+ private void onScrolled(float eventY) {
+ int width = getWidth();
+ int height = getHeight();
+ int scrollPosition = (int) eventY;
+ updateTrackPosition(height, width, scrollPosition);
+ updateBubblePosition(height, width, scrollPosition);
+ invalidate();
+ }
+
+ private void updateTrackPosition(int screenHeight, int screenWidth, int scrollPosition) {
+ boolean isAnimationRunning = mShowTrackAnimator.isRunning() || mHideTrackAnimator.isRunning();
+
+ Rect bounds = mTrackDrawable.getBounds();
+ int trackWidth = mTrackDrawable.getIntrinsicWidth();
+ int trackHeight = mTrackDrawable.getIntrinsicHeight();
+
+ int formattedTop = scrollPosition < mTrackPaddingTop ? mTrackPaddingTop : scrollPosition;
+ if (formattedTop + trackHeight + mTrackPaddingBottom >= screenHeight) {
+ formattedTop = screenHeight - trackHeight - mTrackPaddingBottom;
+ }
+ int bottom = formattedTop + trackHeight;
+
+ int left = 0;
+ int right = 0;
+ switch (mPosition) {
+ case LEFT:
+ left = isAnimationRunning ? bounds.left : mTrackPaddingLeft;
+ right = isAnimationRunning ? bounds.right : mTrackPaddingLeft + trackWidth;
+ break;
+ case RIGHT:
+ left = isAnimationRunning ? bounds.left : (screenWidth - mTrackPaddingRight - trackWidth);
+ right = isAnimationRunning ? bounds.right : (screenWidth - mTrackPaddingRight);
+ break;
+ }
+ mTrackDrawable.setBounds(left, formattedTop, right, bottom);
+ }
+
+ private void updateBubblePosition(int screenHeight, int screenWidth, int scrollPosition) {
+ int halfScreenHeight = screenHeight / 2;
+ boolean isHalfScrolled = scrollPosition + (mTrackDrawable.getIntrinsicHeight() / 2) >= halfScreenHeight;
+ mBubbleDrawable = isHalfScrolled ? mBubbleDownDrawable : mBubbleUpDrawable;
+
+ int intrinsicWidth = mBubbleDrawable.getIntrinsicWidth();
+ int intrinsicHeight = mBubbleDrawable.getIntrinsicHeight();
+ int trackCenterY = mTrackDrawable.getBounds().centerY();
+ int trackWidth = mTrackDrawable.getIntrinsicWidth() + mTrackPaddingLeft + mTrackPaddingRight;
+
+ int top = isHalfScrolled ? trackCenterY - intrinsicHeight : trackCenterY;
+ int bottom = top + intrinsicHeight;
+ switch (mPosition) {
+ case LEFT:
+ mBubbleDrawable.setBounds(trackWidth, top, trackWidth + intrinsicWidth, bottom);
+ break;
+ case RIGHT:
+ mBubbleDrawable.setBounds(screenWidth - trackWidth - intrinsicWidth, top, screenWidth - trackWidth, bottom);
+ break;
+ }
+ }
+
+ private boolean isShowScrollbar() {
+ return (mElementsVisibility & FastScrollVisibility.SCROLLBAR) == FastScrollVisibility.SCROLLBAR;
+ }
+
+ private boolean isShowTrack() {
+ return (mElementsVisibility & FastScrollVisibility.TRACK) == FastScrollVisibility.TRACK;
+ }
+
+ private boolean isShowBubble() {
+ return (mElementsVisibility & FastScrollVisibility.BUBBLE) == FastScrollVisibility.BUBBLE;
+ }
+
+ private boolean isAutoHideScrollbar() {
+ return (mAutoHide & FastScrollAutoHide.SCROLLBAR) == FastScrollAutoHide.SCROLLBAR;
+ }
+
+ private boolean isAutoHideTrack() {
+ return (mAutoHide & FastScrollAutoHide.TRACK) == FastScrollAutoHide.TRACK;
+ }
+
+ private boolean isAutoHideBubble() {
+ return (mAutoHide & FastScrollAutoHide.BUBBLE) == FastScrollAutoHide.BUBBLE;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ super.draw(canvas);
+ RecyclerView.Adapter adapter = getAdapter();
+ if (adapter == null || adapter.getItemCount() == 0) return;
+
+ if (isShowScrollbar()) canvas.drawRect(mScrollbarBounds, mScrollbarPaint);
+ if (isShowTrack()) mTrackDrawable.draw(canvas);
+ if (isShowBubble() && mBubbleDrawable != null) {
+ mBubbleDrawable.draw(canvas);
+ if (mIsBubbleVisible || mShowBubbleAnimator.isRunning() || mHideBubbleAnimator.isRunning()) {
+ drawBubbleContent(canvas);
+ }
+ }
+ }
+
+ private void drawBubbleContent(Canvas canvas) {
+ FastScrollAdapter adapter = getFastScrollAdapter();
+ if (adapter == null) return;
+ LayoutManager layoutManager = getLayoutManager();
+ if (!(layoutManager instanceof LinearLayoutManager)) return;
+ int position = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
+ if (position == RecyclerView.NO_POSITION) return;
+
+ if (adapter instanceof FastScrollAdapter.Text) {
+ drawText(canvas, ((FastScrollAdapter.Text) adapter).getText(position));
+ } else if (adapter instanceof FastScrollAdapter.ViewHolder) {
+ drawGroupViewHolder(canvas, (FastScrollAdapter.ViewHolder) adapter, position);
+ }
+ }
+
+ private void drawText(Canvas canvas, @Nullable String text) {
+ if (text == null || mBubbleDrawable == null) return;
+ Rect bubbleBounds = mBubbleDrawable.getBounds();
+ int centerY = bubbleBounds.centerY();
+ int centerX = bubbleBounds.centerX();
+ mTextPaint.getTextBounds(text, 0, text.length(), mTextBounds);
+ mTextPaint.setAlpha(DrawableUtils.getAlpha(mBubbleDrawable));
+ canvas.drawText(text, centerX, centerY + (mTextBounds.height() / 2F), mTextPaint);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void drawGroupViewHolder(Canvas canvas, FastScrollAdapter.ViewHolder adapter, int position) {
+ if (mBubbleDrawable == null) return;
+ Rect bounds = mBubbleDrawable.getBounds();
+
+ long groupId = adapter.getFastScrollGroupId(position);
+ RecyclerView.ViewHolder viewHolder = mHolderSparseArray.get((int) groupId);
+ if (viewHolder == null) {
+ viewHolder = adapter.onCreateFastScrollViewHolder(this);
+ if (viewHolder == null) return;
+
+ mHolderSparseArray.put((int) groupId, viewHolder);
+ View itemView = viewHolder.itemView;
+
+ int width = mBubbleDrawable.getIntrinsicWidth();
+ int height = mBubbleUpDrawable.getIntrinsicHeight();
+ int widthSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY);
+ int heightSpec = MeasureSpec.makeMeasureSpec(height, EXACTLY);
+ itemView.measure(widthSpec, heightSpec);
+ itemView.layout(0, 0, width, height);
+ }
+ adapter.onBindFastScrollViewHolder(viewHolder, position);
+ View itemView = viewHolder.itemView;
+
+ canvas.save();
+ int alpha = DrawableUtils.getAlpha(mBubbleDrawable);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ canvas.saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha);
+ } else {
+ Drawable backgroundDrawable = itemView.getBackground();
+ if (backgroundDrawable != null) backgroundDrawable.setAlpha(alpha);
+ }
+ canvas.translate(bounds.left, bounds.top);
+ itemView.setTranslationX(bounds.left);
+ itemView.setTranslationY(bounds.top);
+ itemView.draw(canvas);
+ canvas.restore();
+ }
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/Position.java b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/Position.java
new file mode 100644
index 0000000..748f223
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/java/com/omega_r/libs/omegarecyclerview_fastscroll/Position.java
@@ -0,0 +1,8 @@
+package com.omega_r.libs.omegarecyclerview_fastscroll;
+
+enum Position {
+
+ LEFT,
+ RIGHT
+
+}
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_left.xml b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_left.xml
new file mode 100644
index 0000000..56e029c
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_left.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_right.xml b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_right.xml
new file mode 100644
index 0000000..d23d12d
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_down_right.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_left.xml b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_left.xml
new file mode 100644
index 0000000..d717a3f
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_left.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_right.xml b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_right.xml
new file mode 100644
index 0000000..7de4aab
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_bubble_up_right.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/omegarecyclerview_fastscroll/src/main/res/drawable/ic_track.xml b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_track.xml
new file mode 100644
index 0000000..89bc1cd
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/drawable/ic_track.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/res/values/attrs.xml b/omegarecyclerview_fastscroll/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..1709fb4
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/values/attrs.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/omegarecyclerview_fastscroll/src/main/res/values/colors.xml b/omegarecyclerview_fastscroll/src/main/res/values/colors.xml
new file mode 100644
index 0000000..0bc2c14
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+
+ #777777
+
+
\ No newline at end of file
diff --git a/omegarecyclerview_fastscroll/src/main/res/values/dimens.xml b/omegarecyclerview_fastscroll/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..40d6812
--- /dev/null
+++ b/omegarecyclerview_fastscroll/src/main/res/values/dimens.xml
@@ -0,0 +1,27 @@
+
+
+
+ 44dp
+ 88dp
+ 48sp
+ 16dp
+
+ 40dp
+ 4dp
+ 2dp
+
+ 1dp
+
+ 8dp
+ 8dp
+ 8dp
+ 8dp
+
+ 0dp
+ 4dp
+ 0dp
+ 0dp
+
+ 40sp
+
+
\ No newline at end of file
diff --git a/omegarecyclerviewlibs/build.gradle b/omegarecyclerviewlibs/build.gradle
deleted file mode 100644
index 7463550..0000000
--- a/omegarecyclerviewlibs/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-apply plugin: 'com.android.library'
-apply plugin: 'com.github.dcendents.android-maven'
-group = 'com.github.Omega-R'
-
-android {
- compileSdkVersion 28
- buildToolsVersion rootProject.buildToolsVersion
-
- defaultConfig {
- minSdkVersion 14
- targetSdkVersion 28
- versionCode 1
- versionName "1.0"
-
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-}
-
-dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "com.android.support:appcompat-v7:$rootProject.supportLibVersion"
- implementation "com.android.support:design:$rootProject.supportLibVersion"
-
-}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/OnAnimationEndListener.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/OnAnimationEndListener.java
deleted file mode 100644
index 4575b26..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/animation/OnAnimationEndListener.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.animation;
-
-public interface OnAnimationEndListener {
- void onAnimationEnd();
-}
-
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableType.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableType.java
deleted file mode 100644
index f9bd527..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/ExpandableType.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
-
-public enum ExpandableType {
- GROUP, CHILD
-}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/UniqueIdProvider.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/UniqueIdProvider.java
deleted file mode 100644
index c1b08ee..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/expandable_recycler_view/data/UniqueIdProvider.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.expandable_recycler_view.data;
-
-public interface UniqueIdProvider {
- long provideUniqueId();
-}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/SpaceItemDecoration.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/SpaceItemDecoration.java
deleted file mode 100644
index 59dfa22..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/item_decoration/SpaceItemDecoration.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.item_decoration;
-
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-
-import com.omega_r.libs.omegarecyclerview.OmegaRecyclerView;
-import com.omega_r.libs.omegarecyclerview.item_decoration.decoration_helpers.DividerDecorationHelper;
-
-public class SpaceItemDecoration extends BaseItemDecoration {
-
- private final int space;
-
- public SpaceItemDecoration(int showDivider, int space) {
- super(showDivider);
- this.space = space;
- }
-
- @Override
- void getItemOffset(@NonNull Rect outRect, @NonNull RecyclerView parent,
- @NonNull DividerDecorationHelper helper, int position, int itemCount) {
- if (isShowBeginDivider() && position < 1 || position >= 1) helper.setStart(outRect, space);
- if (isShowEndDivider() && position == itemCount - 1) helper.setEnd(outRect, space);
- }
-
-}
-
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/BaseStickyHeaderDecoration.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/BaseStickyHeaderDecoration.java
deleted file mode 100644
index c4d25ec..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/BaseStickyHeaderDecoration.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.sticky_header;
-
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-import android.view.ViewGroup;
-
-public class BaseStickyHeaderDecoration extends StickyHeaderDecoration {
-
- private StickyHeaderAdapter mAdapter;
- private boolean mRenderInline;
-
- private int mItemSpace;
-
- public BaseStickyHeaderDecoration(StickyHeaderAdapter adapter) {
- this(adapter, false);
- }
-
- private BaseStickyHeaderDecoration(StickyHeaderAdapter adapter, boolean renderInline) {
- mAdapter = adapter;
- mRenderInline = renderInline;
- }
-
- @Override
- public void setStickyHeaderAdapter(StickyHeaderAdapter adapter) {
- mAdapter = adapter;
- }
-
- @Override
- public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
- int position = parent.getChildAdapterPosition(view);
- int headerHeight = 0;
-
- if (position != RecyclerView.NO_POSITION
- && hasHeader(position)
- && showHeaderAboveItem(parent, position)) {
-
- View header = getHeader(parent, position).itemView;
- headerHeight = getHeaderHeightForLayout(header) - mItemSpace;
- }
-
- outRect.set(0, headerHeight, 0, 0);
- }
-
- private boolean showHeaderAboveItem(RecyclerView parent, int position) {
- if (isReverseLayout(parent)) {
- int itemCount = parent.getLayoutManager().getItemCount();
- return position == (itemCount - 1) || mAdapter.getHeaderId(position + 1)
- != mAdapter.getHeaderId(position);
- } else {
- return position == 0 || mAdapter.getHeaderId(position - 1)
- != mAdapter.getHeaderId(position);
-
- }
- }
-
- private boolean hasHeader(int position) {
- return mAdapter.getHeaderId(position) != NO_HEADER_ID;
- }
-
- private RecyclerView.ViewHolder getHeader(RecyclerView parent, int position) {
- RecyclerView.ViewHolder holder = mAdapter.onCreateHeaderViewHolder(parent);
- View header = holder.itemView;
-
- //noinspection unchecked
- mAdapter.onBindHeaderViewHolder(holder, position);
-
- int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getMeasuredWidth(), View.MeasureSpec.EXACTLY);
- int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getMeasuredHeight(), View.MeasureSpec.UNSPECIFIED);
-
- int childWidth = ViewGroup.getChildMeasureSpec(widthSpec,
- parent.getPaddingLeft() + parent.getPaddingRight(), header.getLayoutParams().width);
- int childHeight = ViewGroup.getChildMeasureSpec(heightSpec,
- parent.getPaddingTop() + parent.getPaddingBottom(), header.getLayoutParams().height);
-
- header.measure(childWidth, childHeight);
- header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight());
-
- return holder;
- }
-
- @Override
- public void onDrawOver(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
- int count = parent.getChildCount();
- long previousHeaderId = -1;
-
- if (isReverseLayout(parent)) {
- for (int layoutPos = count - 1; layoutPos >= 0; layoutPos--) {
- previousHeaderId = calculateHeaderIdAndDrawHeader(canvas, parent, true, layoutPos, previousHeaderId);
- }
- } else {
- for (int layoutPos = 0; layoutPos < count; layoutPos++) {
- previousHeaderId = calculateHeaderIdAndDrawHeader(canvas, parent, false, layoutPos, previousHeaderId);
- }
- }
- }
-
- private long calculateHeaderIdAndDrawHeader(Canvas canvas, RecyclerView parent,
- boolean isReverseLayout,
- int layoutPos, long previousHeaderId) {
- View child = parent.getChildAt(layoutPos);
- int adapterPos = parent.getChildAdapterPosition(child);
-
- if (adapterPos != RecyclerView.NO_POSITION && hasHeader(adapterPos)) {
- long headerId = mAdapter.getHeaderId(adapterPos);
-
- if (headerId != previousHeaderId) {
- previousHeaderId = headerId;
- View header = getHeader(parent, adapterPos).itemView;
- canvas.save();
-
- int left = child.getLeft();
- int top = getHeaderTop(parent, isReverseLayout, child, header, adapterPos, layoutPos);
- canvas.translate(left, top);
-
- header.setTranslationX(left);
- header.setTranslationY(top);
- header.draw(canvas);
- canvas.restore();
- }
- }
-
- return previousHeaderId;
- }
-
- private int getHeaderTop(RecyclerView parent, boolean isReverseLayout, View child, View header, int adapterPos, int layoutPos) {
- int childCount = parent.getChildCount();
- int headerHeight = getHeaderHeightForLayout(header);
- int top = ((int) child.getY()) - headerHeight;
- long currentHeaderId = mAdapter.getHeaderId(adapterPos);
-
- if (isReverseLayout && layoutPos == childCount - 1) {
- for (int i = childCount - 1; i >= 1; i--) {
- int offset = calculateOffset(parent, headerHeight, currentHeaderId, i);
- if (offset < 0) {
- return offset;
- }
- }
- } else if (!isReverseLayout && layoutPos == 0) {
- for (int i = 1; i < childCount; i++) {
- int offset = calculateOffset(parent, headerHeight, currentHeaderId, i);
- if (offset < 0) {
- return offset;
- }
- }
- }
- return Math.max(0, top);
- }
-
- private int calculateOffset(RecyclerView parent, int headerHeight, long currentHeaderId, int nextPosition) {
- int adapterPosHere = parent.getChildAdapterPosition(parent.getChildAt(nextPosition));
- if (adapterPosHere != RecyclerView.NO_POSITION) {
- long nextId = mAdapter.getHeaderId(adapterPosHere);
- if (nextId != currentHeaderId && nextId != NO_HEADER_ID) {
- View next = parent.getChildAt(nextPosition);
- return ((int) next.getY()) - (headerHeight + getHeader(parent, adapterPosHere).itemView.getHeight());
- }
- }
- return 0;
- }
-
- @Override
- public void setItemSpace(int itemSpace) {
- mItemSpace = itemSpace;
- }
-
- private int getHeaderHeightForLayout(View header) {
- return mRenderInline ? 0 : header.getHeight();
- }
-}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderAdapter.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderAdapter.java
deleted file mode 100644
index d46bd6d..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderAdapter.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.sticky_header;
-
-import android.support.v7.widget.RecyclerView;
-import android.view.ViewGroup;
-
-public interface StickyHeaderAdapter {
-
- long getHeaderId(int position);
-
- T onCreateHeaderViewHolder(ViewGroup parent);
-
- void onBindHeaderViewHolder(T viewHolder, int position);
-}
diff --git a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderDecoration.java b/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderDecoration.java
deleted file mode 100644
index 555bff8..0000000
--- a/omegarecyclerviewlibs/src/main/java/com/omega_r/libs/omegarecyclerview/sticky_header/StickyHeaderDecoration.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.omega_r.libs.omegarecyclerview.sticky_header;
-
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-
-public abstract class StickyHeaderDecoration extends RecyclerView.ItemDecoration {
-
- public static final long NO_HEADER_ID = -1L;
-
- public abstract void setStickyHeaderAdapter(StickyHeaderAdapter adapter);
- public abstract void setItemSpace(int itemSpace);
-
- protected boolean isReverseLayout(RecyclerView parent) {
- RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
- if (layoutManager instanceof LinearLayoutManager) {
- return ((LinearLayoutManager) layoutManager).getReverseLayout();
- }
- return false;
- }
-}
diff --git a/settings.gradle b/settings.gradle
index 4a913a2..03651e5 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':omegarecyclerviewlibs'
+include ':app', ':omegarecyclerview', ':omegarecyclerview_fastscroll', ':omegarecyclerview_expandable'