RecyclerView 的基本使用

RecyclerView 簡介

首先揩尸,可以理解 RecyclerView 是 ListView 的升級版伞辛,更加靈活,同時由于封裝了 ListView 的部分實現(xiàn)模燥,導(dǎo)致其使用更簡單强岸,結(jié)構(gòu)更清晰锻弓。

從名字 RecyclerView 來看,它直接提供了回收復(fù)用的功能蝌箍,雖然 ListView 我們也可以自己實現(xiàn) ViewHolder 以及 convertView 進行優(yōu)化青灼,但是在 RecyclerView 中暴心,它直接封裝了 ViewHolder 的回收復(fù)用,也就是說 RecyclerView 將 ViewHolder 標(biāo)準(zhǔn)化杂拨,我們不再需要面向 view 酷勺,而是直接面向 ViewHolder 編寫實現(xiàn)我們需要的 Adapter,這樣一來扳躬,邏輯結(jié)構(gòu)就變得非常清晰。

當(dāng)然甚亭,說到 RecyclerView 的優(yōu)點贷币,就不得不提它的 插拔式 的體驗,高度解耦:

布局(顯示方式):

可通過LayoutManager(LinearLayoutManager亏狰,GridLayoutManager役纹,StaggeredGridLayoutManager )設(shè)置;

分割線:

通過 ItemDecoration 實現(xiàn)

Item 增刪動畫:

通過 ItemAnimator

ViewHolder 的創(chuàng)建和綁定:

通過實現(xiàn) Adapter

除此之外暇唾,還需要額外提一下關(guān)于點擊事件的問題促脉,RecyclerView 本身是不提供點擊、長按事件的策州,而隔壁的 ListView 穩(wěn)穩(wěn)支持瘸味。對此,可能剛接觸 RecyclerView 的同學(xué)會瘋狂吐槽够挂,怎么作為升級版的 RecyclerView 在這一點上還不如舊版呢旁仿?

情況真的是這樣么?

顯然不是孽糖。

ListView 中對于點擊事件的處理枯冈,其實是有很大弊端的,它的 setOnItemClickListener() 方法是為子項注冊點擊事件办悟,這就導(dǎo)致只能識別到這一整個子項尘奏,對于子項中的組件比如按鈕就束手無策了。為此病蛉,RecyclerView 直接放棄了這個為子項注冊點擊事件的監(jiān)聽方法炫加,所有點擊事件都有具體 View 去注冊,好處顯而易見铡恕,我可以按需為組件注冊點擊事件琢感,不存在點擊不到的組件。

基礎(chǔ)知識補充

如果讀者從未接觸過 ListView 和 RecyclerView探熔,那么可能對前面提到的 ViewHolder驹针、Adapter等一頭霧水,為此在這里補充一些基礎(chǔ)知識诀艰。

LayoutManager:RecyclerView 會根據(jù) Layout Manager 提供的視圖來填充自身柬甥,常用的布局管理器有LinearLayoutManager(線性布局管理器)饮六、GridLayoutManager(網(wǎng)格布局管理器)、StaggeredGridLayoutManager (瀑布流布局管理器)等苛蒲。
ViewHolder:列表中的視圖由 ViewHolder 實例展示卤橄。 ViewHolder 用于對控件的實例進行緩存,負責(zé)顯示子項臂外。例如窟扑,如果列表顯示了音樂集合,那么每個 ViewHolder 可能代表一個專輯漏健。
Adapter:ViewHolder 對象由 Adapter 管理嚎货。Adapter 按需創(chuàng)建 ViewHolder,并為其綁定數(shù)據(jù)蔫浆。綁定意味著根據(jù) Adapter 中的位置為子視圖填充對應(yīng)的數(shù)據(jù)殖属。
下面我們就介紹一些關(guān)于RecyclerView 的用法。

RecyclerView 用法

基礎(chǔ)用法

首先瓦盛,由于 RecyclerView 屬于 v7-支持庫洗显,因此我們在使用之前需要先添加依賴:

dependencies {
    implementation 'com.android.support:recyclerview-v7:27.1.1'
}

接下來,RecyclerView 的核心使用流程如下:

mRecyclerView = findView(R.id.id_recycler_view);
//設(shè)置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
//設(shè)置adapter
mRecyclerView.setAdapter(mAdapter)
//設(shè)置Item增加原环、移除動畫
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割線
mRecyclerView.addItemDecoration(new DividerItemDecoration(
                getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

可能用慣了 ListView 挠唆,第一次接觸 RecyclerView 的同學(xué)會覺得,ListView 只需要一個 Adapter 就足夠了扮念,怎么 RecyclerView 的使用這么繁瑣损搬。

其實恰恰正是由于 RecyclerView 的高度解耦,本身只提供基本的回收和復(fù)用柜与,而其他特性都允許我們自己定制巧勤,因此我們可以通過它來靈活地實現(xiàn)各種 復(fù)雜花哨 的效果∨埃可以說颅悉,RecyclerView 以增加部分代碼的代價來增加其靈活性和擴展性。

下面就來介紹一下 如何通過 RecyclerView 輕松實現(xiàn)一個普通列表:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private MyAdapter mMyAdapter;
    private LinearLayoutManager mLayoutManager;
    private List<String> list;

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

        mRecyclerView = findViewById(R.id.recycler_view);
        mMyAdapter = new MyAdapter(list);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mMyAdapter);
    }

    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i <= 20; i++) {
            list.add("Item " + i);
        }
    }
}

MyAdapter.java

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

    //數(shù)據(jù)源
    private List<String> mList;

    public MyAdapter(List<String> list) {
        mList = list;
    }

    //返回item個數(shù)
    @Override
    public int getItemCount() {
        return mList.size() ;
    }

    //創(chuàng)建ViewHolder
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new NormalHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false));
    }

    //填充視圖
    @Override
    public void onBindViewHolder(@NonNull final MyAdapter.ViewHolder holder, final int position) {
        holder.mView.setText(mList.get(position));
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mView;

        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView.findViewById(R.id.text_view);
        }
    }
}

MainActivity 的布局文件迁匠,activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:divider="#FFFF0000"
        android:dividerHeight="10dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout >

子項布局剩瓶,Item.xml

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

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:gravity="center"
        android:background="#c0c7c759"
        android:textSize="20sp"
        android:text="1" />
</FrameLayout>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市城丧,隨后出現(xiàn)的幾起案子延曙,更是在濱河造成了極大的恐慌,老刑警劉巖亡哄,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枝缔,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機愿卸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門灵临,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趴荸,你說我怎么就攤上這事儒溉。” “怎么了发钝?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵顿涣,是天一觀的道長。 經(jīng)常有香客問我酝豪,道長园骆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任寓调,我火速辦了婚禮,結(jié)果婚禮上锄码,老公的妹妹穿的比我還像新娘夺英。我一直安慰自己,他們只是感情好滋捶,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布痛悯。 她就那樣靜靜地躺著,像睡著了一般重窟。 火紅的嫁衣襯著肌膚如雪载萌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天巡扇,我揣著相機與錄音扭仁,去河邊找鬼。 笑死厅翔,一個胖子當(dāng)著我的面吹牛乖坠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刀闷,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼熊泵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甸昏?” 一聲冷哼從身側(cè)響起顽分,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎施蜜,沒想到半個月后卒蘸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡花墩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年悬秉,在試婚紗的時候發(fā)現(xiàn)自己被綠了澄步。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡和泌,死狀恐怖村缸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情武氓,我是刑警寧澤梯皿,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站县恕,受9級特大地震影響东羹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忠烛,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一属提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧美尸,春花似錦冤议、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胯陋,卻和暖如春蕊温,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遏乔。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工义矛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盟萨。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓症革,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸯旁。 傳聞我的和親對象是個殘疾皇子噪矛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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