Android控件開發(fā)——RecycleView的使用總結(jié)(上)

文/程序員男神

前言

最近一直都在忙公司的新項目硬梁,忙的連自己學(xué)習(xí)的時間都沒了(此處有掌聲),又厚著臉皮裝逼了一次胞得,回到家都累成狗荧止,還要總結(jié)最近學(xué)習(xí)的技術(shù)。這個總結(jié)會分為三篇去寫阶剑,讓你從懵懂無知變成情場高手罩息,錯錯錯...,變成職場達(dá)人个扰。
今天本來約小女友出去吃飯,因為是自己生日葱色,誰知今天她臨時有事递宅,就在家擼代碼給自己過個生日吧!


aj

概述

RecycleView為什么會取代ListView苍狰?
RecylerView是support-v7包中的新組件办龄,是一個強(qiáng)大的滑動組件。
優(yōu)勢如下:
1淋昭、RecylerView封裝了ViewHolder的回收復(fù)用俐填,也就是說RecylerView標(biāo)準(zhǔn)化了ViewHolder,編寫Adapter面向的是ViewHolder而不再是View了翔忽,復(fù)用的邏輯被封裝了英融,寫起來更加簡單。
2歇式、提供了一種插拔式的體驗驶悟,高度的解耦,異常的靈活材失,針對一個Item的顯示RecylerView專門抽取出了相應(yīng)的類痕鳍,來控制Item的顯示,使其的擴(kuò)展性非常強(qiáng)。
3笼呆、可以控制Item增刪的動畫熊响,可以通過ItemAnimator這個類進(jìn)行控制,當(dāng)然針對增刪的動畫诗赌,RecylerView有其自己默認(rèn)的實現(xiàn)汗茄。

RecycleView的基本用法

1、你想要控制其顯示的方式境肾,請通過布局管理器LayoutManager
2剔难、你想要控制Item間的間隔(可繪制),請通過ItemDecoration
3奥喻、你想要控制Item增刪的動畫偶宫,請通過ItemAnimator
4、你想要控制點擊环鲤、長按事件纯趋,對不起,自己Mark接口回調(diào)
5冷离、你想要控制Item的增刪吵冒,對不起,也是自己Mark
相應(yīng)代碼:

 mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
//設(shè)置分割線
 mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
 mLayoutManager = new LinearLayoutManager(this);
//設(shè)置布局管理器
 mRecyclerView.setLayoutManager(mLayoutManager);
//綁定數(shù)據(jù)
 mAdapter = new RecycleAdapter(list);
//設(shè)置Item增加西剥、移除動畫
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//設(shè)置Adapter
 mRecyclerView.setAdapter(mAdapter);

//點擊痹栖、長按回調(diào)接口代碼
   /**
     * 定義接口回調(diào)
     */
    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    private OnItemClickListener mOnItemClickListener;

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

 /**
     * 向指定位置添加元素
     */
    public void addItem(int position, String value) {
        if (position > data.size()) {
            position = data.size();
        }
        if (position < 0) {
            position = 0;
        }
        /**
         * 使用notifyItemInserted/notifyItemRemoved會有動畫效果
         * 而使用notifyDataSetChanged()則沒有
         */
        data.add(position, value);//在集合中添加這條數(shù)據(jù)
        notifyItemInserted(position);//通知插入了數(shù)據(jù)
    }

    /**
     * 移除指定位置元素
     */
    public String removeItem(int position) {
        if (position > data.size() - 1) {
            return null;
        }
        String value = data.remove(position);//所以還需要手動在集合中刪除一次
        notifyItemRemoved(position);//通知刪除了數(shù)據(jù),但是沒有刪除list集合中的數(shù)據(jù)
        return value;
    }

要想使用,我們需要在gradle中添加依賴:

compile 'com.android.support:recyclerview-v7:25.3.1'

具體事例代碼:

MainActivity的代碼:

/**
 * desc: Recycle的簡單使用
 * author: dj
 * date: 2017/3/2 9:57
 */

public class RecycleActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private RecycleAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private List<String> list;

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

        initDate();
        initView();

    }

    private void initDate() {
        list = new ArrayList<String>();
        for (int i = 0; i < 20; i++) {
            list.add("西紅柿炒雞蛋");
        }
    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new RecycleAdapter(list);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new RecycleAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(RecycleActivity.this,"onItemClick",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onItemLongClick(View view, int position) {
                Toast.makeText(RecycleActivity.this,"onItemLongClick",Toast.LENGTH_SHORT).show();
            }
        });

    }
}

接下來我們看看我們的Adapter怎么去寫?
代碼如下:

/**
 * desc: RecycleView的Adapter
 * author: dj
 * date: 2017/2/28 15:20
 */

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> {

    private List<String> date;

    //構(gòu)造器瞭空,接受數(shù)據(jù)集
    public RecycleAdapter(List<String> date) {
        this.date = date;
    }

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

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        //將數(shù)據(jù)填充到具體的view中
        holder.icon.setImageResource(R.drawable.jian);
        holder.title.setText(date.get(position));
        holder.desc.setText(date.get(position));

        // 如果設(shè)置了回調(diào)揪阿,則設(shè)置點擊事件
        if (mOnItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position1 = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(holder.itemView, position1);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int position1 = holder.getLayoutPosition();
                    mOnItemClickListener.onItemLongClick(holder.itemView, position1);
                    return false;
                }
            });
        }
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView icon;
        public TextView title;
        public TextView desc;

        public ViewHolder(View itemView) {
            super(itemView);
            //由于itemView是item的布局文件,我們需要的是里面的textView咆畏,因此利用itemView.findViewById獲
            //取里面的textView實例南捂,后面通過onBindViewHolder方法能直接填充數(shù)據(jù)到每一個textView了
            icon = (ImageView) itemView.findViewById(R.id.item_image);
            title = (TextView) itemView.findViewById(R.id.item_title);
            desc = (TextView) itemView.findViewById(R.id.item_desc);

        }
    }

    /**
     * 定義接口回調(diào)
     */
    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    private OnItemClickListener mOnItemClickListener;

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

接下來就是我們簡單一下xml文件:
activity_recycle的代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

item_list的代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="100dp"
        android:layout_height="70dp"
        android:padding="6dp" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/item_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="@android:style/TextAppearance.Large" />

        <TextView
            android:id="@+id/item_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="2" />
    </LinearLayout>
</LinearLayout>

效果圖如下:

RecycleView

總結(jié)

上面這些就是RecycleView的基本使用,顯示一個圖片旧找,兩行文字的效果溺健。
參考:http://blog.csdn.net/lmj623565791/article/details/45059587

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钮蛛,隨后出現(xiàn)的幾起案子鞭缭,更是在濱河造成了極大的恐慌,老刑警劉巖魏颓,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚去,死亡現(xiàn)場離奇詭異,居然都是意外死亡琼开,警方通過查閱死者的電腦和手機(jī)易结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搞动,你說我怎么就攤上這事躏精。” “怎么了鹦肿?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵矗烛,是天一觀的道長。 經(jīng)常有香客問我箩溃,道長瞭吃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任涣旨,我火速辦了婚禮歪架,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霹陡。我一直安慰自己和蚪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布烹棉。 她就那樣靜靜地躺著攒霹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浆洗。 梳的紋絲不亂的頭發(fā)上催束,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音伏社,去河邊找鬼泣崩。 笑死,一個胖子當(dāng)著我的面吹牛洛口,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凯沪,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼第焰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妨马?” 一聲冷哼從身側(cè)響起挺举,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烘跺,沒想到半個月后湘纵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滤淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年梧喷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铺敌,死狀恐怖汇歹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偿凭,我是刑警寧澤产弹,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弯囊,受9級特大地震影響痰哨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匾嘱,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一斤斧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奄毡,春花似錦折欠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盗忱,卻和暖如春酱床,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟佃。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工扇谣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲昭。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓罐寨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親序矩。 傳聞我的和親對象是個殘疾皇子鸯绿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,149評論 25 707
  • 自Android 5.0之后,谷歌公司推出了RecylerView控件簸淀,RecylerView,我想看到一個新名詞...
    苦可樂閱讀 2,314評論 0 5
  • 使用vue-cli腳手架工具快速搭建單頁面應(yīng)用瓶蝴,請確保node.js已經(jīng)安裝,如果沒有安裝可以先瀏覽我寫的NVM-...
    David_Peng閱讀 1,449評論 0 1
  • 我不會寫租幕,寫不好舷手,有誰對腦洞感興趣給我留個言就拿去用吧。 大筒木輝夜穿越到創(chuàng)設(shè)期劲绪,并得到火影全集男窟,圍觀兩個孫子轉(zhuǎn)世...
    瑞丘丘閱讀 157評論 0 0
  • 小時候盆赤,常聽老人說節(jié)氣。四月維夏蝎宇,六月徂暑弟劲,轉(zhuǎn)眼九月浮槎,鴻雁來賓姥芥,這一年也算過了一大半了兔乞。傳說中,浮槎是連通往來...
    cappu7ino閱讀 946評論 0 4