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 排列单元格网格时尚。