一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2017-01-09 编辑:简简单单 来源:一聚教程网

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

上图

图1

图2

Initial commit第一次提交的代码,为本文内容

以下的为主要代码,看注释即可,比较简单

MainActivity

含上拉加载更多

 
 代码如下 复制代码
packagecom.anew.recyclerviewall;
 
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.support.v7.app.AppCompatActivity;
importandroid.support.v7.widget.DefaultItemAnimator;
importandroid.support.v7.widget.DividerItemDecoration;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.support.v7.widget.Toolbar;
importandroid.util.Log;
importjava.util.ArrayList;
importjava.util.List;
publicclassMainActivityextendsAppCompatActivity {
  privateRecyclerView mRecyclerView;
  privateList mHeadList;
  privateList mBodyList;
  privateList mFootList;
  privateMyAdapter mAdapter;
  privateLinearLayoutManager mLayoutManager;
  Handler mHandler =newHandler();
  @Override
  protectedvoidonCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mHeadList =newArrayList<>();
    for(inti =0; i <1; i++) {
      mHeadList.add("head"+ i);
    }
    mBodyList =newArrayList<>();
    for(inti ='A'; i <'L'; i++) {
      mBodyList.add(""+ (char) i);
    }
    mFootList =newArrayList<>();
    for(inti =0; i <1; i++) {
      mFootList.add("foot"+ i);
    }
    mRecyclerView = (RecyclerView) findViewById(R.id.rv);
//    使用默认的api绘制分割线
    mRecyclerView.addItemDecoration
        (newDividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
//    设置增加删除item的动画效果
    mRecyclerView.setItemAnimator(newDefaultItemAnimator());
//    瀑布流
//    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
    mLayoutManager =newLinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter =newMyAdapter(this, mHeadList, mBodyList, mFootList);
    mRecyclerView.setAdapter(mAdapter);
    // 当目前的可见条目是所有数据的最后一个时,开始加载新的数据
    mRecyclerView.addOnScrollListener(newRecyclerView.OnScrollListener() {
      @Override
      publicvoidonScrolled(RecyclerView recyclerView,intdx,intdy) {
        super.onScrolled(recyclerView, dx, dy);
        intlastCompletelyVisibleItemPosition = mLayoutManager.findLastCompletelyVisibleItemPosition();
        if(lastCompletelyVisibleItemPosition +1== mAdapter.getItemCount()) {
          mHandler.postDelayed(newRunnable() {
            @Override
            publicvoidrun() {
              List mMoreList =newArrayList<>();
              for(inti =0; i <3; i++) {
                mMoreList.add("more"+ i);
              }
              mBodyList.addAll(mMoreList);
              mAdapter.notifyItemInserted(mAdapter.getItemCount() -2);
            }
          },1500);
          Log.e("qqq","到底了"+ lastCompletelyVisibleItemPosition);
        }
        intfirstCompletelyVisibleItemPosition = mLayoutManager.findFirstCompletelyVisibleItemPosition();
        if(firstCompletelyVisibleItemPosition ==0&&dy<0) {
          Log.e("eeeee","开始刷新呀呀呀");
        }
      }
    });
  }
}

MyAdapter

对外部:头布局list、身体布局list、脚布局list,所有的list单独计数

内部:对position进行调整,这里需要耐心调整position

packagecom.anew.recyclerviewall;
importandroid.content.Context;
importandroid.support.v7.widget.RecyclerView;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importandroid.widget.Toast;
importjava.util.List;
/**
 * Created by a on 2017/1/7.
 */
publicclassMyAdapterextendsRecyclerView.Adapter {
  privateContext context;
  privateList mHeadList;
  privateList mBodyList;
  privateList mFootList;
  privatestaticfinalintHEAD_TYPE =1;
  privatestaticfinalintBODY_TYPE =2;
  privatestaticfinalintFOOT_TYPE =3;
  publicMyAdapter(Context context, List headList, List bodyList, List footList) {
    this.context = context;
    this.mHeadList = headList;
    this.mBodyList = bodyList;
    this.mFootList = footList;
  }
  //  ★ 1. 定义规则,什么情况,是哪一种ViewType
  @Override
  publicintgetItemViewType(intposition) {
    intviewType = -1;
    if(position < getHeadCount()) {
      viewType = HEAD_TYPE;
    }elseif(position > getHeadCount() + getBodyCount() -1) {
      //这里最后要减去1,慢慢地去数
      viewType = FOOT_TYPE;
    }else{
      viewType = BODY_TYPE;
    }
    returnviewType;
  }
  @Override
  publicRecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,intviewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view =null;
    //  ★ 2. 根据viewType来确定加载那个布局,返回哪一个ViewHolder
    switch(viewType) {
      caseHEAD_TYPE:
        view = inflater.inflate(R.layout.item_head, parent,false);
        returnnewHeadHolder(view);
      caseBODY_TYPE:
        view = inflater.inflate(R.layout.item_body, parent,false);
        returnnewBodyHolder(view);
      caseFOOT_TYPE:
        view = inflater.inflate(R.layout.item_foot, parent,false);
        returnnewFootHolder(view);
    }
    returnnull;
  }
  @Override
  publicvoidonBindViewHolder(finalRecyclerView.ViewHolder holder,finalintposition) {
// ★ 3. 根据holder是哪一个ViewHolder的实例,来确定操作哪一个布局的UI
    if(holderinstanceofHeadHolder) {
      HeadHolder headHolder = (HeadHolder) holder;
      headHolder.mTvHead.setText(mHeadList.get(position) +"");
      headHolder.mTvHead.setOnClickListener(newView.OnClickListener() {
        @Override
        publicvoidonClick(View v) {
          addData();
        }
      });
    }
    if(holderinstanceofBodyHolder) {
      finalBodyHolder bodyHolder = (BodyHolder) holder;
      bodyHolder.mTvBody.setText(mBodyList.get(position - getHeadCount()) +"");
      bodyHolder.mTvBody.setOnClickListener(newView.OnClickListener() {
        @Override
        publicvoidonClick(View v) {
          removeData(bodyHolder.getAdapterPosition());
        }
      });
    }
    if(holderinstanceofFootHolder) {
      finalFootHolder footHolder = (FootHolder) holder;
      footHolder.mTvFoot.setText(mFootList.get(position - getHeadCount() - getBodyCount()) +"");
      footHolder.mTvFoot.setOnClickListener(newView.OnClickListener() {
        @Override
        publicvoidonClick(View v) {
          Toast.makeText(context, footHolder.getAdapterPosition() +"",
              Toast.LENGTH_SHORT).show();
        }
      });
    }
  }
  @Override
  publicintgetItemCount() {
    returngetHeadCount() + getBodyCount() + getFootCount();
  }
  privateintgetFootCount() {
    returnmFootList.size();
  }
  privateintgetBodyCount() {
    returnmBodyList.size();
  }
  privateintgetHeadCount() {
    returnmHeadList.size();
  }
  publicvoidaddData(intposition) {
    mBodyList.add(position,"Insert One");
//    ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果
    notifyItemInserted(position);
  }
  /**
   * 增加bodyList条目
   */
  publicvoidaddData() {
    mBodyList.add("1");
    mBodyList.add("2");
    mBodyList.add("3");
//    ★★★★ 使用notifyItemInserted去更新数据,否则没有动画效果
    notifyItemRangeInserted(0,3);
  }
  /**
   * 删除bodyList条目
   */
  publicvoidremoveData(intposition) {
//    经测试疯狂点击删除条目,会产生负数,导致越界异常
    if(!(position - getHeadCount() <0)) {
//    ★★★★ 防止角标越界异常,要减去头布局数量,总之去数数吧
      mBodyList.remove(position - getHeadCount());
      notifyItemRemoved(position);
    }
  }
  /**
   * 头布局Holder
   */
  staticclassHeadHolderextendsRecyclerView.ViewHolder {
    privateTextView mTvHead;
    publicHeadHolder(View itemView) {
      super(itemView);
      mTvHead = (TextView) itemView.findViewById(R.id.tv_head);
    }
  }
  /**
   * 身体布局Holder
   */
  staticclassBodyHolderextendsRecyclerView.ViewHolder {
    privateTextView mTvBody;
    publicBodyHolder(View itemView) {
      super(itemView);
      mTvBody = (TextView) itemView.findViewById(R.id.tv_body);
    }
  }
  /**
   * 脚布局Holder
   */
  staticclassFootHolderextendsRecyclerView.ViewHolder {
    privateTextView mTvFoot;
    publicFootHolder(View itemView) {
      super(itemView);
      mTvFoot = (TextView) itemView.findViewById(R.id.tv_foot);
    }
  }
}
 

item_body

item_head和item_foot类似就不粘贴了

 
 代码如下 复制代码
       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">
  
    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!"/>
 

热门栏目