`
砺雪凝霜
  • 浏览: 157044 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何实现让RecyclerView有不同尺寸的item

阅读更多

如何实现让RecyclerView有不同尺寸的item

     我们的项目开发中有一个需求是这样的:我们左边有一排关键字,用户用遥控器滑动到某个关键字后,后边就要求出相应的搜索结果,搜索结果是一个gridView,一般情况下,gridView每行排列着是4个相同尺寸的item,但是针对特殊的搜索结果的item要求,每行排列2个。

分析:

(1) 可不可以用GridView实现呢?

     我们都知道GridView的每个布局的宽和高必须是一样的,(HeadView咱们就不考虑了)。用gridView的方式基本可以放弃了。

(2) 用gridLayout实现呢?

    gridLayout有合并单元格的功能,倒是可以满足基本的样式,但是搜索结果一多,由于gridLayout没有复用功能,所以这种方案也可以放弃了。

下面介绍我最新研究出来的方案,用RecyclerView来实现,原理很简单,利用的是GridLayoutManager.SpanSizeLookup这个类来实现,该类是一个抽象类,里面有个getSpanSize()的抽象方法。这个方法理解起来比抽象,我先贴出我的代码,后面会

慢慢再详细解释。 

 

package tv.lesports.com.myrecyclerview;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;


import java.util.ArrayList;

/**
 * Created by liuyu8 on 2016/5/3.
 */
public class RecyclerViewActivity extends Activity {
    private RecyclerView mRecyclerView;
    private HomeAdapter mAdapter;
    private ArrayList<SearchResultBean> mDataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recyclerview_layout);
        initData();
        mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview);
        GridLayoutManager manager = new GridLayoutManager(this, 4);
        manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
               SearchResultBean bean = mDataList.get(position);
                if (bean.getType() == 0) {
                    return 4;
                } else if(bean.getType() == 1){
                    return 2;
                }else{
                    return 1;
                }
            }
        });
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mAdapter = new HomeAdapter(this, mDataList);
        mRecyclerView.setAdapter(mAdapter);
    }

    protected void initData() {
        mDataList = new ArrayList<SearchResultBean>();
        for (int i = 0; i < 50; i++) {
            SearchResultBean bean = new SearchResultBean();
            bean.setName(i + "");
            if (i == 0) {
                bean.setType(0);
            } else if (i > 0 && i <= 5) {
                bean.setType(1);
            } else {
                bean.setType(2);
            }
            mDataList.add(bean);
        }
    }
}

 

 上面代码中,RecyclerView的方向是垂直的,它由通过一个TotalspanSize为4的GridLayout实现的,getSpanSize方法中有一个参数是position,我们可以等价的通过LinearLayout中weight来理解该方法,假设Recycler是一个线性布局,TotalSpan等同于总的weight值,getSpanSize(int position)代表的是位置为position的item宽度占RecyclerView总宽度的weight值。

上面代码的意思等同于:

(1)position = 0 的item的weight值为4,所以position等于0的item宽等于RecyclerView的宽度

(2)position范围在(0,5]的item的weight值为2,所以position范围在(0,5]的item的宽度为RecyclerView宽度的1/2

(3)position(5,50)的item的weight值为1,所以position范围在(5,50)的item的宽度为RecyclerView宽度的1/4

注明:忽略item之间的padding值。

 

效果图如下: 


 

  • 大小: 12.4 KB
分享到:
评论

相关推荐

    android居中显示item的recyclerview

    - `onMeasure()`:测量每个item的大小,并确定RecyclerView的总尺寸。 - `onLayout()`:根据测量结果,将每个item布局到适当的位置。 - `scrollToPosition()`:滚动到指定位置,确保中心item居中显示。 2. **...

    recyclerview实现flowlayout效果

    - 考虑到不同的屏幕尺寸和设备方向,可能需要处理动态布局变化。 - 注意测量和布局的性能,避免在`onLayoutChildren()`中进行耗时的操作,可能导致性能问题。 在`flowviewdemo`中,开发者已经实现了上述步骤,并...

    RecyclerView滚动指定条目并在页面中居中

    在Android开发中,...在实际开发中,还需要考虑性能优化,如避免不必要的滚动操作以及处理不同屏幕尺寸的影响。在压缩包中的"MyApplication 2"可能包含了实现这一功能的示例代码,可以作为进一步学习和参考的资源。

    RecyclerView修复线性与网格布局切换item宽度问题

    当从一种布局切换到另一种布局时,RecyclerView可能没有重新计算item的尺寸,从而导致显示异常。 为了解决这个问题,我们需要在切换布局时进行以下操作: 1. **正确设置LayoutManager**:确保在切换布局时,每次都...

    RecyclerView GridView 矩形自适应

    要实现RecyclerView的矩形自适应布局,我们需要做以下几步: 1. **创建自定义布局管理器**: 自定义一个继承自`RecyclerView.LayoutManager`的类,重写其中的关键方法,如`onMeasure()`和`onLayout()`。这两个方法...

    Android 自定义RecyclerView 实现真正的Gallery效果程序源码

    在`onBindViewHolder()`中,可以加载图片并设置到ImageView上,同时可能需要处理图片的缩放和裁剪,以适应不同的屏幕尺寸和设备方向。 此外,为了实现Gallery的滑动效果,你可能需要对RecyclerView的滑动手势进行...

    RecyclerView实现复杂布局(如淘宝首页)

    - 结合ConstraintLayout、PercentLayout或FlexboxLayout等工具,实现不同屏幕尺寸下的自适应布局。 综上所述,实现像淘宝首页这样的复杂布局,需要熟练掌握RecyclerView的各种特性,并结合MVVM架构和响应式布局...

    Android RecyclerView 间距全适配

    5. **RVSpacing-master项目**: 这个文件名可能是项目的源码仓库,其中可能包含了实现RecyclerView间距全适配的示例代码。通过查看和学习该项目,开发者可以更直观地理解如何在实际项目中应用上述理论知识。 综上所...

    基于RecyclerView实现的仿微信聊天界面,item长按可以根据触摸位置弹出对话框

    微信的聊天界面以其简洁、易用而著称,它的长按功能允许用户对消息进行多种操作,如撤回、复制等,这是通过在RecyclerView的item上添加长按事件来实现的。 首先,我们需要理解RecyclerView的工作原理。RecyclerView...

    RecyclerView实现瀑布流

    在Android开发中,...总结,实现RecyclerView的瀑布流效果涉及自定义LayoutManager、Adapter、ItemDecoration以及处理滚动事件等步骤。通过这种方式,开发者能够创建出具有独特布局风格且高性能的Android应用界面。

    RecyclerView 滚动到中间位置实例代码

    本实例主要探讨如何实现RecyclerView滚动至指定项并使其居中显示,这对于创建诸如瀑布流、轮播效果等场景非常有用。我们将通过以下几个关键步骤来详细讲解这个功能的实现: 1. **设置RecyclerView** 首先,我们需要...

    ItemDecoration实现recyclerView实现头部吸顶

    本文将详细介绍如何利用ItemDecoration实现RecyclerView的头部吸顶功能。 首先,我们需要理解ItemDecoration的工作原理。ItemDecoration并不直接与数据集或Adapter交互,而是作为RecyclerView的装饰器,参与到布局...

    Android基于RecyclerView的Item侧滑删除

    本教程将深入探讨如何在RecyclerView中实现Item的侧滑删除功能。这一特性常见于许多应用,如邮件客户端、任务管理器等,允许用户通过简单的手势来移除列表中的条目。 首先,RecyclerView的核心是Adapter,它负责将...

    网络图片RecyclerView瀑布流的实现

    这通常通过实现RecyclerView.OnScrollListener并重写onScrolled()方法来完成。 7. **数据加载和刷新**: 数据可以从网络获取,比如使用Retrofit或OkHttp发送HTTP请求。当新数据加载完毕后,需要更新数据源并调用...

    Anroid利用RecyclerView实现瀑布流效果

    通过以上步骤,我们就能在Android应用中成功实现RecyclerView的瀑布流效果。这个过程涉及到Android的基础组件使用、自定义布局管理器以及数据绑定等多个知识点,对于提升Android开发技能有很大帮助。

    安卓利用RecyclerView+IjkVideoView仿抖音滑动看视频

    这通常通过实现RecyclerView的OnScrollListener并在onScrolled方法中判断当前位置是否可见来实现。 - 实现预加载策略,比如使用LruCache或者更复杂的缓存系统,预先加载即将显示的视频,提高用户体验。 3. 滑动...

    不一样的RecyclerView优雅实现复杂列表布局

    本篇文章将深入探讨如何使用RecyclerView实现复杂的列表布局,让应用界面更加优雅且功能丰富。 首先,RecyclerView的核心在于其Adapter和LayoutManager。Adapter是数据与视图之间的桥梁,负责填充数据到列表项;...

    RecyclerView+CardView+Glide加载图片实现瀑布流

    实现RecyclerView+CardView+Glide加载图片的瀑布流,主要步骤如下: 1. **集成依赖**:首先,在项目的build.gradle文件中添加RecyclerView、CardView和Glide的依赖库。 2. **创建CardView布局**:在XML布局文件中...

    Android-RecyclerView自定义LayoutManager

    为了实现自定义的CardLayoutManager,我们可以假设这是一个卡片式布局,每个item像卡片一样平铺显示,可以有横向滑动效果。这需要我们计算卡片间的间距,以及在屏幕边界时的滑动处理。 实现这样的布局,我们需要...

    RecyclerView示例

    该布局管理器允许元素有不同大小,形成类似Pinterest的布局。通过设置`SpanSizeLookup`,可以控制每个item占据的列数,从而实现不规则的瀑布流效果。 5. **优化性能**:RecyclerView的一大优势在于其高效的内存管理...

Global site tag (gtag.js) - Google Analytics