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