原文博客地址:http://www.apkbus.com/blog-920677-76896.htmlhtml
在列表或網格元素的顯示是移動應用的一個很常見的模式。 用戶看到的項目的集合,能夠經過滾動的集合。 項目能夠是一個列表,網格或另外一種結構化的數據表示。 等活動所描繪的是一個。java
用戶經過觸摸事件或工具欄項的集合的相互做用。 個別項目能夠選擇。 這個選擇可能更新工具欄或屏幕詳細基於觸發的選擇。 如下。android
這個recyclerview
類支持一系列的數據顯示。編程
這是一個現代版的ListView
和GridView控件
Android框架提供的類。 回收觀問題,現有部件的地址有幾個。 它執行的編程風格,產生了良好的性能。 它默認動畫去也。app
recyclerview
容許使用不一樣的佈局管理器定位項目。框架
回收視圖使用viewholder
存儲引用的觀點來看,在回收一個條目。 viewholder
類在適配器持有相關觀點引用靜態內部類。 這些引用你的代碼能夠避免findviewbyid()
用新的數據更新的部件的方法。函數
一個適配器管理數據模型和適應個別條目 擴展部件。recyclerview。適配器
階級和被分配到回收的觀點經過recyclerview.setadapter
方法。輸入適配器一個回收的 視圖能夠是任意的java對象。 在此輸入適配器總數必須歸還物品getitemcount()
方法工具
適配器準備項目的佈局,爲每一個單獨的數據元素充氣正確的佈局。 這工做了oncreateviewholder
方法 它返回一個對象。viewholder
每一個視覺進入回收期。佈局
這個實例是用於訪問在佈局視圖。 oncreateviewholder
方法只叫新視圖必須建立。性能
在一個回收查看每個可見的入口充滿了正確的數據模型項的適配器。 一旦數據項變得可見,適配器將此數據個別部件他膨脹的早期工做。 這onbindviewholder
方法
例如,在一個列表中的條目可能會在左側,兩行文字中,以下面的圖形描述的圖像。
一個這樣的線可能看起來像下面的佈局文件。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:padding="6dip" > <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentTop="true" android:layout_marginRight="6dip" android:contentDescription="TODO" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/secondLine" android:layout_width="fill_parent" android:layout_height="26dip" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_toRightOf="@id/icon" android:ellipsize="marquee" android:maxLines="1" android:text="Description" android:textSize="12sp" /> <TextView android:id="@+id/firstLine" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@id/secondLine" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_alignWithParentIfMissing="true" android:layout_toRightOf="@id/icon" android:gravity="center_vertical" android:text="Example application" android:textSize="16sp" /> </RelativeLayout>
這個recyclerview
部件交付做爲圖書館能夠做爲API 7級或更高。 添加一個依賴最新版本庫到你的搖籃,創建文件使用。
dependencies { ... compile "com.android.support:recyclerview-v7:25.3.1" }
佈局管理器決定如何在數據recyclerview
顯示。 回收查看圖書館提供下列建設佈局。
linearlayoutmanager顯示垂直滾動列表或水平的項目。
gridlayoutmanager顯示在一個網格項目。
staggeredgridlayoutmanager顯示在一個網格項目。
實施recyclerview
須要幾類來實現。 類最重要的列在下面
類 | 目的 | 可選 |
---|---|---|
適配器 |
提供的數據,負責建立的我的參賽的意見 |
要求的 |
viewholder |
包含全部的視圖的輸入數據填充的參考 |
要求的 |
佈局管理器 |
包含全部的視圖的輸入數據填充的參考 |
須要,可是默認的實現 |
itemdecoration |
負責繪製裝飾在頂部或入口視圖容器 |
默認的行爲,但能夠被重寫 |
itemanimator |
負責若是添加條目定義動畫,刪除或從新排序 |
默認的行爲,但能夠被重寫 |
你也能夠爲佈局管理器和動畫提供自定義實現。
觸摸事件,如點擊應該由回收的意見處理。 若是視圖應該引起一些對象在使用它(活動或片斷),你能夠經過構造函數的適配器經過它。 這容許適配器存儲對象的引用和調用它的方法。
適配器須要爲每一個條目提供的視圖層次結構。 典型完成充氣的XML佈局。
<LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="?android:attr/listPreferredItemHeight"> <!-- views contained in each line --> </LinearLayout>
這根的佈局是一個典型的ViewGroup
(佈局管理器)和包含幾個其餘的觀點。 下圖顯示列表佈局爲奇數和偶數的不一樣了。
在getitemviewtype
方法的回收期肯定哪些類型應該用於數據 框架自動調用。oncreateviewholder
若是這種類型的須要。 這個方法你佈置充氣正確的類型,並返回一個擬合的觀點。
在「自定義動畫recyclerview
,實現本身的動畫的擴展recyclerview.itemanimator
類並使用recyclerview。setitemanimator()方法爲它指定 你的插件。
過濾和排序是經過適配器來處理。 你須要邏輯在自定義適配器來實現。
這個notifyiteminserted(位置)
在適配器的方法能夠用來通知認爲,一個新條目已插在某個位置。
這個notifyitemremoved(位置)
方法可用於通知認爲條目已在某個位置刪除。
這個itemtouchhelper
類使刷卡解僱和拖放簡單實現。 實施ONMOVE
拖放的方法和onswiped
對核工業的支持。
看到[ recyclerview_swipe ]一個實例的實現。
在這個練習中你建立了一個項目使用recyclerview
類顯示一個列表。
建立一個新的Android項目使用com.vogella.android.recyclerview
頂層包名。
添加如下依賴你的搖籃,構建文件。
dependencies { ... compile "com.android.support:recyclerview-v7:25.3.1" }
建立或更新配置文件稱爲activity_main.xml因此,它包含recyclerview
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- A RecyclerView with some commonly used attributes --> <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="12dp" android:layout_marginRight="12dp" android:elevation="2dp" android:src="@android:drawable/ic_menu_add" /> </RelativeLayout>