RecyclerView的基本使用(二)

生活本來就不容易啊,正是我們的不努力才會讓生活變得更加無賴铆隘。

整個月沒有寫過博客卓舵,這幾天趁著看項目代碼有使用到ListView添加headView決定自己更新一下,使用RecyclerView來代替膀钠,記得之前就寫過一篇關(guān)于ReCyclerView的基本使用(一)掏湾,這次寫個續(xù)集吧。但是我們在setHeadView()的時候并沒有發(fā)現(xiàn)有這個方法肿嘲,至于為什么呢我也不知道融击,但是各路大神已經(jīng)優(yōu)雅的為其添加HeadView和FootView了例如鴻洋大神,還有Loader的,還有很多很多雳窟,所以基本上不用寫了尊浪,這篇筆記到此結(jié)束。嗯封救!
但是這筆記的意義不在此拇涤,只是想記錄一下自己的參考過程,不誉结,是思考過程鹅士。首先看看整個demo的預(yù)覽圖

阿拉蕾
基本思路

利用RecyclerView.Adapter中的getItemType()方法判斷一下這是否為headView,footView,在onCreateViewHolder(ViewGroup parent, int viewType)方法中判斷一下要給Viewholder的itemView是什么類型。就這樣惩坑。下面直接看代碼吧

基本實現(xiàn)

BaseRecyclerAdapter

/**
 * Created by AmatorLee on 2016/10/29.
 * 基類Adaper
 */

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder>{


    private static final int ITEM_HEAD = 1000;
    private static final int ITEM_FOOT = 2000;
    private static final int ITEM_NOMAL = 3000;

    private View mHeadView;
    private View mFootView;
    private List<T> mDatas;
    private LayoutInflater mInflater;


    /**
     * 點擊回調(diào)
     */
    private OnItemClickListener mListener;

    public void setListener(OnItemClickListener listener) {
        mListener = listener;
    }


    /**
     * 構(gòu)造方法
     * @param context
     * @param mDatas
     */
    public BaseRecyclerAdapter(Context context, List<T> mDatas) {
        mInflater = LayoutInflater.from(context);
        this.mDatas = mDatas;
    }

    /**
     * headView
     * @param headView
     */
    public void addHeadView(View headView){
        this.mHeadView = headView;
        notifyItemInserted(0);
    }
    public View getHeadView(){
        if (mHeadView != null){
            return mHeadView;
        }
        return null;
    }

    /**
     * FootView
     * @param footView
     */
    public void addFootView(View footView){
        this.mFootView = footView;
        notifyItemInserted(getItemCount() - 1);
    }
    public View getFootView(){
        if (mFootView != null){
            return mFootView;
        }
        return null;
    }

    @Override
    public BaseRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (mHeadView != null && viewType == ITEM_HEAD){
            //如果為headView則itemView為headView
            return new BaseRecyclerViewHolder(mHeadView);
        }else if (mFootView != null && viewType == ITEM_FOOT){
            //如果為footView則itemView為footView
            return new BaseRecyclerViewHolder(mFootView);
        }
        //否則自己解析
       return new BaseRecyclerViewHolder(mInflater.inflate(getLayoutID(),parent,false));
    }

    /*此方法為解析自己的view提供一個layoutId*/
    public abstract int getLayoutID();

    @Override
    public void onBindViewHolder(BaseRecyclerViewHolder holder, final int position) {
        /*判斷是否有headView掉盅,如果0被占用則position-1*/
        final int pos = getLayoutPos(holder);

        if (getItemViewType(position) == ITEM_HEAD)return;/*交予自己處理headView*/
        if (getItemViewType(position) == ITEM_FOOT)return;/*處理footView*/
        /*點擊監(jiān)聽*/
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    mListener.onItemClick(v,pos);
                }
            }
        });
        /*自己處理數(shù)據(jù)的方法*/
        onBindData(holder,pos);
    }
    /*判斷是否有headView也拜,如果0被占用則position-1*/
    private int getLayoutPos(BaseRecyclerViewHolder holder){
        return mHeadView == null?holder.getLayoutPosition():holder.getLayoutPosition() - 1;
    }

    /*自己處理數(shù)據(jù)的方法*/
    public abstract void onBindData(BaseRecyclerViewHolder holder, int position);

    @Override
    public int getItemCount() {
        if (mHeadView == null && mFootView != null){
            //如果footView則count+1
            return mDatas.size() + 1;
        }else if (mHeadView != null && mFootView == null){
            //如果有headView則+1
            return mDatas.size()+ 1;
        }else if(mFootView != null && mHeadView != null){
            //假如都有則+2
            return mDatas.size() + 2;
        }
        /*否則不處理*/
        return mDatas.size();
    }

    /***
     * 此方法判斷itemType的類型
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if (mHeadView == null && mFootView == null)return ITEM_NOMAL;
        if (position == 0 && mHeadView != null) return ITEM_HEAD;
        if (position == getItemCount() -1) return ITEM_FOOT;
        return ITEM_NOMAL;

    }

    /**
     *回調(diào)監(jiān)聽 
     */
    public interface OnItemClickListener{
        void onItemClick(View v, int pos);
    }
}```
**BaseViewHolder**

/**

  • Created by AmatorLee on 2016/10/29.
  • 基類Viewholder
    */

public class BaseRecyclerViewHolder extends RecyclerView.ViewHolder{

private SparseArray<View> mViews;/*傳說中裝在view性能好的容器,key為int型趾痘,value為View*/
public View itemView;

/**
 * 構(gòu)造方法
 * @param itemView
 */
public BaseRecyclerViewHolder(View itemView) {
    super(itemView);
    mViews = new SparseArray<>();
    this.itemView = itemView;
}

/**
 * 利用SpaseArray和泛型省略多次findViewbyid()
 * @param viewId id
 * @param <T> 類型
 * @return
 */
public <T extends View>T getView(int viewId){
    View view = mViews.get(viewId);
    if (view == null){
        view = itemView.findViewById(viewId);
        mViews.put(viewId,view);
    }
    return (T) view;
}

/**
 * 給外部調(diào)用的設(shè)置文本的方法
 * @param viewId
 * @param msg
 */
public void setText(int viewId,String msg){
    TextView textView = getView(viewId);
    textView.setText(msg);
}

/**
 * 給外部調(diào)用的設(shè)置圖片資源的方法
 * @param viewID
 * @param resID
 */
public void setImgRes(int viewID,int resID){
    ImageView imageView = getView(viewID);
    imageView.setImageResource(resID);
}

}```

  • 這里定義了一個BaseRecyclerAdapter And BaseViewHolder用以處理是否添加headView慢哈,代碼注釋比較清楚。
基本使用

使用起來也是十分簡單扼脐,我們新建一個自己的TestAdapter擴(kuò)展自BaseRecyclerAdapter岸军,需要實現(xiàn)其兩個抽象方法:

 @Override
    public int getLayoutID() {
        return R.layout.recycler_test;/*提供需要解析的layoutID*/
    }
    @Override
    public void onBindData(BaseRecyclerViewHolder holder, int position) {
        //處理數(shù)據(jù)
        holder.setText(R.id.recycler_textView,mDatas.get(position));
    }```
**TestAdapter**

/**

  • Created by AmatorLee on 2016/10/29.

  • 目的Adapter,處理自己的相關(guān)邏輯
    */
    public class TestAdapter extends BaseRecyclerAdapter<String> {

    private List<String> mDatas;
    private LayoutInflater mInflater;

    public TestAdapter(Context context, List<String> mDatas) {
    super(context, mDatas);
    mInflater = LayoutInflater.from(context);
    this.mDatas = mDatas;
    }

    @Override
    public int getLayoutID() {
    return R.layout.recycler_test;
    }

    @Override
    public void onBindData(BaseRecyclerViewHolder holder, int position) {
    holder.setText(R.id.recycler_textView,mDatas.get(position));
    }
    }```
    Activity

public class HFActivity extends AppCompatActivity {
    private List<String> mDatas = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hf);

        for (int i = 0; i < 30; i++) {
            mDatas.add("這是第" + i + "item");
        }
        RecyclerView recycler_hf = (RecyclerView) findViewById(R.id.recycler_hf);
        recycler_hf.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
        TestAdapter adapter = new TestAdapter(this, mDatas);
        recycler_hf.addItemDecoration(new ItemDecoration(this,LinearLayoutManager.VERTICAL));
        View view = getLayoutInflater().inflate(R.layout.layout_headview, null);
        adapter.addFootView(view);
        adapter.addHeadView(view);
        recycler_hf.setAdapter(adapter);
        adapter.setListener(new BaseRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                Toast.makeText(HFActivity.this,pos + "onClick",Toast.LENGTH_SHORT).show();
            }
        });
    }
}```

**效果演示**

![demo.gif](http://upload-images.jianshu.io/upload_images/2605454-9532a34e5740fc37.gif?imageMogr2/auto-orient/strip)
最近覺得要多使用github了瓦侮,所以把自己寫的一些demo放在github上面吧
[github地址](https://github.com/AmatorLee/RDemo/tree/master)

---
**總結(jié)**
RecyclerView已經(jīng)在逐步取代listView了艰赞,但是相對來說listview使用起來更加方便,雖然目前很多大神已經(jīng)將RecyclerView封裝得完美肚吏,但是我不是啊方妖,雖然可以用,但是我更加希望在使用之前可以先學(xué)習(xí)一遍罚攀。
#####如果你覺得本文有所錯漏党觅,麻煩留言指出,交流學(xué)習(xí)共同進(jìn)步
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斋泄,一起剝皮案震驚了整個濱河市杯瞻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炫掐,老刑警劉巖魁莉,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異募胃,居然都是意外死亡旗唁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門痹束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检疫,“玉大人,你說我怎么就攤上這事祷嘶∈合保” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵论巍,是天一觀的道長剿牺。 經(jīng)常有香客問我,道長环壤,這世上最難降的妖魔是什么晒来? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮郑现,結(jié)果婚禮上湃崩,老公的妹妹穿的比我還像新娘荧降。我一直安慰自己,他們只是感情好攒读,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布朵诫。 她就那樣靜靜地躺著,像睡著了一般薄扁。 火紅的嫁衣襯著肌膚如雪剪返。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天邓梅,我揣著相機(jī)與錄音脱盲,去河邊找鬼恰力。 笑死诊霹,一個胖子當(dāng)著我的面吹牛莉掂,可吹牛的內(nèi)容都是我干的敦跌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼衅疙,長吁一口氣:“原來是場噩夢啊……” “哼很魂!你這毒婦竟也來了趴樱?” 一聲冷哼從身側(cè)響起毅待,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤尚卫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尸红,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吱涉,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年驶乾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片循签。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡级乐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出县匠,到底是詐尸還是另有隱情风科,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布乞旦,位于F島的核電站贼穆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兰粉。R本人自食惡果不足惜故痊,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玖姑。 院中可真熱鬧愕秫,春花似錦慨菱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至甜孤,卻和暖如春协饲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缴川。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工茉稠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人二跋。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓战惊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扎即。 傳聞我的和親對象是個殘疾皇子吞获,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容