RecyclerView 基礎知識
這是使用 Android Support Library V7 RecyclerView
的一個例子。通常建議使用支援庫,因為它們提供了向後相容的新功能版本,提供了未包含在框架中的有用 UI 元素,並提供了應用程式可以使用的一系列實用程式。
要獲得 RecyclerView
,我們將安裝必要的 Nuget 包。首先,我們將搜尋 v7 recyclerview
。向下滾動直到我們看到 Xamarin Android Support Library - v7 RecyclerView
。選擇它,然後單擊新增包。
或者,Android Support Library V7 RecyclerView
可作為 Xamarin 組分使用。要新增元件,請右鍵單擊 Solution explorer 中 Android 專案中的 Components
,然後單擊 Get More Components
。
在出現的 Component Store 視窗中,搜尋 RecyclerView。在搜尋列表中,選擇 Android Support Library V7 RecyclerView
。然後點選 Add to App
。該元件將新增到專案中。
下一步是將 RecyclerView 新增到頁面。在 axml
(佈局)檔案中,我們可以新增 RecyclerView
,如下所示。
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />
RecyclerView 需要至少設定兩個輔助類才能實現基本標準實現:Adapter
和 ViewHolder
。Adapter
使專案佈局膨脹,並將資料繫結到 RecyclerView 中顯示的檢視。ViewHolder 查詢並儲存檢視引用。檢視持有者還有助於檢測專案檢視點選。
這是 Adapter Class 的一個基本示例
public class MyAdapter : RecyclerView.Adapter
{
string [] items;
public MyAdapter (string [] data)
{
items = data;
}
// Create new views (invoked by the layout manager)
public override RecyclerView.ViewHolder OnCreateViewHolder (ViewGroup parent, int viewType)
{
// set the view's size, margins, paddings and layout parameters
var tv = new TextView (parent.Context);
tv.SetWidth (200);
tv.Text = "";
var vh = new MyViewHolder (tv);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
public override void OnBindViewHolder (RecyclerView.ViewHolder viewHolder, int position)
{
var item = items [position];
// Replace the contents of the view with that element
var holder = viewHolder as MyViewHolder;
holder.TextView.Text = items[position];
}
public override int ItemCount {
get {
return items.Length;
}
}
}
在 OnCreateViewHolder
方法中,我們首先膨脹一個 View 並建立一個 ViewHolder 類的例項。必須返回此例項。當需要 ViewHolder 的新例項時,介面卡會呼叫此方法。不會為每個單元呼叫此方法。一旦 RecyclerView 有足夠的單元格來填充 View,它將重新使用從 View 中滾出的舊單元格以獲取更多單元格。
介面卡呼叫 OnBindViewHolder
回撥以顯示指定位置的資料。此方法應更新 itemView 的內容以反映給定位置的專案。
由於單元格只包含一個 TextView
,我們可以使用如下的簡單 ViewHolder。
public class MyViewHolder : RecyclerView.ViewHolder
{
public TextView TextView { get; set; }
public MyViewHolder (TextView v) : base (v)
{
TextView = v;
}
}
下一步是在 Activity
中連線東西。
RecyclerView mRecyclerView;
MyAdapter mAdapter;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.Main);
mRecyclerView = FindViewById<RecyclerView> (Resource.Id.recyclerView);
// Plug in the linear layout manager:
var layoutManager = new LinearLayoutManager (this) { Orientation = LinearLayoutManager.Vertical };
mRecyclerView.SetLayoutManager (layoutManager);
mRecyclerView.HasFixedSize = true;
var recyclerViewData = GetData();
// Plug in my adapter:
mAdapter = new MyAdapter (recyclerViewData);
mRecyclerView.SetAdapter (mAdapter);
}
string[] GetData()
{
string[] data;
.
.
.
return data;
}
LayoutManager 類負責在 RecyclerView 中測量和定位專案檢視,以及確定何時回收使用者不再可見的專案檢視的策略。在 RecyclerView
之前,我們不得不使用 ListView
來安排單元格,如同在垂直滾動列表中一樣,並且 GridView
可以在二維可滾動網格中顯示專案。但現在我們可以通過設定不同的 LayoutManger 來實現 RecyclerView。LinearLayoutManager
按照 ListView 排列單元格,GridLayoutManager
排列單元格網格時尚。