上次我们了一些RecycleView的初步使用过程,对比来看ListView,似乎没有什么好多的区别。今天我们来学习一个很有用的东西--如何给RecycleView添加Header。相信你在看完后能够举一反三,完成一个更漂亮的RecycleView,因为其中的道理都一样。
我们今天要学习的东西:
- RecycleView item的type写法
- RecycleView添加onItemClick
大家都知道,ListView是有添加header和footer这个两种方法的,然而纵观RecycleView,根本就没有谈到这相关的东西,最近的一个项目中需要在RecycleView上面加一个Banner(其实说白了就是加一个header),以下就是自己对header的学习总结。
观察
在Adapter中有这么个方法,用来返回给我们一个ViewHolder;
onCreateViewHolder(ViewGroup parent, int viewType)
仔细看发现他的第二个参数是一个viewType,从字面上的意思我们都知道代表着当前item的类型。既然发现了,那我们就从这里开始下手~:
操作
修改我们的Adapter
//改变了ViewHolder类型
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
//设置item的两种类型
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
//设置HeaderView
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
//设置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后准确的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);
}
}
}
在这里通过if语句分别在onCreatViewHolder和onBindViewHolder中分别进行判断,加载不同的View,并且对不同的view进行操作,代码很简单,基本上跟着注释就看明白了。
在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>
布局文件很简单,我就放了一张图片,具体的按项目要求来就可以;
接下来就是Activity了,看懂了Adapter,再看Activity就简单的很了:
//添加一个方法
private void setHeader(RecyclerView view){
View header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
myAdapter.setHeaderView(header);
}
...
//找OnCreat里面加入一行就OK
setHeader(recyclerView);
运行
完成了上面的就已经完成了header 的添加,我们运行一下看看效果:
是不是就已经完成我们的目的了呢~~~愉快的继续撸代码吧~