RecyclerView多个item布局的写法(头布局+脚布局)

上图
github
下载源码
Initial commit第一次提交的代码,为本文内容
以下的为主要代码,看注释即可,比较简单
MainActivity
含上拉加载更多
package com.anew.recyclerviewall;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> mHeadList;
private List<String> mBodyList;
private List<String> mFootList;
private MyAdapter mAdapter;
private LinearLayoutManager mLayoutManager;
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mHeadList = new ArrayList<>();
for (int i = 0; i < 1; i++) {
mHeadList.add("head" + i);
}
mBodyList = new ArrayList<>();
for (int i = 'A'; i < 'L'; i++) {
mBodyList.add("" + (char) i);
}
mFootList = new ArrayList<>();
for (int i = 0; i < 1; i++) {
mFootList.add("foot" + i);
}
mRecyclerView = (RecyclerView) findViewById(R.id.rv);
// 使用默认的api绘制分割线
mRecyclerView.addItemDecoration
(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
// 设置增加删除item的动画效果
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
// 瀑布流
// mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyAdapter(this, mHeadList, mBodyList, mFootList);
mRecyclerView.setAdapter(mAdapter);
// 当目前的可见条目是所有数据的最后一个时,开始加载新的数据
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastCompletelyVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();
if (lastCompletelyVisibleItemPosition + 1 == mAdapter.getItemCount()) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
List<String> mMoreList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
mMoreList.add("more" + i);
}
mBodyList.addAll(mMoreList);
mAdapter.notifyItemInserted(mAdapter.getItemCount() - 2);
}
}, 1500);
Log.e("qqq", "到底了" + lastCompletelyVisibleItemPosition);
}
int firstCompletelyVisibleItemPosition = mLayoutManager.findFirstCompletelyVisibleItemPosition();
if (firstCompletelyVisibleItemPosition == 0&&dy<0) {
Log.e("eeeee", "开始刷新呀呀呀");
}
}
});
}
}
MyAdapter
对外部:头布局list、身体布局list、脚布局list,所有的list单独计数
内部:对position进行调整,这里需要耐心调整position
package com.anew.recyclerviewall;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
* Created by a on 2017/1/7.
*/
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<String> mHeadList;
private List<String> mBodyList;
private List<String> mFootList;
private static final int HEAD_TYPE = 1;
private static final int BODY_TYPE = 2;
private static final int FOOT_TYPE = 3;
public MyAdapter(Context context, List<String> headList, List<String> bodyList, List<String> footList) {
this.context = context;
this.mHeadList = headList;
this.mBodyList = bodyList;
this.mFootList = footList;
}
// ★ 1. 定义规则,什么情况,是哪一种ViewType
@Override
public int getItemViewType(int position) {
int viewType = -1;
if (position < getHeadCount()) {
viewType = HEAD_TYPE;
} else if (position > getHeadCount() + getBodyCount() - 1) {
//这里最后要减去1,慢慢地去数
viewType = FOOT_TYPE;
} else {
viewType = BODY_TYPE;
}
return viewType;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = null;
// ★ 2. 根据viewType来确定加载那个布局,返回哪一个ViewHolder
switch (viewType) {
case HEAD_TYPE:
view = inflater.inflate(R.layout.item_head, parent, false);
return new HeadHolder(view);
case BODY_TYPE:
view = inflater.inflate(R.layout.item_body, parent, false);
return new BodyHolder(view);
case FOOT_TYPE:
view = inflater.inflate(R.layout.item_foot, parent, false);
return new FootHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
// ★ 3. 根据holder是哪一个ViewHolder的实例,来确定操作哪一个布局的UI
if (holder instanceof HeadHolder) {
HeadHolder headHolder = (HeadHolder) holder;
headHolder.mTvHead.setText(mHeadList.get(position) + "");
headHolder.mTvHead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addData();
}
});
}
if (holder instanceof BodyHolder) {
final BodyHolder bodyHolder = (BodyHolder) holder;
bodyHolder.mTvBody.setText(mBodyList.get(position - getHeadCount()) + "");
bodyHolder.mTvBody.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeData(bodyHolder.getAdapterPosition());
}
});
}
if (holder instanceof FootHolder) {
final FootHolder footHolder = (FootHolder) holder;
footHolder.mTvFoot.setText(mFootList.get(position - getHeadCount() - getBodyCount()) + "");
footHolder.mTvFoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, footHolder.getAdapterPosition() + "",
Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public int getItemCount() {
return getHeadCount() + getBodyCount() + getFootCount();
}
private int getFootCount() {
return mFootList.size();
}
private int getBodyCount() {
return mBodyList.size();
}
private int getHeadCount() {
return mHeadList.size();
}
public void addData(int position) {
mBodyList.add(position, "Insert One");
// ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果
notifyItemInserted(position);
}
/**
* 增加bodyList条目
*/
public void addData() {
mBodyList.add("1");
mBodyList.add("2");
mBodyList.add("3");
// ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果
notifyItemRangeInserted(0, 3);
}
/**
* 删除bodyList条目
*/
public void removeData(int position) {
// 经测试疯狂点击删除条目,会产生负数,导致越界异常
if (!(position - getHeadCount() < 0)) {
// ★★★★ 防止角标越界异常,要减去头布局数量,总之去数数吧
mBodyList.remove(position - getHeadCount());
notifyItemRemoved(position);
}
}
/**
* 头布局Holder
*/
static class HeadHolder extends RecyclerView.ViewHolder {
private TextView mTvHead;
public HeadHolder(View itemView) {
super(itemView);
mTvHead = (TextView) itemView.findViewById(R.id.tv_head);
}
}
/**
* 身体布局Holder
*/
static class BodyHolder extends RecyclerView.ViewHolder {
private TextView mTvBody;
public BodyHolder(View itemView) {
super(itemView);
mTvBody = (TextView) itemView.findViewById(R.id.tv_body);
}
}
/**
* 脚布局Holder
*/
static class FootHolder extends RecyclerView.ViewHolder {
private TextView mTvFoot;
public FootHolder(View itemView) {
super(itemView);
mTvFoot = (TextView) itemView.findViewById(R.id.tv_foot);
}
}
}
item_body
item_head和item_foot类似就不粘贴了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginRight="11px"
android:layout_marginBottom="11px"
android:background="@color/colorPrimary"
android:orientation="vertical">
<TextView
android:id="@+id/tv_body"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="17sp"
android:layout_gravity="center"
android:text="Hello World!"/>
</LinearLayout>
以上所述是小编给大家介绍的Android 中RecyclerView多种item布局的写法(头布局+脚布局),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# recyclerview多种item
# Android RecyclerView滑动删除和拖动排序
# Android RecyclerView item选中放大被遮挡问题详解
# Android RecyclerView实现多种item布局的方法
# Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除
# Android中RecyclerView实现Item添加和删除的代码示例
# Android中RecyclerView的item宽高问题详解
# Android RecyclerView显示Item布局不一致解决办法
# Android RecyclerView的Item点击事件实现整理
# Android RecyclerView自由拖动item的实现代码
# 加载
# 小编
# 多个
# 给大家
# 数数
# 所述
# 哪一种
# 给我留言
# 贴了
# 上图
# 有任何
# 不粘
# 分割线
# api
# foot
# void
# rv
# setLayoutManager
# StaggeredGridLayoutManager
# setItemAnimator
相关文章:
网站好制作吗知乎,网站开发好学吗?有什么技巧?
,网页ppt怎么弄成自己的ppt?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
广州建站公司哪家好?十大优质服务商推荐
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
简单实现Android文件上传
网站制作公司排行榜,抖音怎样做个人官方网站
智能起名网站制作软件有哪些,制作logo的软件?
建站之星在线版空间:自助建站+智能模板一键生成方案
建站之星备案流程有哪些注意事项?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何通过宝塔面板实现本地网站访问?
网站制作价目表怎么做,珍爱网婚介费用多少?
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何选择CMS系统实现快速建站与SEO优化?
山东网站制作公司有哪些,山东大源集团官网?
h5网站制作工具有哪些,h5页面制作工具有哪些?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
制作公司内部网站有哪些,内网如何建网站?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
建站之星伪静态规则如何正确配置?
如何快速建站并高效导出源代码?
建站OpenVZ教程与优化策略:配置指南与性能提升
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
电商平台网站制作流程,电商网站如何制作?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站主机选购指南:核心配置优化与品牌推荐方案
建站主机CVM配置优化、SEO策略与性能提升指南
香港服务器部署网站为何提示未备案?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
建站主机如何安装配置?新手必看操作指南
文字头像制作网站推荐软件,醒图能自动配文字吗?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何高效生成建站之星成品网站源码?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
定制建站策划方案_专业建站与网站建设方案一站式指南
建设网站制作价格,怎样建立自己的公司网站?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
,制作一个手机app网站要多少钱?
如何制作网站标识牌,动态网站如何制作(教程)?
建站主机默认首页配置指南:核心功能与访问路径优化
如何快速配置高效服务器建站软件?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
制作农业网站的软件,比较好的农业网站推荐一下?
韩国服务器如何优化跨境访问实现高效连接?
如何通过西部建站助手安装IIS服务器?
*请认真填写需求信息,我们会在24小时内与您取得联系。