Android 高級編程 RecyclerView 控件的使用

????? RecyclerView 是Android 新添加的一個用來取代ListView的控件,它的靈活性與可替代性比listview更好。

看一下繼承關系:

ava.lang.Object
????android.view.View
?????android.view.ViewGroup
??????android.support.v7.widget.RecyclerView
Known Direct Subclasses

介紹

RecyclerView與ListView原理是類似的:都是僅僅維護少量的View并且可以展示大量的數據集。RecyclerView用以下兩種方式簡化了數據的展示和處理:

  • 使用LayoutManager來確定每一個item的排列方式。

  • 為增加和刪除項目提供默認的動畫效果。

你也可以定義你自己的LayoutManager和添加刪除動畫,RecyclerView項目結構如下:

  • Adapter:使用RecyclerView之前,你需要一個繼承自RecyclerView.Adapter的適配器,作用是將數據與每一個item的界面進行綁定。

  • LayoutManager:用來確定每一個item如何進行排列擺放,何時展示和隱藏。回收或重用一個View的時候,LayoutManager會向適配器請求新的數據來替換舊的數據,這種機制避免了創建過多的View和頻繁的調用findViewById方法(與ListView原理類似)。

學習原因:

那么有了ListView、GridView為什么還需要RecyclerView這樣的控件呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  • 你想要控制其顯示的方式,請通過布局管理器LayoutManager
  • 你想要控制Item間的間隔(可繪制),請通過ItemDecoration
  • 你想要控制Item增刪的動畫,請通過ItemAnimator
  • 你想要控制點擊、長按事件,需要自己實現

目前SDK中提供了三種自帶的LayoutManager:

  • LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

第一節、簡單的RecyclerView使用方法

本節所示示例是一個最簡單的使用方法,作者用的環境是Android Studio 1.5。

1、添加依賴

在AS的build.gradle中添加依賴,然后同步一下就可以引入依賴包:

compile 'com.android.support:recyclerview-v7:23.1.1'
注意:版本需要和其它保持一致,如其它是 23.3,這里也需要改成23.3;

2、編寫代碼

添加完依賴之后,就開始寫代碼了,與ListView用法類似,也是先在xml布局文件中創建一個RecyclerView的布局:

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

    tools:context="com.jcdh.jcli.recyclerview.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:scrollbars="vertical"
        android:id="@+id/recyclerView"
        android:layout_marginTop="60dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"></android.support.v7.widget.RecyclerView>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Add Item"
        android:id="@+id/button"
        android:onClick="addRecyclerItem"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:textSize="20sp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_toLeftOf="@+id/button"
        android:layout_toStartOf="@+id/button" />
</RelativeLayout>
創建完布局之后在MainActivity中獲取這個RecyclerView,并聲明LayoutManagerAdapter,代碼如下:

mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
//創建默認的線性LayoutManager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以確定每個item的高度是固定的,設置這個選項可以提高性能
mRecyclerView.setHasFixedSize(true);
//創建并設置Adapter
mAdapter = newMyAdapter(getData());
mRecyclerView.setAdapter(mAdapter);
getData():
private List<String>getDummyDatas()
{List<String> array = new ArrayList<>();for(int i = 0;i<110;i++){array.add("我是"+i);}return array;}
接下來的問題就是Adapter的創建:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>  {public List<String> datas = null;public MyAdapter(List<String> datas) {this.datas = datas;}//創建新View,被LayoutManager所調用@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,false);ViewHolder vh = new ViewHolder(view);return vh;}//將數據與界面進行綁定的操作@Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {final  int index = position;viewHolder.mTextView.setText(datas.get(position));}//獲取數據的數量@Overridepublic int getItemCount() {return datas.size();}//自定義的ViewHolder,持有每個Item的的所有界面元素public static class ViewHolder extends RecyclerView.ViewHolder {public TextView mTextView;public ViewHolder(View view){super(view);mTextView = (TextView) view.findViewById(R.id.textView);}}}

3、運行

寫完這些代碼這個例子既可以跑起來了。從例子也可以看出來,RecyclerView的用法并不比ListView復雜,反而更靈活好用,它將數據、排列方式、數據的展示方式都分割開來,因此可定制型,自定義的形式也非常多,非常靈活。

橫向布局

如果想要一個橫向的List只要設置LinearLayoutManager如下就行,注意要聲明mLayoutManager的類型是LinearLayoutManager而不是父類LayoutManager:

mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

??

Grid布局

如果想要一個Grid布局的列表,只要聲明LayoutManager為GridLayoutManager即可:

? mLayoutManager?=?new?GridLayoutManager(context,columNum);
? mRecyclerView.setLayoutManager(mLayoutManager);

注意,在Grid布局中也可以設置列表的Orientation屬性,來實現橫向和縱向的Grid布局。

瀑布流布局

        int span = 3;mLayoutManager = new StaggeredGridLayoutManager(span, StaggeredGridLayoutManager.VERTICAL);mRecyclerView.setLayoutManager(mLayoutManager);

上面介紹的是一個最最簡單的RecyclerView的使用方法,下面將介紹一些更高級的用法

第二節、RecyclerView的高級方法


當使用了一段時間的RecyclerView,發現為其每一項添加點擊事件并沒有ListView那么輕松,像ListView直接加個OnItemClickListener就行了。實際上我們不要把RecyclerView當做ListView的一個升級版,希望大家把他看做一個容器,同時里面包含了很多不同的Item,它們可以以不同方式排列組合,非常靈活,點擊方式你可以按照你自己的意愿進行實現。

本節主要講解如何為RecyclerView添加點擊事件, 并簡單介紹如何進行Item增加刪除。

添加點擊事件

上一節中我們講了如何使用RecyclerView的Adpater,其實我們會發現,Adapter是添加點擊事件一個很好的地方,里面是構造布局等View的主要場所,也是數據和布局進行綁定的地方。首先我們在Adapter中創建一個實現點擊接口,其中view是點擊的Item,data是我們的數據,因為我們想知道我點擊的區域部分的數據是什么,以便我下一步進行操作:

    public static interface OnRecyclerViewItemClickListener {void onItemClick(View view , <code class="js plain">DataModel</code> data, int position);}
注:DataModel,這個是一個Objcet ,可能是一個類,也可能是一個String;
定義完接口,添加接口和設置Adapter接口的方法:
private OnRecyclerViewItemClickListener mOnItemClickListener = null;public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {this.mOnItemClickListener = listener;
}
那么這個接口用在什么地方呢?如下代碼所示,我們為Adapter實現OnClickListener方法:
    @Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {final  int index = position;viewHolder.mTextView.setText(datas.get(position));//將數據保存在itemView的Tag中,以便點擊時進行獲取//將創建的View注冊點擊事件viewHolder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mOnItemClickListener != null) {//注意這里使用getTag方法獲取數據mOnItemClickListener.onItemClick(v, (String) datas.get(index), index);}}});}
做完這些事情,我們就可以在Activity或其他地方為RecyclerView添加項目點擊事件了,如在MainActivity中:
    mAdapter.setOnItemClickListener(new MyAdapter.OnRecyclerViewItemClickListener() {@Overridepublic void onItemClick(View view, String data,int position) {}});

完成了以上代碼就可以為RecyclerView添加項目點擊事件了,下面我們來看看RecyclerView如何添加和刪除數據并在界面上顯示。

添加刪除數據

以前在ListView當中,我們只要修改后數據用Adapter的notifyDatasetChange一下就可以更新界面。然而在RecyclerView中還有一些更高級的用法:

添加數據:

public void addItem(DataModel content, int position) {datas.add(position, content);notifyItemInserted(position); //Attention!
}
刪除數據:
    public void removeItem(int index) {datas.remove(index);notifyItemRemoved(index);//Attention!}
值得注意的是RecyclerView的添加刪除都是有默認的動畫效果的,如果沒有效果可以添加如下代碼:
mRecyclerView.setItemAnimator(newDefaultItemAnimator());
當然啦你也可以自己定義你自己的Animator,等我研究明白了也來講一講如何自定義這些效果~

Demo 下載 http://download.csdn.net/detail/q610098308/9326767

轉載于:https://www.cnblogs.com/sharecenter/p/5621021.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375312.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android下點亮LED

http://blog.csdn.net/cpj_phone/article/details/43562551轉載于:https://www.cnblogs.com/Ph-one/p/4276974.html

SEH處理異常

Win32為每個線程定義了一個線程信息塊,其中保存了線程的一些屬性數據,線程信息塊的屬性被定義為NT_TIB結構 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberDa…

Asp.net MVC 4新項目中創建area的后續操作

Asp.net MVC 4新項目中創建area后&#xff0c;往往HomeController與area的HomeController路由發生混淆&#xff0c;需要手工設置一些地方避免mvc無法識別默認路由的狀況。 無廢話具體步驟&#xff1a; 1. 檢查早Global.asax和\App_Start\RouteConfig.cs中是否已經自動添加了Are…

55-混沌操作法之我見:一、逆勢操作.(2015.2.7)

混沌操作法之我見&#xff1a;一、逆勢操作 首先談談&#xff0c;均線以及鱷魚線。單獨的市場價格表達了t時刻價格的個體情況&#xff0c;均線表達了一段時間內價格的綜合情況。t時刻的價格與均線的比較&#xff0c;表達了考慮了過去以及當前綜合價格的比較情況&#xff0c;即t…

SEH鏈和展開操作

每次我們定義了一個新的SEH異常處理回調函數,EXCEPTION_REGISTRATION結構的prev字段都被要求填寫上一個EXCEPTION_REGISTRATION結構的地址,隨著應用程序對模塊的調用一層層深入下去的時候,那么最后回調函數會形成一個SEH鏈 當程序中有多個線程在運行的時候,每個線程中都會存在各…

spring的基本知識

首先是回顧一下spring的基本知識 1、controller 控制器&#xff08;注入服務&#xff09; 2、service 服務&#xff08;注入dao&#xff09; 3、repository dao&#xff08;實現dao訪問&#xff09; 4、component &#xff08;把普通pojo實例化到spring容器中&#xff0c;相當于…

vs2010 EF4.0 訪問mysql

需要安裝mysql-connector-net-6.3.5 6.8.9的安裝完后在dbfirst里找不到對應的提供程序 鏈接字符串里需要 指定下編碼(如果不是gbk的話) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 變長參數的理解

C語言里面 提供了一些宏 可以使用變長參數 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判斷一個div的邊界是否超出另外一個div的邊界

摘要&#xff1a;本文簡單介紹jquery判斷一個div的邊界是否超出另外一個div的邊界&#xff0c;如果超出邊界做出相應的處理。 1、實現效果 判斷前 判斷后 2、實現思路 實現類似的判斷&#xff0c;主要是獲取兩個div在瀏覽器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式數據

//數據定義&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一條json數據&#xff1a;令str為[{"name":"21001","password":"21001"}] User usernew User()…

進程的細節

從今天開始,重新學習一些細節性質的東西 一.在VS開發環境中,應用程序的入口點: _tWinMain WinMainCRTStartup _tWinMain wWinMainCRTStartup _tmain mainCRTStartup _tmain wmainCRTStartup 相關的介…

maven環境快速搭建(轉)

最近&#xff0c;開發中要用到maven&#xff0c;所以對maven進行了簡單的學習。因為有個maven高手在身邊&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我這里算是自我總結吧。關于maven是什么東東&#xff0c;請參考其它文章。 ----------------準備工作-------------…

cocos2d-x3.0 相對布局(一)

2dx相對布局和Android非常類似。假設前完成Android它應該是easy入門。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

管理員以標準權限運行時

在XP時代,大多數用戶都用一個管理員(administrator)帳號來登錄Windows 利用這個賬戶,用戶幾乎能沒有任何限制的訪問重要的系統資源,因為該賬戶被授予了很高的權限,一旦用這個帳號登錄了xp以及xp之前的操作系統,Windows操作系統就會創建一個安全令牌(security token).每當有代碼…

HDU 4791 amp; ZOJ 3726 Alice#39;s Print Service (數學 打表)

題目鏈接&#xff1a; HDU:http://acm.hdu.edu.cn/showproblem.php?pid4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId5072 Problem DescriptionAlice is providing print service, while the pricing doesnt seem to be reasonable, so people using…

奪命雷公狗---ECSHOP---08---商品頁的拇改成星星

<strong>用戶評價&#xff1a;</strong>{*---------商品評價星星開始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品評價星星結束-------*} 這里主要是要有星…

文件指針

一.移動文件指針 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移動的模式 FILE_BEGIN 不管文件處于什么地方,總是從文件的頭部開始移動,這時的位置參數相當于指定了一個絕對位置 FILE_CURRENT 從當前的文件指針處開始移…

見證下的自我變化-2014全年總結

又是一年總結季&#xff0c;回過頭看看看自己的成長&#xff0c;心里真的是滿滿的喜悅之情…… 一年前自己的總結博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的總結博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux學習篇】This virtual machine is configured for 64-bit guest operating systems.……

在學習Linux的基本操作的時候&#xff0c;安裝虛擬環境則提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各種拒絕的心理&#xff0c;所以屏蔽了這個錯誤&#xff0c;但是屏蔽永遠也解決不了問題的&#xff0c;所以自己則嘗試百度…

圖解SSIS監視文件夾并自動導入數據

圖解SSIS監視文件夾并自動導入數據 原文:圖解SSIS監視文件夾并自動導入數據 演示案例&#xff1a;讓系統自動監視文件夾&#xff0c;并把文件夾下面的excel文件導入到sql中&#xff0c;之后清空目錄。這個過程以往都需要寫程序來實現或者定時執行&#xff0c;現在可以用ssis來訂…