Android RecyclerView实现加载多种条目类型
今天咱们是用RecyclerView来实现这个多种Item的加载.
其实最关键的是要复写RecyclerView的Adapter中的getItemViewType()方法 这个方法就根据条件返回条目的类型 这个MoreTypeBean 是用来传数据的 没必要跟我写的一样,
其实就是从activity中传到adapter中的数据中必须要有一个type字段来判断这个item对象需要那种视图,然后return出一个标记,在onCreateViewHolder中在引用所对应的item布局.
//重写getItemViewType方法 根据条件返回条目的类型
@Override
public int getItemViewType(int position) {
MoreTypeBean moreTypeBean = mData.get(position);
if (moreTypeBean.type == 0) {
return TYPE_PULL_IMAGE;
} else if (moreTypeBean.type == 1) {
return TYPE_RIGHT_IMAGE;
} else {
return TYPE_THREE_IMAGE;
}
}
一般有多少种类型我们定义多少种常量.(我今天写了三种布局 所以我定义了三个)
//定义三种常量 表示三种条目类型
public static final int TYPE_PULL_IMAGE = 0;
public static final int TYPE_RIGHT_IMAGE = 1;
public static final int TYPE_THREE_IMAGE = 2;
有了上面定义的常量之后 在onCreateViewHolder里根据viewtype来判断 所引用的item布局类型 这样每一条item就会不一样了
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//创建不同的 ViewHolder
View view;
//根据viewtype来判断
if (viewType == TYPE_PULL_IMAGE) {
view =View.inflate(parent.getContext(),R.layout.item_pull_img,null);
return new PullImageHolder(view);
} else if (viewType == TYPE_RIGHT_IMAGE) {
view =View.inflate(parent.getContext(),R.layout.item_right_img,null);
return new RightImageHolder(view);
} else {
view =View.inflate(parent.getContext(),R.layout.item_three_img,null);
return new ThreeImageHolder(view);
}
}
创建三种不同的ViewHolder
private class PullImageHolder extends RecyclerView.ViewHolder {
public PullImageHolder(View itemView) {
super(itemView);
}
}
private class RightImageHolder extends RecyclerView.ViewHolder {
public RightImageHolder(View itemView) {
super(itemView);
}
}
private class ThreeImageHolder extends RecyclerView.ViewHolder {
public ThreeImageHolder(View itemView) {
super(itemView);
}
}
下面把所有的代码都给大家:
Activity中的代码
public class Recycler_variety_Activity extends Activity {
private int[] icons = {R.drawable.test, R.drawable.test1, R.drawable.test2, R.drawable.test3, R.drawable.test4, R.drawable.test5, R.drawable.test6};
private RecyclerView mRecy;
private List<MoreTypeBean> mData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_variety_activity);
initView();
initData();
initViewOper();
}
private void initView() {
mRecy = (RecyclerView) findViewById(R.id.act_recycler_variety_recycler);
}
private void initData() {
mData = new ArrayList<>();
// 随机数 用来标记item界面的类型
Random random = new Random();
for (int i = 0; i < icons.length; i++) {
MoreTypeBean more = new MoreTypeBean();
more.pic = icons[i];
more.type = random.nextInt(3);
mData.add(more);
}
}
private void initViewOper() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecy.setLayoutManager(linearLayoutManager);
Recycler_variety_Adapter adapter = new Recycler_variety_Adapter(mData);
mRecy.setAdapter(adapter);
}
}
recyclerview_test_layout的布局就是只有一个RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/act_recycler_variety_recycler"
android:layout_width="match_parent"
android:background="#d3d3d3"
android:layout_height="match_parent"/>
RecyclerView的Adapter
public class Recycler_variety_Adapter extends RecyclerView.Adapter {
//定义三种常量 表示三种条目类型
public static final int TYPE_PULL_IMAGE = 0;
public static final int TYPE_RIGHT_IMAGE = 1;
public static final int TYPE_THREE_IMAGE = 2;
private List<MoreTypeBean> mData;
public Recycler_variety_Adapter(List<MoreTypeBean> data) {
this.mData = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//创建不同的 ViewHolder
View view;
//根据viewtype来创建条目
if (viewType == TYPE_PULL_IMAGE) {
view =View.inflate(parent.getContext(),R.layout.item_pull_img,null);
return new PullImageHolder(view);
} else if (viewType == TYPE_RIGHT_IMAGE) {
view =View.inflate(parent.getContext(),R.layout.item_right_img,null);
return new RightImageHolder(view);
} else {
view =View.inflate(parent.getContext(),R.layout.item_three_img,null);
return new ThreeImageHolder(view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
if (mData != null) {
return mData.size();
}
return 0;
}
//根据条件返回条目的类型
@Override
public int getItemViewType(int position) {
MoreTypeBean moreTypeBean = mData.get(position);
if (moreTypeBean.type == 0) {
return TYPE_PULL_IMAGE;
} else if (moreTypeBean.type == 1) {
return TYPE_RIGHT_IMAGE;
} else {
return TYPE_THREE_IMAGE;
}
}
/**
* 创建三种ViewHolder
*/
private class PullImageHolder extends RecyclerView.ViewHolder {
public PullImageHolder(View itemView) {
super(itemView);
}
}
private class RightImageHolder extends RecyclerView.ViewHolder {
public RightImageHolder(View itemView) {
super(itemView);
}
}
private class ThreeImageHolder extends RecyclerView.ViewHolder {
public ThreeImageHolder(View itemView) {
super(itemView);
}
}
}
item_pull_img布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:padding="7dp"
android:background="#fff"
android:orientation="vertical"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型"
android:textSize="16sp"
/>
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@drawable/sucai6"
android:scaleType="fitXY"
/>
</LinearLayout>
<View
android:layout_marginTop="3dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#d3d3d3"
/>
</LinearLayout>
item_right_img布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff"
android:orientation="horizontal"
android:padding="7dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型"
android:textColor="#000"
android:textSize="16sp" />
<ImageView
android:layout_width="120dp"
android:layout_height="90dp"
android:background="@drawable/sucai" />
</LinearLayout>
<View
android:layout_marginTop="3dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#d3d3d3"
/>
</LinearLayout>
item_three_img布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:background="#fff"
android:padding="7sp"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型,多种条目类型多种条目类型"
android:textColor="#000"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/sucai3" />
<View
android:layout_width="6dp"
android:layout_height="0dp"/>
<ImageView
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/sucai4" />
<View
android:layout_width="6dp"
android:layout_height="0dp"/>
<ImageView
android:layout_width="0dp"
android:layout_height="80dp"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/sucai5" />
</LinearLayout>
</LinearLayout>
<View
android:layout_marginTop="3dp"
android:background="#d3d3d3"
android:layout_width="match_parent"
android:layout_height="1dp"/>
</LinearLayout>
MoreTypeBean
public class MoreTypeBean {
public int type;
public int pic;
}
Android RecyclerView实现加载多种条目类型的更多相关文章
- Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载之Android-Universal-Image-Loader(转)
今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...
- 实现Android ListView 自动加载更多内容
研究了几个小时终于实现了Android ListView 自动加载的效果. 说说我是怎样实现的.分享给大家. 1.给ListView增加一个FooterView,调用addFooterView(foo ...
- [Android] Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.LoaderCallbacks)
Android 用于异步加载 ContentProvider 中的内容的机制 -- Loader 机制 (LoaderManager + CursorLoader + LoaderManager.Lo ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)
接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)
Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...
- Android开发 - ImageView加载Base64编码的图片
在我们开发应用的过程中,并不是所有情况下都请求图片的URL或者加载本地图片,有时我们需要加载Base64编码的图片.这种情况出现在服务端需要动态生成的图片,比如: 二维码 图形验证码 ... 这些应用 ...
随机推荐
- time 时间模块的函数调用
时间模块 time 此模块提供了时间相关的函数,且一直可用 时间简介 公元纪年是从公元 0000年1月1日0时开始的 计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1 U ...
- 【JOISC2012】fish
Description 有 \(n\) 条鱼,第 \(i\) 条鱼的长度为 \(L_i\),颜色是 \(C_i\)(\(C_i\) 只能是 'R','G','B'). 你需要从中挑出至少一条鱼,要求挑 ...
- MySQL--------SQL优化审核工具实战
1. 背景 SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQL原生态词法解析,结合分析SQL中的where条件.聚合条件. ...
- python 判断数据类型及释疑
Python 判断数据类型有type和isinstance 基本区别在于: type():不会认为子类是父类 isinstance():会认为子类是父类类型 class Color(object): ...
- JAVA遇见HTML——JSP篇(案例项目)
- u-boot器件驱动模型(Device&Drivers)之uclass (转)
一.剧情回顾 在上一篇链接器的秘密里面我们讲到我们用一些特殊的宏让链接器帮我们把一些初始化好的结构体列好队并安排在程序的某一个段里面,这里我例举出了三个和我们主题相关段的分布情况,它们大概如下图所示: ...
- 在js中获取 input checkbox里选中的多个值
思路:利用name属性值获取checkbox对象,然后循环判断checked属性(true表示被选中,false表示未选中).下面进行实例演示: 1.html中展示: <input type=& ...
- Educational Codeforces Round 50 (Rated for Div. 2) F - Relatively Prime Powers(数学+容斥)
题目链接:http://codeforces.com/contest/1036/problem/F 题意: 题解:求在[2,n]中,x != a ^ b(b >= 2 即为gcd)的个数,那么实 ...
- 题解 noip2019模拟赛Day1T3
题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...
- Educational Codeforces Round 33 (Rated for Div. 2) A题
A. Chess For Three Alex, Bob and Carl will soon participate in a team chess tournament. Since they a ...