Android RecyclerView嵌套RecyclerView

原理

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 = 1000;
        private final int VERTICAL_VIEW = 1001;
        private final int GRID_VIEW = 1002;

        @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 - 2),position - 2);
            }

        }

        @Override
        public int getItemCount() {
            return 2 + data.verticalData.size();
        }

        @Override
        public int getItemViewType(int position) {
            if(position == 0) return HORIZONTAL_VIEW;
            if(position == 1) 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 = 3;

        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==0? data.size()/ONE_LINE_SHOW_NUMBER:data.size()/ONE_LINE_SHOW_NUMBER +1;
            //计算高度=行数*每行的高度 +(行数-1)*10dp的margin + 10dp(为了居中)
            //因为每行显示3个条目,为了保持正方形,那么高度应该是也是宽度/3
            //高度的计算需要自己好好理解,否则会产生嵌套recyclerView可以滑动的现象
            layoutParams.height = lineNumber *(screenWidth/3) + (lineNumber-1)*dip2px(10) + dip2px(10);

            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可以给大家一些灵感。

时间: 2024-08-21 04:33:23

Android RecyclerView嵌套RecyclerView的相关文章

Android中RecyclerView嵌套RecyclerView或嵌套ListView

Android中RecyclerView嵌套RecyclerView或嵌套ListView

RecyclerView嵌套RecyclerView点击Item时顶上去的解决方法

RecyclerView嵌套RecyclerView点击Item时顶上去的原因是焦点抢占的原因,解决方法解决方法:holder.binding.rvContact.isFocusableInTouchMode = false (kotlin语法哦)注意:要在代码里面每次触发时设置,在xml里面一次性设置是无效的. 原文地址:https://www.cnblogs.com/yongfengnice/p/11445731.html

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

一个比较长的界面一般都是Scrollview嵌套RecyclerView来解决.不过这样的UI并不是我们开发人员想看到的,实际上嵌套之后.因为Scrollview和RecyclerView都是滑动控件.会有一点滑动上的冲突.导致滑动起来有些卡顿.这个时候.我们重写一下LayoutManager就行了 例如: [java] view plain copy LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getAct

(转载) Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题

Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题 标签: scrollviewandroid滑动嵌套 2015-07-16 17:24 11126人阅读 评论(17) 收藏 举报  分类: Android进阶(19)  版权声明:本文为博主原创文章,未经博主允许不得转载. scrollview 嵌套recyclerview 时,recyclerview不显示,这就需要我们自己计算recyclerview的高度,比如: ViewGroup.L

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

scrollview 嵌套recyclerview 时,recyclerview不显示,这就需要我们自己计算recyclerview的高度,比如: ViewGroup.LayoutParams mParams = recyclerView.getLayoutParams(); mParams.height = (CommonUtils.getScreenWidthPX(getActivity()) * 480 / 720 + CommonUtils.dipToPixels(40)) * num

Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题

最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyclerView.setNestedScrollingEnabled(false); 这个方法就可以解决这一问题. 既然有首先那肯定有第二种解决的办法,只不过相对于第一种方法来说就太麻烦了. 我们知道ScrollView嵌套listView或者GridView的时候需要自定义listView或者是Gr

android recyclerView嵌套progressbar

刚刚实现了GridView的实现方式,领导发话,最好用recyclerView更好,又用了一下午的时间把recyclerView研究了下,具体代码如下: FragmentTwo.java package com.example.navigation; import android.content.Context; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import andro

scrollview嵌套上下拉控件嵌套recyclerview

相信会碰到很多类似的需求,一个列表控件,然后控件上方的一个头部需要自定义,这样就不好有时候也不能加在列表控件的头部了,那必须得嵌套一层scrollview了,没毛病,那么一般的列表控件都是有上拉下拉的操作,而且一般也是在 github 上找寻一个收藏量高的 来做为一个全局通用的上下拉控件,这里问题就来了,一般的 scrollview 嵌套 recyclerview 或者 listview 都毕竟容易解决,可是在加上一层上下拉控件呢?上下拉控件肯定会有它自己的触摸处理机制,这样你改起来也很麻烦,这

【android】使用RecyclerView和CardView,实现知乎日报精致布局

完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 在写博客园客户端的时候,突然想到,弄个知乎日报风格的简单清爽多好!不需要那么多繁杂的信息干扰视野. 先贴上效果图,左边是知乎日报的,右边是本方案的 本文所使用的ide是androidStudio 首先我们需要在项目中,引入RecyclerView.CardView 在build.gradle的 dependencies 添加两条引用语句,如 dependencies { compi