RecycleView的使用(二)

上次我們了一些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)行一下看看效果:

Paste_Image.png
Paste_Image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容