RecyclerView添加头部、尾部View
效果图:

原理:
1、在Adapter中getItemCount()中返回数据集合总数+2。
2、在Adapter中onCreateViewHolder中在第一、最后一个位置返回head、foot的布局View。
话不多说,上代码:
package adapter;
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.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.zpf.animmenu.R;
import java.util.ArrayList;
/**
* 带有头部、尾部的RecyclerView的Adapter
*/
public class RvAdapterHeadFoot extends RecyclerView.Adapter<RvAdapterHeadFoot.HFViewHolder> {
/**
* 头部View类型
*/
private final int TYPE_HEAD = ;
/**
* 正常Item类型
*/
private final int TYPE_ITEM = ;
/**
* 尾部View类型
*/
private final int TYPE_FOOT = -;
private Context mContext;
private ArrayList<String> strings = new ArrayList<>();
public RvAdapterHeadFoot(Context context) {
this.mContext = context;
}
public void setModels(ArrayList<String> strings) {
if (strings != null && !strings.isEmpty()) {
this.strings = strings;
notifyDataSetChanged();
}
}
@Override
public int getItemViewType(int position) {
//根据position返回不同viewType,在onCreateViewHolder中初始化不同的布局
if (position == )
return TYPE_HEAD;
else if (position == strings.size() + )
return TYPE_FOOT;
return TYPE_ITEM;
}
@Override
public HFViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == TYPE_HEAD)
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_head_rv, parent, false);
else if (viewType == TYPE_FOOT)
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot_rv, parent, false);
else
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_head_foot_rv, parent, false);
return new HFViewHolder(view, viewType);
}
@Override
public void onBindViewHolder(HFViewHolder holder, int position) {
int viewType = getItemViewType(position);
if (viewType == TYPE_HEAD) {
//显示、控件操作可在这里处理,我这边直接return;
return;
}
if (viewType == TYPE_FOOT) {
//显示、控件操作可在这里处理,我这边直接return;
return;
}
//这里positionModel是在数据集合ArrayList<String>中的真实position;
int positionModel = position - ;
String url = strings.get(positionModel);
Glide.with(mContext).load(url).thumbnail(f).placeholder(R.mipmap.img_eig).into(holder.iv);
holder.tv.setText(url);
}
@Override
public int getItemCount() {
//因为添加了Head_View、Foot_View所以这里+2
return strings.size() + ;
}
class HFViewHolder extends RecyclerView.ViewHolder {
private ImageView iv;
private TextView tv;
HFViewHolder(View itemView, int viewType) {
super(itemView);
if (viewType == TYPE_FOOT || viewType == TYPE_HEAD) {
//如果head/foot当中有控件的显示操作,可以在这里声明控件,我这里直接return;
return;
}
iv = (ImageView) itemView.findViewById(R.id.iv_item_head_foot);
tv = (TextView) itemView.findViewById(R.id.tv_item_head_foot);
}
}
}
在Activity中的使用就和正常的Adapter一样
package com.example.zpf.animmenu;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import adapter.RvAdapterHeadFoot;
public class RecyclerHeadFootActivity extends AppCompatActivity {
private final String[] urls = {
"http://hbimg.b0.upaiyun.com/6293fd60a2597a6017633e3c8e3816d89b70dc2165ad9-jkFvRh_fw658",
"http://icon.nipic.com/BannerPic/20160426/photo/20160426160807.jpg",
"http://icon.nipic.com/BannerPic/20160426/photo/20160426160826.jpg",
"http://icon.nipic.com/BannerPic/20160426/photo/20160426160848.jpg",
"http://icon.nipic.com/BannerPic/20160426/photo/20160426160908.jpg",
"http://icon.nipic.com/BannerPic/20160426/photo/20160426160926.jpg",
"http://pic94.nipic.com/file/20160409/11284670_185122899000_2.jpg",
"http://pic94.nipic.com/file/20160403/22743169_220209251000_2.jpg",
"http://pic94.nipic.com/file/20160410/18807750_102028863000_2.jpg",
"http://pic94.nipic.com/file/20160406/22743169_234848884000_2.jpg",
"http://pic94.nipic.com/file/20160406/19700831_040444643000_2.jpg",
"http://pic94.nipic.com/file/20160321/7874840_094355922000_2.jpg",
"http://pic94.nipic.com/file/20160406/22743169_233812263000_2.jpg",
"http://pic94.nipic.com/file/20160407/21544848_224025191000_2.jpg"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_head_foot);
initView();
}
private void initView() {
RecyclerView rv = (RecyclerView) findViewById(R.id.rv_head_foot);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setHasFixedSize(true);
ArrayList<String> strings = new ArrayList<>();
strings.addAll(Arrays.asList(urls));
RvAdapterHeadFoot adapter = new RvAdapterHeadFoot(this);
adapter.setModels(strings);
rv.setAdapter(adapter);
}
}
Activity的布局文件xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.zpf.animmenu.RecyclerHeadFootActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_head_foot"
android:layout_width="0dp"
android:layout_height="0dp"
android:layoutAnimation="@anim/layout_vertical_enter"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
上边布局文件用到的layoutAnimation
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animationOrder="normal"
android:delay="40%"
android:animation="@anim/anim_room_notice_enter">
</layoutAnimation>
Adapter当中用的Head布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:background="@color/colorBlack"
android:orientation="vertical">
<ImageView
android:layout_width="120dp"
android:layout_height="60dp"
android:layout_marginTop="16dp"
android:contentDescription="@null"
android:scaleType="centerCrop"
android:src="@mipmap/bg_width" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="24dp"
android:gravity="center"
android:text="黑色部分为head"
android:textColor="@color/colorWhite"/>
</LinearLayout>
Foot布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
android:layout_width="24dp"
android:layout_height="24dp"
style="@style/Base.TextAppearance.AppCompat.Small.Inverse"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Foot布局"
android:layout_margin="16dp"
android:textSize="14sp"/>
<ProgressBar
android:layout_width="24dp"
android:layout_height="24dp"
style="@style/Base.TextAppearance.AppCompat.Small.Inverse"/>
</LinearLayout>
Item布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:contentPadding="8dp"
app:cardElevation="2dp"
app:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_item_head_foot"
android:layout_width="56dp"
android:layout_height="56dp"
android:contentDescription="@null"
android:src="@mipmap/ic_header"
android:scaleType="centerCrop"/>
<TextView
android:id="@+id/tv_item_head_foot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:textSize="14sp"
android:lines="2"
android:lineSpacingMultiplier="1.2"/>
</LinearLayout>
</android.support.v7.widget.CardView>
Ok,到这里RecyclerView使用系列(一)添加Head/Foot就讲完了,下一篇我将介绍RecyclerView的下拉刷新、上拉加载更多、Item的点击事件三个小功能。
That’s all,如果有兴趣,复制代码尝试下吧。