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