Xamarin.Android RecyclerView基础

示例

这是使用的示例Android Support Library V7 RecyclerView。通常建议使用支持库,因为它们提供了新功能的向后兼容版本,提供了框架中未包含的有用的UI元素,并提供了可用于应用程序的一系列实用程序。

要获取RecyclerView,我们将安装必要的Nuget软件包。首先,我们将搜索v7 recyclerview。向下滚动直到看到Xamarin Android Support Library - v7 RecyclerView。选择它,然后单击“添加软件包”

或者,Android Support Library V7 RecyclerView可以作为Xamarin组件使用。为了添加组件,请Components在Solution Explorer中的Android项目中右键单击,然后单击Get More Components。

在出现的“组件存储”窗口中,搜索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查找并存储视图引用。视图持有者还有助于检测项目视图的点击。

这是适配器类的基本示例

public class MyAdapter : RecyclerView.Adapter
{
    string [] items;

    public MyAdapter (string [] data)
    {
        items = data;
    }

    // 创建新视图(由布局管理器调用)
    public overrideRecyclerView.ViewHolderOnCreateViewHolder (ViewGroup parent, int viewType)
    {   
        // 设置视图的大小,边距,填充和布局参数
        var tv = new TextView (parent.Context);
       tv.SetWidth(200);
       tv.Text= "";

        var vh = new MyViewHolder (tv);
        return vh;
    } 

    // 替换视图的内容(由布局管理器调用)
    public override void OnBindViewHolder (RecyclerView.ViewHolder viewHolder, int position)
    {
        var item = items [position];

        // 用该元素替换视图的内容
        var holder = viewHolder as MyViewHolder;
        holder.TextView.Text = items[position];
    }

    public override int ItemCount {
        get {
            return items.Length;
        }
    }
}

在该OnCreateViewHolder方法中,我们首先为View充气,并创建ViewHolder类的实例。该实例必须返回。当需要新的ViewHolder实例时,适配器将调用此方法。不会为每个单元格调用此方法。一旦RecyclerView具有足够的单元格来填充视图,它将重新使用从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);

    // 插入线性布局管理器:
    var layoutManager = new LinearLayoutManager (this) { Orientation =LinearLayoutManager.Vertical};
   mRecyclerView.SetLayoutManager(layoutManager);
   mRecyclerView.HasFixedSize= true;

    var recyclerViewData = GetData();
    // 插入我的适配器:
    mAdapter = new MyAdapter (recyclerViewData);
   mRecyclerView.SetAdapter(mAdapter);
}

string[] GetData()
{ 
     string[] data;
     .
     .
     .
     return data;
}

LayoutManager类负责在RecyclerView中测量和放置项目视图,并确定何时回收用户不再可见的项目视图的策略。在之前RecyclerView,我们必须ListView像在垂直滚动列表中那样使用单元格排列,并在GridView二维可滚动网格中显示项目。但是现在我们可以通过设置不同的LayoutManger来使用RecyclerView实现这两个目标。LinearLayoutManager像在ListView中一样GridLayoutManager排列单元格,并以Grid方式排列单元格。