RecyclerView的基礎用法

 

爲了讓RecyclerView能夠在全部的Android版本中都能使用,Android開發團隊將RecyclerView定義在support.v7包當中。在使用該控件時須要打開當前Modile的build.gradle文件,而後在dependencies節點中添加依賴庫的代碼。具體代碼以下:

compile 'com.android.support:recyclerview-v7:插入版本號'

 

添加完成之後須要單擊右上角的Sync Now進行同步。同步完成後能夠在佈局文件中添加RecyclerView控件,語法格式以下:java

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

 

控制RecyclerView須要一些經常使用的方法,具體方法以下:android

◆ setLayoutManager:設置列表項的佈局管理器,LinearLayoutManager爲線性佈局管理器、GridLayoutManager爲網格佈局管理器、StaggeredGridLayoutManager爲瀑布流網格佈局管理器。數組

◆ setItemAnimator:設置列表項增長或者是刪除時的動畫,能夠使用關鍵字new建立 DefaultItemAnimator()對象實現系統默認的動畫效果。app

◆ addItemDecoration:添加列表項分割線。ide

◆ addOnItemTouchListener:添加列表項的觸摸監聽器。工具

◆ removeOnItemTouchListener:移除列表項的觸摸監聽器。佈局

◆ setAdapter:設置列表項的適配器,使用RecyclerView.Adapter。gradle

RecyclerView.Adapter是爲RecyclerView所單獨設計的適配器類,RecyclerView.Adapter的相關方法以下:動畫

◆ getItemCount:獲取列表項的數目。ui

◆ onBindViewHolder:綁定列表項中所顯示的數據。

◆ onCreateViewHolder:在該方法中能夠加載列表item(子項)中的佈局文件。

下面經過一個具體的實例演示RecyclerView垂直列表的具體應用。

 

實例 模擬QQ消息列表

在Android Studio中建立Module,名稱爲「QQMessageList」,具體步驟以下:

(1)打開build.gradle(Module: QQMessageList)文件,而後在該文件中的dependencies節點中添加依賴庫的代碼。

(2)修改新建Module的res/layout目錄下的佈局文件activity_main.xml,將默認添加的佈局管理器修改成相對佈局管理器並將TextView組件刪除,而後添加1個RecyclerView組件用於顯示消息列表。具體代碼以下:

01   <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 03 xmlns:app="http://schemas.android.com/apk/res-auto" 04 xmlns:tools="http://schemas.android.com/tools" 05 android:layout_width="match_parent" 06 android:layout_height="match_parent" 07 tools:context="com.mingrisoft.MainActivity"> 08 <!--列表控件--> 09 <android.support.v7.widget.RecyclerView 10 android:id="@+id/recyclerview" 11 android:background="#EEEEEE" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:orientation="vertical" 15 /> 16 </RelativeLayout>

 

(3)在res/layout目錄中建立1個名稱爲layout_item.xml的佈局文件,將默認添加的佈局管理器修改成相對佈局管理器,首先添加1個ImageView組件用於顯示頭像的圖標,而後添加1個垂直線性佈局管理器,在該佈局管理器中添加2個TextView組件分別用於顯示名稱與文字消息。具體代碼以下:

01   <?xml version="1.0" encoding="utf-8"?> 02 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 03 android:layout_width="match_parent" 04 android:layout_height="50dp" 05 android:layout_marginBottom="1dp" 06 android:background="@android:color/white" 07 android:gravity="center_vertical"> 08 <!--圖標--> 09 <ImageView 10 android:id="@+id/img" 11 android:layout_width="50dp" 12 android:layout_height="50dp" 13 android:layout_alignParentLeft="true" 14 android:layout_alignParentStart="true" 15 android:layout_alignParentTop="true" /> 16 <LinearLayout 17 android:layout_width="wrap_content" 18 android:layout_height="match_parent" 19 android:layout_toRightOf="@+id/img" 20 android:gravity="center_vertical" 21 android:orientation="vertical"> 22 <!--名稱--> 23 <TextView 24 android:id="@+id/name" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:layout_marginLeft="20dp" 28 android:textColor="#000000" 29 android:textSize="15dp" /> 30 <!--消息--> 31 <TextView 32 android:id="@+id/info" 33 android:layout_width="match_parent" 34 android:layout_height="wrap_content" 35 android:layout_marginLeft="20dp" 36 android:layout_marginRight="15dp" 37 android:singleLine="true" 38 android:textSize="10dp" /> 39 </LinearLayout> 40 </RelativeLayout>

 

(4)在res/values目錄中的strings.xml字符串資源文件內添加名字與文字消息,用於顯示在列表當中。

(5)在com.mingrisoft包中建立1個名稱爲Adapter的Java類,首先在該類中建立1個名稱爲MyViewHolder的內部類並讓該類繼承自RecyclerView.ViewHolder,在該內部類中獲取列表中用於顯示名稱、頭像圖標與文字信息的組件。而後讓Adapter類繼承自RecyclerView.Adapter<Adapter.MyViewHolder>而且實現相對應的方法。具體代碼以下:

01   public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> { 02 @Override 03       public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 04           return null; 05 } 06 @Override 07       public void onBindViewHolder(MyViewHolder holder, int position) { 08 } 09 @Override 10       public int getItemCount() { 11           return 0; 12 } 13       class MyViewHolder extends RecyclerView.ViewHolder { 14           public TextView name, info;              //編號文字

15           public ImageView img;                     //圖標

16    

17           //獲取相關控件

18           public MyViewHolder(View itemView) { 19               super(itemView); 20               name = (TextView) itemView.findViewById(R.id.name); 21               info = (TextView) itemView.findViewById(R.id.info); 22               img = (ImageView) itemView.findViewById(R.id.img); 23 } 24 } 25   }

 

(6)建立3個int類型的數組分別用於保存頭像的圖標資源、名字、文字信息,而後建立3個ArrayList集合分別用於保存數組中的資源文件,最後建立1個Adapter構造方法,在該方法中設置菜單行數與行內圖標、名稱與文字信息具體代碼以下:

01   //圖標數組

02   private int[] icons = { 03 R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3, 04 R.mipmap.icon_4, R.mipmap.icon_5, R.mipmap.icon_6, 05 R.mipmap.icon_7, R.mipmap.icon_8, R.mipmap.icon_9, 06 R.mipmap.icon_10, R.mipmap.icon_11 07 }; 08   //名字數組,引用資源文件中的文字

09   private int[] names = { 10 R.string.name1, R.string.name2, R.string.name3, 11 R.string.name4, R.string.name5, R.string.name6, 12 R.string.name7, R.string.name8, R.string.name9, 13 R.string.name10, R.string.name11 14 }; 15   //信息數組

16   private int[] infos = { 17 R.string.info1, R.string.info2, R.string.info3, 18 R.string.info4, R.string.info5, R.string.info6, 19 R.string.info7, R.string.info8, R.string.info9, 20 R.string.info10, R.string.info11 21 }; 22   private Context lContext;   //上下文

23   private List<Integer> listIcon = new ArrayList<Integer>();   //圖標集合

24   private List<Integer> listName = new ArrayList<Integer>();   //名稱集合

25   private List<Integer> listInfo = new ArrayList<Integer>();   //信息集合

26   public Adapter(Context context) { 27       lContext = context; 28       //設置菜單行數與行內圖標、名稱、信息

29       for (int i = 0; i < 11; i++) { 30 listIcon.add(icons[i]); 31 listName.add(names[i]); 32 listInfo.add(infos[i]); 33 } 34   }

 

(7)重寫MyViewHolder onCreateViewHolder()方法,在該方法中實現獲取列表中,每行item的佈局文件。修改後代碼以下:

01 @Override 02   public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) { 03       //獲取列表中,每行的佈局文件

04       View view = LayoutInflater.from(lContext).inflate(R.layout.layout_item, arg0, false); 05       MyViewHolder holder = new MyViewHolder(view);           // 
06       return holder; 07   }

 

(8)重寫onBindViewHolder()方法,在該方法中設置列表菜單中item(子項)所顯示的內容。修改後代碼以下:

01 @Override 02   public void onBindViewHolder(final MyViewHolder holder, int position) { 03       //設置圖標

04 holder.img.setBackgroundResource(listIcon.get(position)); 05       //設置名稱

06 holder.name.setText(listName.get(position)); 07       //設置信息

08 holder.info.setText(listInfo.get(position)); 09   }

 

(9)重寫getItemCount()方法,在該方法中實現返回數據集中的項目總數。修改後代碼以下:

01 @Override 02   public int getItemCount() { 03       return listIcon.size(); 04   }

 

(10)打開主活動MainActivity.java文件,定義所須要的全局變量,在onCreate()方法中首先獲取RecyclerView組件,而後爲其設置列表佈局管理器,最後爲其設置適配器。具體代碼以下:

01   public class MainActivity extends AppCompatActivity { 02       private RecyclerView lRecyclerView;     //列表控件

03       private Adapter lAdapter;                //適配器

04 @Override 05       protected void onCreate(Bundle savedInstanceState) { 06           super.onCreate(savedInstanceState); 07 setContentView(R.layout.activity_main); 08           //獲取列表控件

09           lRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); 10           //設置列表佈局管理

11           lRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 12           //設置適配器

13           lRecyclerView.setAdapter(lAdapter = new Adapter(this)); 14 } 15   }

 

(10)在工具欄中,找到下拉列表框,而後單擊要運行的應用(這裏爲QQMessageList),再單擊右側的運行按鈕,運行效果如圖27.27所示。

 

圖27.27  模擬QQ消息列表                  

 

本文來自明日科技即將出版的《Android開發詳解》,轉載請註明出處!!!

相關文章
相關標籤/搜索