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

Paste_Image.png
Paste_Image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容