最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Android中RecyclerView多种item布局的写法(头布局+脚布局)
时间:2017-01-09 编辑:简简单单 来源:一聚教程网
RecyclerView多个item布局的写法(头布局+脚布局)
上图
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
privateList
privateList
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
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
privateList
privateList
privatestaticfinalintHEAD_TYPE =1;
privatestaticfinalintBODY_TYPE =2;
privatestaticfinalintFOOT_TYPE =3;
publicMyAdapter(Context context, List
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!"/>
|
-
上一个: Android系统默认对话框添加图片功能
相关文章
- sora软件价格介绍 02-22
- sora官网入口地址一览 02-22
- Sora生成的视频使用教程 02-22
- 《梦幻西游》元宵灯谜线索答案大全2024 02-22
- 《原神》有朋自远方来第一天通关攻略 02-22
- 《苏醒之路》四个结局达成攻略 02-22