RecyclerView入門簡介

RecyclerView可以看作是ListView的進化版本,當然RecyclerView并不是繼承ListView的,RecyclerView直接繼承于ViewGroup父類扮叨。RecyclerView的靈活性與可替代性比listview更好,我們可以很方便的使用它完成ListView比較難完成的效果景东。

現在闻察,我們開始學習如何使用它:

** 添加依賴**

      compile 'com.android.support:recyclerview-v7:21.0.+'

在xml中配置

 <android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    />

** Acitvity中使用**

    RecyclerView mRecyclerView;
    RecyclerViewAdapter mAdapter;
    LinearLayoutManager mLayoutManager;
    
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mLayoutManager = new LinearLayoutManager(this);

    //改變方向
    //mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

    mRecyclerView.setLayoutManager(mLayoutManager);
    //添加間隔行,若不添加該句注釋即可 RecycleViewDivider為RecyclerView.ItemDecoration的實現類
    mRecyclerView.addItemDecoration(new RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL));
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    mAdapter =  new RecyclerViewAdapter(mdatas);
    mRecyclerView.setAdapter(mAdapter);

可以看到守伸,RecyclerView并不像ListView那樣只要設個adpter就完成了绎秒,它有很多自己可自定義的功能,可以很方便的完成很多效果尼摹。
比如: mRecyclerView.setLayoutManager(mLayoutManager); 就給了程序員很大的發(fā)揮空間见芹,因為有了布局管理,我們可以很方便的設置為
LinearLayoutManager 線性布局同時支持橫向蠢涝、縱向
GridLayoutManager時 為網格布局管理器
StaggeredGridLayoutManager 瀑布式布局管理器

- 適配器編寫

RecycleView是對ListView以及GridView的升級玄呛,在使用的時候同源更新需要使用Adapter適配器。但是RecycleView使用的適配器并不是之前的BaseAdapter了和二。RecycleView使用的適配器需要繼承RecyclerView.Adapter<VH extends RecycleView.ViewHolder>

我們將適配器的編寫流程分為:
1.繼承 RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>

2.完成內部類 ViewHolder 這個 ViewHolder不再是以前的BaseAdapter時我們寫的ViewHolder把鉴,而是需要繼承RecyclerView.ViewHolder抽象類的ViewHolder

3.編寫構造方法

4.onBindViewHolder中進行每個item的操作

5.若需要監(jiān)聽點擊事件,我們需要定義回調接口儿咱,并在第四步進行item的view操作時庭砍,添加監(jiān)聽事件回掉該接口

以下便是我的RecyclerViewAdapter代碼

/**
 * Created by Xiamin on 2016/9/2.
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    ListView
    private List<String> mdata;

    public RecyclerViewAdapter(List<String> data) {
        mdata = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.textView.setText(mdata.get(position));

        /**
         * 在綁定viewholder時 給每個view設置上觸摸監(jiān)聽
         */
        if (mOnItemClickListener != null) {
            holder.textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mOnItemClickListener.onItemClick(holder.itemView, position);
                }
            });

            holder.textView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    mOnItemClickListener.onItemLongClick(holder.itemView, position);

                    //返回true 這樣觸發(fā)了onLongClick后便不會再觸發(fā)onClick了
                    return true;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return mdata.size();
    }

    /**
     * 定義接口用于短按長按的回調
     */
    public interface OnRecyclerViewItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    /**
     * 添加點擊事件
     */
    private OnRecyclerViewItemClickListener mOnItemClickListener = null;

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }


    public void addData(int position) {
        mdata.add(position, "Insert One");
        notifyItemInserted(position);
    }

    public void removeData(int position) {
        mdata.remove(position);

        notifyItemRemoved(position);
        /**
         * 非常重要!;觳骸怠缸! 若不使用該方法通知適配器數據已經變了,notifyItemRemoved會導致item下標錯亂
         * 因為刪除某一項時調用notifyItemRemoved后钳宪,顯示的item是不會調用onBind方法的揭北,
         * 所以position并沒有被刷新。這時候得到的position值就是錯誤的吏颖。
         */
        notifyItemRangeChanged(position, mdata.size());

    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
        }
    }
}

初步運行

發(fā)現可以運行搔体,類似于簡單的listview(當然,item的xml配置代碼被我省略了)

  • 添加監(jiān)聽事件

我選擇在長按item時刪除該item半醉,刪除動畫在由該行設置

 mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(MainActivity.this, position + "pressed", LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(MainActivity.this, position + "Longpressed", LENGTH_SHORT).show();
                mAdapter.removeData(position);
            }
        });

** 遇坑**

完成該功能后疚俱,測試發(fā)現,刪除會出現問題缩多,動畫是有了呆奕,但是下標會亂养晋,導致刪除錯誤item、
因此便有了該行代碼梁钾。
因為刪除某一項時調用notifyItemRemoved后绳泉,顯示的item是不會調用onBind方法的,所以position并沒有被刷新姆泻。這時候得到的position值就是錯誤的零酪。我們需要手動使adapter給后面的item重新onBind

notifyItemRangeChanged(position, mdata.size());

至此,RecyclerView的便正常工作了拇勃。

總結
本文只是RecyclerView的一些基本使用四苇,有很多強大的功能還未能接觸,本文也比較初步潜秋,僅作入門引導蛔琅。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末胎许,一起剝皮案震驚了整個濱河市峻呛,隨后出現的幾起案子,更是在濱河造成了極大的恐慌辜窑,老刑警劉巖钩述,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異穆碎,居然都是意外死亡牙勘,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門所禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來方面,“玉大人,你說我怎么就攤上這事色徘」Ы穑” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵褂策,是天一觀的道長横腿。 經常有香客問我,道長斤寂,這世上最難降的妖魔是什么耿焊? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮遍搞,結果婚禮上罗侯,老公的妹妹穿的比我還像新娘。我一直安慰自己溪猿,他們只是感情好歇父,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布蒂培。 她就那樣靜靜地躺著,像睡著了一般榜苫。 火紅的嫁衣襯著肌膚如雪护戳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天垂睬,我揣著相機與錄音媳荒,去河邊找鬼。 笑死驹饺,一個胖子當著我的面吹牛钳枕,可吹牛的內容都是我干的。 我是一名探鬼主播赏壹,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鱼炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝌借?” 一聲冷哼從身側響起昔瞧,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菩佑,沒想到半個月后自晰,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡稍坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年酬荞,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞧哟。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡混巧,死狀恐怖,靈堂內的尸體忽然破棺而出勤揩,到底是詐尸還是另有隱情咧党,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布雄可,位于F島的核電站凿傅,受9級特大地震影響,放射性物質發(fā)生泄漏数苫。R本人自食惡果不足惜聪舒,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虐急。 院中可真熱鬧箱残,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盼理,卻和暖如春谈山,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宏怔。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工奏路, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臊诊。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓鸽粉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抓艳。 傳聞我的和親對象是個殘疾皇子触机,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內容