如何实现让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值。
效果图如下:
相关推荐
RecyclerView显示不同的item;
RecyclerView 分组 item实现不同布局
使用Kotlin写的实现Android的Recyclerview的多种item布局
欢迎来下载RecyclerView实现复杂界面,本demo是由本人去多方百度参考后写成, 易于会ListView的小伙伴们理解,如demo有问题可以加QQ:731712249(加Q请说明来意),也可以加入Android交流群讨论:586620031
Android-RecyclerView实现Item添加和删除,效果不错1111111111111111111111111111111111111111111111111111
AndroidTV中自定义RecyclerView 让当前焦点item显示在中间,调用smoothToCenter(pos)就可以。
博客地址: http://blog.csdn.net/jiayite/article/details/52335069 与博客内容稍有改动 android studio项目
RecyclerView中item焦点问题,RecyclerView中item焦点问题,RecyclerView中item焦点问题
Recyclerview实现添加和删除item的动画.
使用一个统一的线程控制RecyclerView每个item 中的一个控件实现计时功能【使用一个统一的线程控制RecyclerView每个item 中的一个控件实现计时功能】
Android RecyclerView 点击Item Item变大的效果Demo
支持recyclerview listview左滑item删除item,轻量级使用,不需要大规模改动代码
RecyclerView横向滑动Item居中的问题,包括Item居中放大的效果,拖动时,目前在机器上自测可用。
Recyclerview实现滑动放大ItemView,原创不易,请宝宝们支持一下吧
recyclerView实现item视频播放 item全部是视频 包括视频的 暂停 快进 全屏 等功能 绝对无bug 亲测 需要的小伙伴赶紧下载 看看效果吧
RecyclerView加载不同布局。
主要为大家介绍如何用RecycleView来实现淘宝首页复杂的布局,做电商类app的小伙伴们可以略作参考。
安卓利用RecyclerView并且借助动画实现列表Item的可展开收缩效果
RecyclerView中利用GridLayoutManager实现item四周都带有分割线效果,博客链接:http://blog.csdn.net/abfo12