原理

RecyclerView嵌套RecyclerView的条目,项目中可能会经常有这样的需求,但是我们将子条目设置为RecyclerView之后,却显示不出来。自己试了很久,终于找到了原因:必须先设置子RecylcerView的高度。你要花精力确定出子RecyclerView里面条目的高度,然后从而确定子RecyclerView的高度,设置给子RecylcerView,这样做RecyclerView就可以正确显示出子ReclyclerView。

效果

代码

首页布局就是一个竖直排列的RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recylcerview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

接下来在MainActivity对该布局进行初始化,然后制造一些假数据

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
basicParamInit();
initData();
initRecyclerView();
} private void basicParamInit() {
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric); screenWidth = metric.widthPixels; }
private void initData() {
data = new DataInfor();
ArrayList<Integer> resourceList =new ArrayList<>(); resourceList.add(R.drawable.aaa);
resourceList.add(R.mipmap.ic_launcher);
resourceList.add(R.drawable.aaa);
resourceList.add(R.mipmap.ic_launcher);
resourceList.add(R.drawable.aaa);
resourceList.add(R.mipmap.ic_launcher);
resourceList.add(R.drawable.aaa);
resourceList.add(R.mipmap.ic_launcher); data.gridData = data.horizontalData = data.verticalData = resourceList; } private void initRecyclerView() {
recylcerview = (RecyclerView) findViewById(R.id.recylcerview); recylcerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false)); recylcerview.setBackgroundResource(R.color.c_e0e0e2); recylcerview.setAdapter(new RecyclerViewAdapter());
}

接下来看看RecyclerView的Adapter:

private class RecyclerViewAdapter extends RecyclerView.Adapter<BaseHolder>{
private final int HORIZONTAL_VIEW = ;
private final int VERTICAL_VIEW = ;
private final int GRID_VIEW = ; @Override
public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case HORIZONTAL_VIEW:
return new HorizontalViewHolder(R.layout.item_recyclerview,parent,viewType);
case GRID_VIEW:
return new GridViewHolder(R.layout.item_recyclerview,parent,viewType);
case VERTICAL_VIEW:
return new ItemViewHolder(R.layout.item_x2_imageview,parent,viewType);
}
return null;
} @Override
public void onBindViewHolder(BaseHolder holder, int position) {
if(holder instanceof HorizontalViewHolder){
holder.refreshData(data.horizontalData,position);
}else if(holder instanceof GridViewHolder){
holder.refreshData(data.gridData,position);
}else if(holder instanceof ItemViewHolder){
holder.refreshData(data.verticalData.get(position - ),position - );
} } @Override
public int getItemCount() {
return + data.verticalData.size();
} @Override
public int getItemViewType(int position) {
if(position == ) return HORIZONTAL_VIEW;
if(position == ) return GRID_VIEW;
return VERTICAL_VIEW;
}
}

可以看出,我们一共有三种条目类型,第一种是水平滑动的子RecyclerView,第二种是GridView形的子RecyclerView,第三种就是正常的子条目,根据viewType来返回不同的ViewHolder,到这里应该都没什么问题。

接下来就是各个类型的ViewHolder了,在Holder当中,我们要计算条目的高度然后设置给子RecyclerView

private class GridViewHolder extends BaseHolder<List<Integer>>{

        private RecyclerView item_recyclerview;

        private final int ONE_LINE_SHOW_NUMBER = ;

        private List<Integer> data;

        public GridViewHolder(int viewId, ViewGroup parent, int viewType) {
super(viewId, parent, viewType);
item_recyclerview = (RecyclerView) itemView.findViewById(R.id.item_recyclerview); } @Override
public void refreshData(List<Integer> data, int position) {
super.refreshData(data, position);
this.data = data;
//每行显示3个,水平显示
item_recyclerview.setLayoutManager(new GridLayoutManager(MainActivity.this,ONE_LINE_SHOW_NUMBER,LinearLayoutManager.HORIZONTAL,false)); ViewGroup.LayoutParams layoutParams = item_recyclerview.getLayoutParams();
//计算行数
int lineNumber = data.size()%ONE_LINE_SHOW_NUMBER==? data.size()/ONE_LINE_SHOW_NUMBER:data.size()/ONE_LINE_SHOW_NUMBER +;
//计算高度=行数*每行的高度 +(行数-1)*10dp的margin + 10dp(为了居中)
//因为每行显示3个条目,为了保持正方形,那么高度应该是也是宽度/3
//高度的计算需要自己好好理解,否则会产生嵌套recyclerView可以滑动的现象
layoutParams.height = lineNumber *(screenWidth/) + (lineNumber-)*dip2px() + dip2px(); item_recyclerview.setLayoutParams(layoutParams); item_recyclerview.setBackgroundResource(R.color.colorPrimary); item_recyclerview.setAdapter(new GridAdapter());
} private class GridAdapter extends RecyclerView.Adapter<BaseHolder>{ @Override
public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ItemViewHolder(R.layout.item_x2_imageview,parent,viewType);
} @Override
public void onBindViewHolder(BaseHolder holder, int position) {
holder.refreshData(data.get(position),position);
} @Override
public int getItemCount() {
return data.size();
}
} }

其他代码我就不贴了,想要看源码的可以直接下载: 
https://github.com/z593492734/nesting-recylcerview

总体来说,RecyclerView嵌套RecyclerView是很简单的,而且也相当好用,希望这个demo可以给大家一些灵感。

Android RecyclerView嵌套RecyclerView的更多相关文章

  1. Android Scrollview嵌套RecyclerView导致滑动卡顿问题解决

    一个比较长的界面一般都是Scrollview嵌套RecyclerView来解决.不过这样的UI并不是我们开发人员想看到的,实际上嵌套之后.因为Scrollview和RecyclerView都是滑动控件 ...

  2. Android ScrollView嵌套RecyclerView导致在三星s8曲面屏显示不全问题

    当RecyclerView适配显示不全时可以单独给其嵌套一个相对布局!!!(必须是相对布局),这样在曲面屏手机就可以全部显示出来如下图所示 <RelativeLayout android:lay ...

  3. Android ScrollView嵌套Recyclerview滑动卡顿,松手即停问题解决;

    假如你的布局类似这样的: <ScrollView android:layout_width="match_parent" android:layout_height=&quo ...

  4. RecyclerView嵌套RecyclerView

    ListView嵌套GridView http://blog.csdn.net/baiyuliang2013/article/details/42646289 RecyclerView下拉刷新上拉加载 ...

  5. recyclerView 嵌套 recyclerView 点击被拦截

    上层recyclerView.setLayoutFrozen(true);下层可以接收到点击事件.

  6. Android在开发中的使用技巧之解决ScrollView嵌套RecyclerView出现的系列问题

    根据已上线的app里总结出来的实用小技巧 相信大家都遇到过ScrollView嵌套RecyclerView或者RecyclerView嵌套RecyclerView来使用, 也会遇到一堆奇奇怪怪的问题, ...

  7. Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题

    标签:scrollview   android   滑动   嵌套 scrollview 嵌套recyclerview 时,recyclerview不显示,这就需要我们自己计算recyclerview ...

  8. Android 6.0+ RecyclerView嵌套在ScrollView中显示不全

    ScrollView嵌套RecyclerView在Android6.0以下能正常显示,但是在6.0以上就会出现RecyclerView显示不全的bug.尝试多种方法之后终于找到解决办法,特在此记录下. ...

  9. Android NestedScrollView与RecyclerView嵌套,以及NestedScrollView不会滚动到屏幕顶部解决

    ①NestedScrollView与RecyclerView嵌套,导致滚动惯性消失 解决:mRecyclerView.setNestedScrollingEnabled(false); ②Nested ...

随机推荐

  1. 15:Challenge 11(主席树裸题)

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求 ...

  2. 开源计算机集群监控Ganglia应用视频

    Ganglia源于Berkeley发起的一个开源集群监视项目,设计用于监测数上千节点的计算机集群.它包含gmond.gmetad以及一个Web前端.可以用来监控系统处理器 .内存.硬盘 I/O.网络流 ...

  3. Android控件-Fragment+ViewPager(高仿微信界面)

    什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...

  4. Swift学习笔记(14)--方法

    1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方 ...

  5. POJ——T 2299 Ultra-QuickSort

    http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 62894   ...

  6. js实现table排序(jQuery下的jquery.sortElements)

    项目中要实现table排序的功能. 网上有非常多解决方式,非常多都基于jQuery. jquery.tablesorter.大小17KB.只是他的首页在ie10下兼容性有点问题. DataTables ...

  7. HDU 5375 Gray code(DP)

    题意:给一串字符串,里面可能出现0,1,?,当中问号可能为0或1,将这个二进制转换为格雷码后,格雷码的每位有一个权值,当格雷码位取1时.加上该位权值,求最大权值和为多少. 分析:比赛的时候愚了.竟然以 ...

  8. 谈谈 .NET Reflector

    著名的 .NET Reflector 如今要收费了,价格还不低: .NET Reflector Standard: $95 .NET Reflector VS: $195 .NET Reflector ...

  9. thinkphp5多文件上传如何实现

    thinkphp5多文件上传如何实现 一.总结 一句话总结:官方文档,测试一下,一定要测试,打印中间变量,就知道每句话是什么意思,一定要测试一下.又简单有快. 测试一下,你就能确定中间变量和你的是不是 ...

  10. 浏览器(BOM)对象的一些内置方法总结

    浏览器(BOM)对象的一些内置方法总结 一.总结 1.bom就是浏览器那端执行的代码,dom就是服务器那端操作html的代码 2.记好bom的几个对象,那就很好理解很多代码了,也很好写很多代码了 二. ...