From 6a799d271fc25ea8f850ecb5155308b5d72b6d3d Mon Sep 17 00:00:00 2001
From: jngbin <770413277@qq.com>
Date: Tue, 12 Jul 2022 14:50:25 +0800
Subject: [PATCH] =?UTF-8?q?add=20demo=20CoordinatorLayout=20=E5=B5=8C?=
=?UTF-8?q?=E5=A5=97=E6=BB=91=E5=8A=A8=E7=BD=AE=E9=A1=B6(=E5=8E=9F?=
=?UTF-8?q?=E5=A7=8B=E6=96=B9=E6=A1=88)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 1 +
.../java/me/jingbin/byrecyclerview/App.java | 9 ++
.../jingbin/byrecyclerview/MainActivity.java | 7 +-
.../activity/StickyRvCoordinatorActivity.java | 4 +
.../StickyRvCoordinatorOriginalActivity.java | 76 ++++++++++++
.../fragment/CoordinatorOriginalFragment.java | 110 ++++++++++++++++++
.../activity_sticky_rv_coord_original.xml | 76 ++++++++++++
7 files changed, 282 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorOriginalActivity.java
create mode 100644 app/src/main/java/me/jingbin/byrecyclerview/fragment/CoordinatorOriginalFragment.java
create mode 100644 app/src/main/res/layout/activity_sticky_rv_coord_original.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 917e66a..de7139e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,6 +47,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/me/jingbin/byrecyclerview/App.java b/app/src/main/java/me/jingbin/byrecyclerview/App.java
index f43ea15..8513b7c 100644
--- a/app/src/main/java/me/jingbin/byrecyclerview/App.java
+++ b/app/src/main/java/me/jingbin/byrecyclerview/App.java
@@ -5,6 +5,8 @@
import androidx.multidex.MultiDexApplication;
+import me.weishu.reflection.Reflection;
+
public class App extends MultiDexApplication {
@@ -19,4 +21,11 @@ public void onCreate() {
public static Context getContext() {
return mContext;
}
+
+ @Override
+ protected void attachBaseContext(Context base) {
+ super.attachBaseContext(base);
+ // https://github.com/tiann/FreeReflection,解决[CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)]反射问题
+ Reflection.unseal(base);
+ }
}
diff --git a/app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java b/app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java
index b5ac630..97a3358 100644
--- a/app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java
+++ b/app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java
@@ -26,6 +26,7 @@
import me.jingbin.byrecyclerview.activity.StickyRvCoordinatorActivity;
import me.jingbin.byrecyclerview.activity.StickyItemActivity;
import me.jingbin.byrecyclerview.activity.StickyRvActivity;
+import me.jingbin.byrecyclerview.activity.StickyRvCoordinatorOriginalActivity;
import me.jingbin.byrecyclerview.databinding.ActivityMainBinding;
import me.jingbin.byrecyclerview.utils.WebUtil;
import me.jingbin.library.adapter.BaseByViewHolder;
@@ -53,7 +54,8 @@ public class MainActivity extends AppCompatActivity {
"CoordinatorLayout + RecyclerView 使用示例",
"FlexboxLayoutManager 显示处理",
"RecyclerView 嵌套滑动置顶",
- "CoordinatorLayout 嵌套滑动置顶"
+ "CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)",
+ "CoordinatorLayout 嵌套滑动置顶(原始方案)"
);
private ActivityMainBinding binding;
@@ -121,6 +123,9 @@ public void onSingleClick(View v, int position) {
case 13:// CoordinatorLayout 嵌套滑动置顶
startActivity(new Intent(MainActivity.this, StickyRvCoordinatorActivity.class));
break;
+ case 14:// CoordinatorLayout 嵌套滑动置顶
+ startActivity(new Intent(MainActivity.this, StickyRvCoordinatorOriginalActivity.class));
+ break;
default:
break;
diff --git a/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorActivity.java b/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorActivity.java
index f1ef68e..03b35b1 100644
--- a/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorActivity.java
+++ b/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorActivity.java
@@ -17,6 +17,10 @@
/**
* @author jingbin
+ * CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)
+ * 如要惯性滑动,即滑动头部布局不置顶,现要求其一:
+ * 1、targetSdkVersion 在30以下。因为HookedScroller反射失败
+ * 2、集成三方库:https://github.com/tiann/FreeReflection,需要minSdkVersion 21
*/
public class StickyRvCoordinatorActivity extends BaseActivity {
diff --git a/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorOriginalActivity.java b/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorOriginalActivity.java
new file mode 100644
index 0000000..e93940e
--- /dev/null
+++ b/app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorOriginalActivity.java
@@ -0,0 +1,76 @@
+package me.jingbin.byrecyclerview.activity;
+
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+
+import com.scwang.smartrefresh.layout.api.RefreshLayout;
+import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+
+import me.jingbin.byrecyclerview.R;
+import me.jingbin.byrecyclerview.app.BaseActivity;
+import me.jingbin.byrecyclerview.databinding.ActivityStickyRvCoordBinding;
+import me.jingbin.byrecyclerview.databinding.ActivityStickyRvCoordOriginalBinding;
+import me.jingbin.byrecyclerview.fragment.CoordinatorOriginalFragment;
+import me.jingbin.byrecyclerview.fragment.RefreshFragment;
+import me.jingbin.byrecyclerview.fragment.SwipeRefreshFragment;
+import me.jingbin.byrecyclerview.stickrvcool.config.FeedsPagerAdapter;
+import me.jingbin.byrecyclerview.stickrvcool.config.HomeIndicatorHelper;
+import me.jingbin.byrecyclerview.view.MyFragmentPagerAdapter;
+
+/**
+ * @author jingbin
+ * CoordinatorLayout 嵌套滑动置顶(原始方案)
+ */
+public class StickyRvCoordinatorOriginalActivity extends BaseActivity {
+
+ private final ArrayList mTitleList = new ArrayList<>(5);
+ private final ArrayList mFragments = new ArrayList<>(5);
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_sticky_rv_coord_original);
+ setTitle("CoordinatorLayout 嵌套滑动置顶");
+ initView();
+ }
+
+ private void initView() {
+ initFragmentList();
+ MyFragmentPagerAdapter myAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), mFragments, mTitleList);
+ binding.viewPager.setAdapter(myAdapter);
+ binding.viewPager.setOffscreenPageLimit(mTitleList.size() - 1);
+ myAdapter.notifyDataSetChanged();
+ binding.tabLayout.setupWithViewPager(binding.viewPager);
+ binding.mainRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
+ @Override
+ public void onRefresh(@NonNull @NotNull RefreshLayout refreshLayout) {
+ binding.mainRefreshLayout.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ binding.mainRefreshLayout.finishRefresh();
+ }
+ }, 1000);
+ }
+ });
+ }
+
+ private void initFragmentList() {
+ mTitleList.clear();
+ mTitleList.add("关注");
+ mTitleList.add("推荐");
+ mTitleList.add("直播");
+ mTitleList.add("进口");
+ mTitleList.add("实惠");
+ mFragments.add(CoordinatorOriginalFragment.newInstance(""));
+ mFragments.add(CoordinatorOriginalFragment.newInstance(""));
+ mFragments.add(CoordinatorOriginalFragment.newInstance(""));
+ mFragments.add(CoordinatorOriginalFragment.newInstance(""));
+ mFragments.add(CoordinatorOriginalFragment.newInstance(""));
+ }
+}
diff --git a/app/src/main/java/me/jingbin/byrecyclerview/fragment/CoordinatorOriginalFragment.java b/app/src/main/java/me/jingbin/byrecyclerview/fragment/CoordinatorOriginalFragment.java
new file mode 100644
index 0000000..61ae722
--- /dev/null
+++ b/app/src/main/java/me/jingbin/byrecyclerview/fragment/CoordinatorOriginalFragment.java
@@ -0,0 +1,110 @@
+package me.jingbin.byrecyclerview.fragment;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.StaggeredGridLayoutManager;
+
+import me.jingbin.byrecyclerview.R;
+import me.jingbin.byrecyclerview.adapter.DataAdapter;
+import me.jingbin.byrecyclerview.adapter.FeedStaggerAdapter;
+import me.jingbin.byrecyclerview.bean.DataItemBean;
+import me.jingbin.byrecyclerview.databinding.FragmentRefreshBinding;
+import me.jingbin.byrecyclerview.utils.DataUtil;
+import me.jingbin.byrecyclerview.utils.DensityUtil;
+import me.jingbin.byrecyclerview.utils.ToastUtil;
+import me.jingbin.library.ByRecyclerView;
+import me.jingbin.library.decoration.GridSpaceItemDecoration;
+import me.jingbin.library.decoration.SpacesItemDecoration;
+import me.jingbin.library.view.OnItemFilterClickListener;
+
+/**
+ * @author jingbin
+ */
+public class CoordinatorOriginalFragment extends BaseFragment {
+
+ private static final String TYPE = "mType";
+ private String mType = "Android";
+ private boolean mIsPrepared;
+ private boolean mIsFirst = true;
+ private FeedStaggerAdapter feedStaggerAdapter;
+ private int page = 0;
+
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ }
+
+ public static CoordinatorOriginalFragment newInstance(String type) {
+ CoordinatorOriginalFragment fragment = new CoordinatorOriginalFragment();
+ Bundle args = new Bundle();
+ args.putString(TYPE, type);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mType = getArguments().getString(TYPE);
+ }
+ }
+
+ @Override
+ public int setContent() {
+ return R.layout.fragment_refresh;
+ }
+
+ @Override
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ // 准备就绪
+ mIsPrepared = true;
+ initAdapter();
+ }
+
+ @Override
+ protected void loadData() {
+ if (!mIsPrepared || !mIsVisible || !mIsFirst) {
+ return;
+ }
+ initAdapter();
+ }
+
+ private void initAdapter() {
+ binding.recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL));
+ binding.recyclerView.addItemDecoration(new GridSpaceItemDecoration(DensityUtil.dip2px(activity, 8f)));
+ feedStaggerAdapter = new FeedStaggerAdapter((DataUtil.getStickyData()));
+ binding.recyclerView.setAdapter(feedStaggerAdapter);
+ binding.recyclerView.setOnItemClickListener(new OnItemFilterClickListener() {
+ @Override
+ protected void onSingleClick(View v, int position) {
+ if ("点我回到顶部".equals(feedStaggerAdapter.getItemData(position).getTitle())) {
+ binding.recyclerView.scrollToPosition(0);
+ }
+ }
+ });
+ // 设置自动刷新
+ binding.recyclerView.setOnLoadMoreListener(true, 1, new ByRecyclerView.OnLoadMoreListener() {
+ @Override
+ public void onLoadMore() {
+ if (page == 2) {
+ binding.recyclerView.loadMoreEnd();
+ return;
+ }
+ page = 2;
+ feedStaggerAdapter.addData(DataUtil.getStickyData());
+ binding.recyclerView.loadMoreComplete();
+ }
+ }, 1000);
+
+ mIsFirst = false;
+ }
+}
diff --git a/app/src/main/res/layout/activity_sticky_rv_coord_original.xml b/app/src/main/res/layout/activity_sticky_rv_coord_original.xml
new file mode 100644
index 0000000..bb39ba0
--- /dev/null
+++ b/app/src/main/res/layout/activity_sticky_rv_coord_original.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file