RecyclerView 基礎知識

這是使用 Android Support Library V7 RecyclerView 的一個例子。通常建議使用支援庫,因為它們提供了向後相容的新功能版本,提供了未包含在框架中的有用 UI 元素,並提供了應用程式可以使用的一系列實用程式。

要獲得 RecyclerView,我們將安裝必要的 Nuget 包。首先,我們將搜尋 v7 recyclerview。向下滾動直到我們看到 Xamarin Android Support Library - v7 RecyclerView。選擇它,然後單擊新增包

StackOverflow 文件

或者,Android Support Library V7 RecyclerView 可作為 Xamarin 組分使用。要新增元件,請右鍵單擊 Solution explorer 中 Android 專案中的 Components,然後單擊 Get More Components

StackOverflow 文件

在出現的 Component Store 視窗中,搜尋 RecyclerView。在搜尋列表中,選擇 Android Support Library V7 RecyclerView。然後點選 Add to App。該元件將新增到專案中。

StackOverflow 文件

下一步是將 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 需要至少設定兩個輔助類才能實現基本標準實現:AdapterViewHolderAdapter 使專案佈局膨脹,並將資料繫結到 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 排列單元格網格時尚。