Skip to content

Commit 6a799d2

Browse files
committed
add demo CoordinatorLayout 嵌套滑动置顶(原始方案)
1 parent 96ff7c2 commit 6a799d2

File tree

7 files changed

+282
-1
lines changed

7 files changed

+282
-1
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<activity android:name=".activity.ItemPayloadActivity" />
4848
<activity android:name=".activity.LoadMoreActivity" />
4949
<activity android:name=".activity.StickyRvCoordinatorActivity" />
50+
<activity android:name=".activity.StickyRvCoordinatorOriginalActivity" />
5051
</application>
5152

5253
</manifest>

app/src/main/java/me/jingbin/byrecyclerview/App.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
import androidx.multidex.MultiDexApplication;
77

8+
import me.weishu.reflection.Reflection;
9+
810

911
public class App extends MultiDexApplication {
1012

@@ -19,4 +21,11 @@ public void onCreate() {
1921
public static Context getContext() {
2022
return mContext;
2123
}
24+
25+
@Override
26+
protected void attachBaseContext(Context base) {
27+
super.attachBaseContext(base);
28+
// https://github.com/tiann/FreeReflection,解决[CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)]反射问题
29+
Reflection.unseal(base);
30+
}
2231
}

app/src/main/java/me/jingbin/byrecyclerview/MainActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import me.jingbin.byrecyclerview.activity.StickyRvCoordinatorActivity;
2727
import me.jingbin.byrecyclerview.activity.StickyItemActivity;
2828
import me.jingbin.byrecyclerview.activity.StickyRvActivity;
29+
import me.jingbin.byrecyclerview.activity.StickyRvCoordinatorOriginalActivity;
2930
import me.jingbin.byrecyclerview.databinding.ActivityMainBinding;
3031
import me.jingbin.byrecyclerview.utils.WebUtil;
3132
import me.jingbin.library.adapter.BaseByViewHolder;
@@ -53,7 +54,8 @@ public class MainActivity extends AppCompatActivity {
5354
"CoordinatorLayout + RecyclerView 使用示例",
5455
"FlexboxLayoutManager 显示处理",
5556
"RecyclerView 嵌套滑动置顶",
56-
"CoordinatorLayout 嵌套滑动置顶"
57+
"CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)",
58+
"CoordinatorLayout 嵌套滑动置顶(原始方案)"
5759
);
5860
private ActivityMainBinding binding;
5961

@@ -121,6 +123,9 @@ public void onSingleClick(View v, int position) {
121123
case 13:// CoordinatorLayout 嵌套滑动置顶
122124
startActivity(new Intent(MainActivity.this, StickyRvCoordinatorActivity.class));
123125
break;
126+
case 14:// CoordinatorLayout 嵌套滑动置顶
127+
startActivity(new Intent(MainActivity.this, StickyRvCoordinatorOriginalActivity.class));
128+
break;
124129
default:
125130
break;
126131

app/src/main/java/me/jingbin/byrecyclerview/activity/StickyRvCoordinatorActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
/**
1919
* @author jingbin
20+
* CoordinatorLayout 嵌套滑动置顶(惯性滑动方案)
21+
* 如要惯性滑动,即滑动头部布局不置顶,现要求其一:
22+
* 1、targetSdkVersion 在30以下。因为HookedScroller反射失败
23+
* 2、集成三方库:https://github.com/tiann/FreeReflection,需要minSdkVersion 21
2024
*/
2125
public class StickyRvCoordinatorActivity extends BaseActivity<ActivityStickyRvCoordBinding> {
2226

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package me.jingbin.byrecyclerview.activity;
2+
3+
import android.os.Bundle;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.fragment.app.Fragment;
7+
8+
import com.scwang.smartrefresh.layout.api.RefreshLayout;
9+
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
10+
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.ArrayList;
14+
15+
import me.jingbin.byrecyclerview.R;
16+
import me.jingbin.byrecyclerview.app.BaseActivity;
17+
import me.jingbin.byrecyclerview.databinding.ActivityStickyRvCoordBinding;
18+
import me.jingbin.byrecyclerview.databinding.ActivityStickyRvCoordOriginalBinding;
19+
import me.jingbin.byrecyclerview.fragment.CoordinatorOriginalFragment;
20+
import me.jingbin.byrecyclerview.fragment.RefreshFragment;
21+
import me.jingbin.byrecyclerview.fragment.SwipeRefreshFragment;
22+
import me.jingbin.byrecyclerview.stickrvcool.config.FeedsPagerAdapter;
23+
import me.jingbin.byrecyclerview.stickrvcool.config.HomeIndicatorHelper;
24+
import me.jingbin.byrecyclerview.view.MyFragmentPagerAdapter;
25+
26+
/**
27+
* @author jingbin
28+
* CoordinatorLayout 嵌套滑动置顶(原始方案)
29+
*/
30+
public class StickyRvCoordinatorOriginalActivity extends BaseActivity<ActivityStickyRvCoordOriginalBinding> {
31+
32+
private final ArrayList<String> mTitleList = new ArrayList<>(5);
33+
private final ArrayList<Fragment> mFragments = new ArrayList<>(5);
34+
35+
@Override
36+
protected void onCreate(Bundle savedInstanceState) {
37+
super.onCreate(savedInstanceState);
38+
setContentView(R.layout.activity_sticky_rv_coord_original);
39+
setTitle("CoordinatorLayout 嵌套滑动置顶");
40+
initView();
41+
}
42+
43+
private void initView() {
44+
initFragmentList();
45+
MyFragmentPagerAdapter myAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), mFragments, mTitleList);
46+
binding.viewPager.setAdapter(myAdapter);
47+
binding.viewPager.setOffscreenPageLimit(mTitleList.size() - 1);
48+
myAdapter.notifyDataSetChanged();
49+
binding.tabLayout.setupWithViewPager(binding.viewPager);
50+
binding.mainRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
51+
@Override
52+
public void onRefresh(@NonNull @NotNull RefreshLayout refreshLayout) {
53+
binding.mainRefreshLayout.postDelayed(new Runnable() {
54+
@Override
55+
public void run() {
56+
binding.mainRefreshLayout.finishRefresh();
57+
}
58+
}, 1000);
59+
}
60+
});
61+
}
62+
63+
private void initFragmentList() {
64+
mTitleList.clear();
65+
mTitleList.add("关注");
66+
mTitleList.add("推荐");
67+
mTitleList.add("直播");
68+
mTitleList.add("进口");
69+
mTitleList.add("实惠");
70+
mFragments.add(CoordinatorOriginalFragment.newInstance(""));
71+
mFragments.add(CoordinatorOriginalFragment.newInstance(""));
72+
mFragments.add(CoordinatorOriginalFragment.newInstance(""));
73+
mFragments.add(CoordinatorOriginalFragment.newInstance(""));
74+
mFragments.add(CoordinatorOriginalFragment.newInstance(""));
75+
}
76+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package me.jingbin.byrecyclerview.fragment;
2+
3+
import android.content.Context;
4+
import android.os.Bundle;
5+
import android.view.View;
6+
7+
import androidx.annotation.Nullable;
8+
import androidx.recyclerview.widget.LinearLayoutManager;
9+
import androidx.recyclerview.widget.RecyclerView;
10+
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
11+
12+
import me.jingbin.byrecyclerview.R;
13+
import me.jingbin.byrecyclerview.adapter.DataAdapter;
14+
import me.jingbin.byrecyclerview.adapter.FeedStaggerAdapter;
15+
import me.jingbin.byrecyclerview.bean.DataItemBean;
16+
import me.jingbin.byrecyclerview.databinding.FragmentRefreshBinding;
17+
import me.jingbin.byrecyclerview.utils.DataUtil;
18+
import me.jingbin.byrecyclerview.utils.DensityUtil;
19+
import me.jingbin.byrecyclerview.utils.ToastUtil;
20+
import me.jingbin.library.ByRecyclerView;
21+
import me.jingbin.library.decoration.GridSpaceItemDecoration;
22+
import me.jingbin.library.decoration.SpacesItemDecoration;
23+
import me.jingbin.library.view.OnItemFilterClickListener;
24+
25+
/**
26+
* @author jingbin
27+
*/
28+
public class CoordinatorOriginalFragment extends BaseFragment<FragmentRefreshBinding> {
29+
30+
private static final String TYPE = "mType";
31+
private String mType = "Android";
32+
private boolean mIsPrepared;
33+
private boolean mIsFirst = true;
34+
private FeedStaggerAdapter feedStaggerAdapter;
35+
private int page = 0;
36+
37+
38+
@Override
39+
public void onAttach(Context context) {
40+
super.onAttach(context);
41+
}
42+
43+
public static CoordinatorOriginalFragment newInstance(String type) {
44+
CoordinatorOriginalFragment fragment = new CoordinatorOriginalFragment();
45+
Bundle args = new Bundle();
46+
args.putString(TYPE, type);
47+
fragment.setArguments(args);
48+
return fragment;
49+
}
50+
51+
@Override
52+
public void onCreate(Bundle savedInstanceState) {
53+
super.onCreate(savedInstanceState);
54+
if (getArguments() != null) {
55+
mType = getArguments().getString(TYPE);
56+
}
57+
}
58+
59+
@Override
60+
public int setContent() {
61+
return R.layout.fragment_refresh;
62+
}
63+
64+
@Override
65+
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
66+
super.onActivityCreated(savedInstanceState);
67+
68+
// 准备就绪
69+
mIsPrepared = true;
70+
initAdapter();
71+
}
72+
73+
@Override
74+
protected void loadData() {
75+
if (!mIsPrepared || !mIsVisible || !mIsFirst) {
76+
return;
77+
}
78+
initAdapter();
79+
}
80+
81+
private void initAdapter() {
82+
binding.recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL));
83+
binding.recyclerView.addItemDecoration(new GridSpaceItemDecoration(DensityUtil.dip2px(activity, 8f)));
84+
feedStaggerAdapter = new FeedStaggerAdapter((DataUtil.getStickyData()));
85+
binding.recyclerView.setAdapter(feedStaggerAdapter);
86+
binding.recyclerView.setOnItemClickListener(new OnItemFilterClickListener() {
87+
@Override
88+
protected void onSingleClick(View v, int position) {
89+
if ("点我回到顶部".equals(feedStaggerAdapter.getItemData(position).getTitle())) {
90+
binding.recyclerView.scrollToPosition(0);
91+
}
92+
}
93+
});
94+
// 设置自动刷新
95+
binding.recyclerView.setOnLoadMoreListener(true, 1, new ByRecyclerView.OnLoadMoreListener() {
96+
@Override
97+
public void onLoadMore() {
98+
if (page == 2) {
99+
binding.recyclerView.loadMoreEnd();
100+
return;
101+
}
102+
page = 2;
103+
feedStaggerAdapter.addData(DataUtil.getStickyData());
104+
binding.recyclerView.loadMoreComplete();
105+
}
106+
}, 1000);
107+
108+
mIsFirst = false;
109+
}
110+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<!--app:srlEnableOverScrollBounce="false" 关闭越界回弹功能-->
7+
<com.scwang.smartrefresh.layout.SmartRefreshLayout
8+
android:id="@+id/main_refresh_layout"
9+
android:layout_width="match_parent"
10+
android:layout_height="0dp"
11+
app:layout_constraintBottom_toBottomOf="parent"
12+
app:layout_constraintTop_toBottomOf="@+id/main_toolbar"
13+
app:srlAccentColor="#fff"
14+
app:srlReboundDuration="600">
15+
16+
<com.scwang.smartrefresh.layout.header.ClassicsHeader
17+
android:layout_width="match_parent"
18+
android:layout_height="wrap_content"
19+
app:srlAccentColor="@color/color_4"
20+
app:srlEnableLastTime="false" />
21+
22+
<!--coordinator部分-->
23+
<androidx.coordinatorlayout.widget.CoordinatorLayout
24+
android:id="@+id/main_coordinator_layout"
25+
android:layout_width="match_parent"
26+
android:layout_height="match_parent">
27+
28+
<com.google.android.material.appbar.AppBarLayout
29+
android:id="@+id/main_appbar_layout"
30+
android:layout_width="match_parent"
31+
android:layout_height="wrap_content"
32+
android:background="@android:color/transparent"
33+
android:fadingEdge="none"
34+
app:elevation="0dp"
35+
app:layout_behavior=".view.FlingBehavior"
36+
app:layout_scrollFlags="scroll|enterAlways"
37+
tools:ignore="WebViewLayout">
38+
39+
<androidx.constraintlayout.widget.ConstraintLayout
40+
android:layout_width="match_parent"
41+
android:layout_height="wrap_content"
42+
app:layout_scrollFlags="scroll|exitUntilCollapsed">
43+
44+
<include layout="@layout/layout_skeleton_headerview" />
45+
46+
</androidx.constraintlayout.widget.ConstraintLayout>
47+
48+
<com.google.android.material.tabs.TabLayout
49+
android:id="@+id/tabLayout"
50+
android:layout_width="match_parent"
51+
android:layout_height="48dp"
52+
android:layout_below="@+id/tv_name_tool"
53+
android:background="@color/colorWhite"
54+
android:visibility="visible"
55+
app:tabIndicatorColor="@color/colorPrimary"
56+
app:tabIndicatorHeight="2dp"
57+
app:tabMode="fixed"
58+
app:tabSelectedTextColor="@color/colorPrimary"
59+
app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget" />
60+
61+
</com.google.android.material.appbar.AppBarLayout>
62+
63+
<!--商品流-->
64+
<me.jingbin.byrecyclerview.view.ViewPagerFixed
65+
android:id="@+id/viewPager"
66+
android:layout_width="match_parent"
67+
android:layout_height="match_parent"
68+
android:background="#f3f3f3"
69+
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
70+
71+
</androidx.coordinatorlayout.widget.CoordinatorLayout>
72+
73+
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
74+
75+
76+
</layout>

0 commit comments

Comments
 (0)