全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 中RecyclerView多种item布局的写法(头布局+脚布局)

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 


相关文章: C++如何使用std::optional?(处理可选值)  网站设计制作公司地址,网站建设比较好的公司都有哪些?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  手机网站制作与建设方案,手机网站如何建设?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何快速搭建高效香港服务器网站?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何打造高效商业网站?建站目的决定转化率  如何解决ASP生成WAP建站中文乱码问题?  微信h5制作网站有哪些,免费微信H5页面制作工具?  微课制作网站有哪些,微课网怎么进?  如何高效配置香港服务器实现快速建站?  制作网站的公司有哪些,做一个公司网站要多少钱?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站VPS选购需注意哪些关键参数?  如何通过多用户协作模板快速搭建高效企业网站?  如何做网站制作流程,*游戏网站怎么搭建?  建站主机如何选?高性价比方案全解析  建站之星展会模板:智能建站与自助搭建高效解决方案  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  公众号网站制作网页,微信公众号怎么制作?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  完全自定义免费建站平台:主题模板在线生成一站式服务  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何确保FTP站点访问权限与数据传输安全?  建站之星后台管理系统如何操作?  如何正确下载安装西数主机建站助手?  建站DNS解析失败?如何正确配置域名服务器?  如何通过虚拟主机快速完成网站搭建?  英语简历制作免费网站推荐,如何将简历翻译成英文?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  制作营销网站公司,淘特是干什么用的?  深圳网站制作培训,深圳哪些招聘网站比较好?  已有域名能否直接搭建网站?  Swift中switch语句区间和元组模式匹配  如何做静态网页,sublimetext3.0制作静态网页?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何通过云梦建站系统实现SEO快速优化?  建站上市公司网站建设方案与SEO优化服务定制指南  香港服务器如何优化才能显著提升网站加载速度?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何选择适合PHP云建站的开源框架?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  ,sp开头的版面叫什么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。