上次我們了一些RecycleView的初步使用過(guò)程,對(duì)比來(lái)看ListView,似乎沒(méi)有什么好多的區(qū)別。今天我們來(lái)學(xué)習(xí)一個(gè)很有用的東西--如何給RecycleView添加Header。相信你在看完后能夠舉一反三,完成一個(gè)更漂亮的RecycleView,因?yàn)槠渲械牡览矶家粯印?/h6>
我們今天要學(xué)習(xí)的東西:
- RecycleView item的type寫法
- RecycleView添加onItemClick
大家都知道,ListView是有添加header和footer這個(gè)兩種方法的,然而縱觀RecycleView,根本就沒(méi)有談到這相關(guān)的東西,最近的一個(gè)項(xiàng)目中需要在RecycleView上面加一個(gè)Banner(其實(shí)說(shuō)白了就是加一個(gè)header),以下就是自己對(duì)header的學(xué)習(xí)總結(jié)。
觀察
在Adapter中有這么個(gè)方法,用來(lái)返回給我們一個(gè)ViewHolder;
onCreateViewHolder(ViewGroup parent, int viewType)
仔細(xì)看發(fā)現(xiàn)他的第二個(gè)參數(shù)是一個(gè)viewType,從字面上的意思我們都知道代表著當(dāng)前item的類型。既然發(fā)現(xiàn)了,那我們就從這里開始下手~:
操作
修改我們的Adapter
//改變了ViewHolder類型
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
//設(shè)置item的兩種類型
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
//設(shè)置HeaderView
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
//設(shè)置setOnItemClickListener
public void setOnItemClickListener(OnItemClickListener listener){ mListener = listener;}
@Override
public int getItemViewType(int position) {
if (mHeaderView == null){
return TYPE_NORMAL;
}else if (position ==0){
return TYPE_HEADER;
}else {
return TYPE_NORMAL;
}
}
//onCreatViewHolder中
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new Holder(mHeaderView);
}
View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_normal, parent, false);
return new Holder(layout);
//onBindViewHolder中
if(getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(holder);
final String data = dataLists.get(pos);
if(holder instanceof Holder) {
((Holder) holder).mTextView.setText(data);
if(mListener == null) return;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(pos, data);
}
});
}
//得到添加了Header后準(zhǔn)確的position
public int getRealPosition(RecyclerView.ViewHolder holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
public class Holder extends RecyclerView.ViewHolder {
public TextView mTextView;
public Holder(View itemView) {
super(itemView);
if (itemView== mHeaderView) return;
mTextView = (TextView)itemView.findViewById(R.id.item_normal_tv);
}
}
}
在這里通過(guò)if語(yǔ)句分別在onCreatViewHolder和onBindViewHolder中分別進(jìn)行判斷,加載不同的View,并且對(duì)不同的view進(jìn)行操作,代碼很簡(jiǎn)單,基本上跟著注釋就看明白了。
在Adapter里面需要用到的文件:
OnItemClickListener的接口
public interface OnItemClickListener {
void onItemClick(int position,String data);
}
header的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_margin="16dp"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
布局文件很簡(jiǎn)單,我就放了一張圖片,具體的按項(xiàng)目要求來(lái)就可以;
接下來(lái)就是Activity了,看懂了Adapter,再看Activity就簡(jiǎn)單的很了:
//添加一個(gè)方法
private void setHeader(RecyclerView view){
View header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
myAdapter.setHeaderView(header);
}
...
//找OnCreat里面加入一行就OK
setHeader(recyclerView);
運(yùn)行
完成了上面的就已經(jīng)完成了header 的添加,我們運(yùn)行一下看看效果:


是不是就已經(jīng)完成我們的目的了呢~~~愉快的繼續(xù)擼代碼吧~