项目中有时候会让一个界面出现多个RecyclerView来进行嵌套的情况,如淘宝,京东首页的界面。
当我们自己的应用的页面和淘宝、京东首页效果类似,上面为配置数据,中间是各种分类频道,下面是商品流数据,商品流部分支持左右横滑,分类频道是支持吸顶的。下面的左图是京东首页效果图,右图是自己实现的,也都能实现。先看效果图,后面介绍该框架的使用情况:
一、框架使用
(1)在项目的最外层build.gradle中的repositories 闭包中新增支持jitpack的库如下:
maven { url 'https://jitpack.io' }
(2)在app目录下的build.gradle的dependencies闭包中该框架的远程依赖添加(目前最新版本2.0.3):
implementation 'com.github.AndyYuan317:NestedVVRecyclerView:2.0.2'
然后点击Sync Now同步下载,AndroidStudio会自动下载该远程依赖,完成后在External Libraries中会出现如下图:
(3)这样基本集成就完成了,下面开始讲解使用,比如直接新建一个Demo只有Hello World!,打开主界面的xml文件改成如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true">
<!-- android:focusable="true"
android:focusableInTouchMode="true"
出现滚动的时候在外层获取焦点来实现初始化后的自动滚动-->
<com.andyyuan.nestedvvrecyclerview.java.view.ParentRecyclerView
android:id="@+id/javaRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never" />
</LinearLayout>
(4):主界面的代码为:
/**
* author : AndyYuan
* date : 2020/12/9 000915:02
* desc : 主界面,只有两层的RecyclerView嵌套
* version: 2.0
*/
public class MainJavaActivity extends AppCompatActivity {
//父类数据
ArrayList<Object> mDataList = new ArrayList<Object>();
//子类数据
ArrayList<String> mChildDataList = new ArrayList<>();
//子类Fragment
ArrayList<MyFragment> mChildFragmentList = new ArrayList<>();
MyMultiTypeAdapter adapter = new MyMultiTypeAdapter(this,mDataList, mChildDataList, getSupportFragmentManager());
//StoreSwipeRefreshLayout storeSwipeRefreshLayout;
//SmartRefreshLayout smartRefreshLayout;
private boolean isRefresh = false;
ParentRecyclerView javaRecyclerView;
Long lastBackPressedTime = 0L;
String[] strArray = new String[]{"推荐", "视频", "直播", "图片", "精华", "热门"};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
javaRecyclerView = findViewById(R.id.parent_recycler_view);
//storeSwipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
//smartRefreshLayout = findViewById(R.id.refreshLayout);
//设置是否启用越界拖动(仿苹果效果)
//smartRefreshLayout.setEnableOverScrollDrag(false);
//设置回弹动画市场
//smartRefreshLayout.setReboundDuration(50);
javaRecyclerView.setAdapter(adapter);
javaRecyclerView.initLayoutManager(this);
refresh();
}
@Override
public void onBackPressed() {
if (System.currentTimeMillis() - lastBackPressedTime < 2000) {
super.onBackPressed();
} else {
javaRecyclerView.scrollToPosition(0);
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
lastBackPressedTime = System.currentTimeMillis();
}
}
private void refresh() {
initParentData();
initChildData();
CategoryBean categoryBean = new CategoryBean();
categoryBean.getTabTitleList().clear();
categoryBean.getTabTitleList().addAll(Arrays.asList(strArray));
mDataList.add(categoryBean);
adapter.notifyDataSetChanged();
//storeSwipeRefreshLayout.setRefreshing(false);
//第一次滑动出现的卡顿问题
// javaRecyclerView.smoothScrollToPosition(adapter.getItemCount()-1);
// javaRecyclerView.smoothScrollToPosition(0);
//自己新增的,初始化进入会吸顶。
// 也可以直接在父布局中添加android:focusable="true"
// android:focusableInTouchMode="true"
//javaRecyclerView.smoothScrollToPosition(0);
}
//初始化父类数据
private void initParentData() {
mDataList.c