RecycleView的使用(二)

上次我们了一些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{
 //设置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的布局文件:


    
  
 

布局文件很简单,我就放了一张图片,具体的按项目要求来就可以;

接下来就是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 的添加,我们运行一下看看效果:

RecycleView的使用(二)_第1张图片
Paste_Image.png
RecycleView的使用(二)_第2张图片
Paste_Image.png

是不是就已经完成我们的目的了呢~~~愉快的继续撸代码吧~

你可能感兴趣的:(RecycleView的使用(二))